Назад | Перейти на главную страницу

Как изменить поле «От:» для писем из Cron?

Я использую удаленный SMTP через nullmailer, и для него требуется установить в поле From конкретное имя, но cron установил его как root@my.sweet.server.com.

Как я мог поменять его на что-то вроде me@ya.ru?

Современные версии cron принимают «MAILFROM = ...» в формате crontab. Предлагаю вам попробовать "man 5 crontab". Если в нем упоминается MAILFROM, ваша версия должна его поддерживать. Фраза, которую следует искать, находится ближе к концу абзаца, посвященного MAILTO, и должна быть примерно такой:

If MAILFROM is defined (and non-empty), it will be used as the envelope sender address, otherwise, ''root'' will be used.

Я не думаю, что вы можете изменить адрес FROM (кто-то должен добавить опцию MAILFROM).

Вы можете сделать что-то подобное для достижения аналогичного результата:

* * * * * /path/to/script 2>&1 | mail -s "Output of /path/to/script" toaddress@example.com -- -r "fromaddress@example.com" -F"Full Name of sender"

Весь вывод передается команде mail, поэтому переменная MAILTO вообще не используется.

Необходимо указать адрес, но вы можете использовать переменную $ MAILTO. - устанавливает остальные параметры как параметры sendmail, поэтому вы можете использовать параметры -r и -F.

-s это предмет

-r - это ответный адрес

-F - полное имя отправителя (чтобы оно выглядело хорошо в почтовых клиентах)

/ etc / mailname содержит часть имени домена в адресе FROM. Если / etc / mailname содержит somecompany.com, тогда cron, запущенный для root, будет иметь отправителя как root@somecompany.com

Вы можете установить nullmailer с адреса через переменные среды или командную строку. Аргументы командной строки: -f и -F для адреса отправителя и полного имени соответственно.

Обычно вы можете установить переменные среды в crontab.

NULLMAILER_USER=webmaster
NULLMAILER_HOST=host.example.com
NULLMAILER_NAME="Mr Cron"

5 0 * * * /usr/local/bin/daily.sh

Для меня самый простой способ изменить адрес отправителя в системе - это создать ~/.mailrc файл с таким содержимым:

set name="My Full Name"
set from="myrealemail@example.com"

Любой из mail команды, которые выполняются от имени моего пользователя, теперь используют эти настройки.

Вот несколько вещей, которые вы можете применить, чтобы изменить свой домен отправителя:

Edit this file: /etc/mailname and change to:
    example.org
sudo postconf -e 'myhostname= example.org'
sudo systemctl restart postfix

См. Этот вопрос при использовании Exim:

exim: перепишите заголовок "From" в конверт "FROM"

Он должен установить адрес «От» на адрес владельца cronjob. Вы можете заменить $header_from: на свой собственный адрес, если вы хотите жестко закодировать его для чего-то другого.

Другой простой вариант - использовать mutt,

  • создайте .muttrc в домашнем каталоге пользователя, который запускает cron, со следующими

    set realname = "Joe User" set from = "user @ host" set use_from = yes

  • Запустите сценарий с командой mutt или передайте команду cron в команду mutt, чтобы отправить электронное письмо.

Перед отправкой и электронной почтой Mutt установит заголовок From из файла .muttrc.

Мне пришлось изменить /etc/mail/sendmail.cf и /etc/mail/sendmail.mc, так как /etc/mailname не использовался. Однако он изменяет только домен from, а не пользователя.

В моем случае я выполнил следующие шаги, чтобы решить проблему:

  1. отредактировал файл /etc/postfix/main.cf

установить значение этой переменной:

mydomain = my-domain-name.xxx

раскомментируйте эту строку:

#myorigin = $ myhostname

  1. перезапустите postfix с помощью этой команды; systemctl перезапустить постфикс

Это старый вопрос, но он остается актуальным. Для Debian (и, возможно, других) нет простого решения, потому что MAILFROM по-прежнему не поддерживается. Это беспокоило меня в течение некоторого времени, так как я получаю почту, созданную cron, с нескольких разных серверов. Но большинство из них находится на поддоменах того же домена, и большинство поддоменов не поддерживают почту. Следовательно, я вынужден настроить postfix для использования домена в качестве источника, и вся почта, похоже, пришла из одного места.

Я наконец добрался до решения, адаптировав cronic для создания mycronic. Это почти то же самое, что и cronic, за исключением того, что он отправляет свой вывод прямо на почту и подавляет весь вывод в cron. Предполагается, что сервер настроен так, чтобы давать правильные ответы на различные запросы к имени хоста. Например:

hostname -f => webserver.example.com
hostname -d => example.com
hostname => webserver

Это достигается за счет наличия только веб-сервера в / etc / hostname и наличия строки в / etc / hosts:

127.0.0.1     webserver.example.com    webserver

Postfix настроен так, чтобы myorigin был установлен на mydomain. Сценарий также полагается на тот факт, что у меня настроен постфикс для перенаправления root@example.com в мой собственный почтовый ящик. Фактический сценарий:

#!/bin/bash

# MyCronic v1 - cron job report wrapper to send results directly to mail
# Copyright 2020 Martin Brampton. No rights reserved, whatsoever.
# Based on Cronic v3 - cron job report wrapper
# Copyright 2007-2016 Chuck Houpt. No rights reserved, whatsoever.
# Public Domain CC0: http://creativecommons.org/publicdomain/zero/1.0/

set -eu

DOMAIN=`hostname -d`
FQDN=`hostname -f`

RECIPIENT="root@$DOMAIN"

MAILER=`which mail`

TMP=$(mktemp -d)
OUT=$TMP/cronic.out
ERR=$TMP/cronic.err
TRACE=$TMP/cronic.trace

set +e
"$@" >$OUT 2>$TRACE

RESULT=$?
set -e

PATTERN="^${PS4:0:1}\\+${PS4:1}"
if grep -aq "$PATTERN" $TRACE; then
    ! grep -av "$PATTERN" $TRACE > $ERR
else
    ERR=$TRACE
fi

if [ $RESULT -ne 0 -o -s "$ERR" ]; then
        mailtext="
My cronic detected failure or error output for the command:
$@

RESULT CODE: $RESULT

ERROR OUTPUT:
$(< $ERR)

STANDARD OUTPUT:
$(< $OUT)
"

        if [ $TRACE != $ERR ]; then
        $mailtext="
$mailtext

TRACE-ERROR OUTPUT:
$(< $TRACE)
"
        fi

        $MAILER -s "My Cronic detected a failure on $FQDN" -aFrom:MyCronic\<$HOSTNAME@$DOMAIN\> $RECIPIENT <<< "$mailtext"

fi

rm -rf "$TMP"

Возможно, вам придется немного адаптировать его для своих целей, но он должен работать в большинстве ситуаций с минимальными изменениями.

он отправляется по почте от user @ domain - пользователь - это имя для входа, под которым работает cron, поэтому вам нужно будет создать пользователя «я» и запустить задание cron от имени этого пользователя.

Затем, чтобы изменить домен, есть разные возможности - возможно, вам нужно изменить запись файла hosts (или, как на моей машине, когда я настраивал это - ящик ubuntu) - измените / etc / mailname - быть доменом, из которого вы хотите, чтобы он исходил.