[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [msmtp-users] From Header for Cron Jobs



Paul,

Thanks for the suggestion, i've been playing around with procmail but this might work for me.

if anyone is interested I did ultimately get to the bottom of this.  The reason the Cron emails say they are coming from root, is that the from header is actually hard coded into Cron.  This has been there at least since the last build by Paul Vixie, at looks to have never been changed.  SSMTP must overwrite the header, where MSMTP does not.

thanks again,
Ryan


-----Original Message-----
>From: Paul Donohue <msmtp@...359...>
>Sent: Jul 8, 2017 10:12 AM
>To: ryan <andocromn@...31...>
>Cc: msmtp-users@lists.sourceforge.net
>Subject: Re: [msmtp-users] From Header for Cron Jobs
>
>On Wed, Jul 05, 2017 at 04:13:38PM -0400, ryan wrote:
>> I have recently switched from SSMTP to MSMTP because of problem with SSMTP and lack of support for it.  Since switching to MSMTP any emails generated as a result of a cron job show as from just "root" instead of {user}@{fqdn}.domain.com.
>> 
>> I have done some troubleshooting and it looks like MSMTP is properly setting the MAIL FROM: in the SMTP connection, however there is a "From" header that says "root (Cron Deamon)" which is possibly not getting changed properly 
>> 
>> If anyone has a suggestion on how to remedy this that would be great.  If not perhaps a feature request to fix the headers as well as the SMTP MAIL FROM
>> 
>> thanks
>
>My solution for this is:
>cp -a /usr/sbin/sendmail /usr/sbin/sendmail.real
>cat <<END >/usr/sbin/sendmail
>#!/bin/bash
>
>LogOutput='y'
>EmailOutput='y'
>MailFrom='hostname-cron@...45...'
># Multiple addresses may be separated by commas
>MailTo='hostname-cron@...45...'
># If 'n', $MailTo is prepended to the cron MAILTO
>ReplaceMailTo='n'
># If 'y', unqualified addresses are removed from the cron MAILTO before appending
>DropUnqualifiedTo='y'
>
>
>
># Copy arguments to an array
>Args=("$@")
>
># Determine whether we were called by cron
>Cron='n'
>for ArgNum in "${!Args[@]}" ; do
>  if [ "${Args[$ArgNum]}" = '-FCronDaemon' ] ; then
>    Cron='y'
>    break
>  fi
>done
>
># If we were not called by cron, simply pass through to the real sendmail
>if [ "$Cron" = 'n' ] ; then
>  /usr/sbin/sendmail.real "$@"
>  exit $?
>fi
>
># If we get here, we were called by cron
>Status=0
>
># Read STDIN into an environment variable so we can both log and email it
>Input="$(cat)"
>
># Log the cron job's output (everything after the message headers)
>if [ "$LogOutput" = 'y' ] ; then
>  echo "$Input" | perl -0777 -n -e '@i=split(/\n\n/, $_, 2); print($i[1]);' | logger -p cron.warn --skip-empty
>  Status=$?
>fi
>
>if [ "$EmailOutput" = 'y' ] ; then
>  # Replace the From addresses
>  if [ -n "$MailFrom" ] ; then
>    Args[$ArgNum]="-F$MailFrom"
>    Input="$(echo "$Input" | perl -0777 -p -e "\$f='$MailFrom';" -e 's/^From: root .*$/From: $f/m')"
>  fi
>
>  # Modify the To addresses
>  if [ -n "$MailTo" ] ; then
>    if [ "$ReplaceMailTo" = 'n' ] ; then
>      CronMailTo="${Args[-1]}"
>      if [ "$DropUnqualifiedTo" = 'y' ] ; then
>        CronMailTo="$(echo "$CronMailTo" | perl -n -e 'print join(",", grep(/@/, split(/,/)));')"
>      fi
>      [ -n "$CronMailTo" ] && MailTo="$MailTo,$CronMailTo"
>    fi
>    Args[-1]="$MailTo"
>    Input="$(echo "$Input" | perl -0777 -p -e "\$t='$MailTo';" -e 's/^To: .*$/To: $t/m')"
>  fi
>
>  # Send the email
>  echo "$Input" | /usr/sbin/sendmail.real "${Args[@]}"
>  Status=$?
>fi
>
>exit $Status
>END