47

I use remote SMTP via nullmailer and it requires set From field to the specific name, but cron set it as [email protected].

How could I change it to something like [email protected]?

2

13 Answers 13

18

I don't think you can change the FROM address, (someone should add a MAILFROM option).

You can do something like this though to achieve a similar result:

* * * * * /path/to/script 2>&1 | mail -s "Output of /path/to/script" [email protected] -- -r "[email protected]" -F"Full Name of sender"

All output is piped to the mail command so the MAILTO variable isn't used at all.

The to address would need to be set but you may be able to use $MAILTO variable. The -- sets the rest of the options to be sendmail options so you can use the -r and and -F options.

-s is the subject

-r is the reply address

-F is the Full name of the sender (makes it look nice in email clients)

2
61

Modern versions of cron do accept "MAILFROM=..." in the crontab format. I suggest that you try "man 5 crontab". If it mentions MAILFROM, your version should support it. The phrase to look for is towards the end of the paragraph discussing MAILTO, and should be something like this:

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

9
  • 12
    Where "modern" means what? This is not supported by the most recent version of cron in Debian unstable (3.0pl1-124) from what I can see in the changelog or the documentation.
    – Flimzy
    Dec 24, 2012 at 20:56
  • 4
    Unfortunately, Ubuntu's cron (at least as of 14.04 LTS) has no mention of MAILFROM in man 5 crontab. Nov 13, 2014 at 17:18
  • 4
    You can install cronie to replace cron on Debian/Ubuntu. Ta-daa: MAILFROM exists: Sep 16, 2015 at 14:02
  • 12
    MAILFROM is still missing in Ubuntu 20.04.
    – FGM
    Dec 4, 2020 at 17:03
  • 14
    MAILFROM finally exists in Ubuntu 22.04. 10 years later. Apr 26, 2022 at 15:56
15

/etc/mailname contains the domain name part of the FROM address. If /etc/mailname contains 'somecompany.com' then cron running for root would have sender as [email protected]

1
  • 4
    Some info here: wiki.debian.org/EtcMailName - does not say if nullmailer use it. I use sendmail and it did not seem to work for it.
    – Zitrax
    Jan 30, 2015 at 14:24
6

For me, the easiest way to change the from address on a system, is to create a ~/.mailrc file with contents like this:

set name="My Full Name"
set from="[email protected]"

Any of the mail commands that run as my user, now use these settings.

0
5

You can set the nullmailer from address via environment variables or command line. The command line arguments are -f and -F for sender address and full name respectively.

Usually you can set environment variables in the crontab.

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

5 0 * * * /usr/local/bin/daily.sh
2
  • He's asking about FROM: not TO:
    – Kimvais
    Mar 10, 2010 at 12:15
  • 1
    Hm, this does not work for unknown reason. Mar 15, 2010 at 6:46
2

Here are few things you can apply to change your sender domain:

Edit this file: /etc/mailname and change to:
    example.org
sudo postconf -e 'myhostname= example.org'
sudo systemctl restart postfix
1
  • 1
    Wondering since ages where was he getting it from Nov 24, 2022 at 6:47
1

This is an old question, but it remains valid. There is no easy solution for Debian (and possibly others) because MAILFROM remains unsupported. This has bugged me for some time, as I receive cron generated mail from a number of different servers. But most of them are on subdomains of the same domain, and most of the subdomains do not support mail. Hence I'm forced to configure postfix to use the domain as the origin, and all the mail seems to have come from the same place.

I've finally got round to creating a solution, by adapting cronic to create mycronic. This does much the same as cronic, except it sends its output directly to mail and suppresses all output to cron. It assumes that the server is configured so as to give correct answers to different requests to hostname. For example:

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

This is achieved by having just webserver in /etc/hostname and having a line in /etc/hosts:

127.0.0.1     webserver.example.com    webserver

Postfix is configured to have myorigin set to mydomain. The script also relies on the fact that I have postfix configured to redirect [email protected] to my own mail box. The actual script is:

#!/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"

You may need to adapt it a bit to suit your own purposes, but it should work for most situations with minimal alteration.

0

See this question if using Exim:

exim: Rewrite "From" header to envelope "FROM"

It should set the "From" address to the cronjob owner's. You can replace $header_from: with your custom address if you'd like to hard-code it to something else.

0

Another simple alternate is to use mutt,

  • create a .muttrc in the home directory of the user that runs cron with the following

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

  • Run a script with mutt command in it or pipe the cron command to mutt from to send email.

Before mutt sends and email, it will set the From header from the .muttrc file.

0

I had to change /etc/mail/sendmail.cf and /etc/mail/sendmail.mc, because /etc/mailname wasn't used. It only changes the from domain though, not the user.

1
  • 1
    We are exactly in the case of xkcd.com/979 What did you do exactly?
    – Bibelo
    Jun 23, 2022 at 5:18
0

In my case, I followed these steps to resolve the issue:

  1. edited the file /etc/postfix/main.cf

set the value of this variable:

mydomain = my-domain-name.xxx

uncomment this line:

#myorigin = $myhostname

  1. restart postfix using this command; systemctl restart postfix
0

An alternative solution is to use msmtp-mta as system mailer with the following configuration in order to override the From header:

from [email protected]
set_from_header on
1
-1

it is mailed from the user@domain -- the user is the login name the cron is running under -- so you'd have to create a user 'me' -- and run the cron job as that user.

Then to change the domain, there are different possibilities -- it could be that you need to change the hosts file entry (or, as on my machine, when I was configuring this -- an ubuntu box) -- change /etc/mailname -- to be the domain you want it to come from.

1
  • 2
    This isn't actually true--at least not in many cases. On my system, for instance, it is only sent from 'user', not 'user@domain'. It is the responsibility of the MTA to add the local domain name. This is significant in some cases (such as mine) where my MTA (for reasons too complicated and boring to describe) is not adding the domain name.
    – Flimzy
    Dec 24, 2012 at 21:00

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .