28

I am trying to invoke sendmail via PHP's mail function by the following code:

$to      = 'blah@email.state.edu';
    $subject = 'test';
    $message = 'test';
    $headers = 'From: mail@smartrek.blah.me' . "\r\n" .
               'Reply-To: mail@smartrek.blah.me' . "\r\n" .
                'X-Mailer: PHP/' . phpversion();
mail($to, $subject, $message, $headers);

However in my mail.log I am getting a message that the from is not the address I specified in the header:

<www-data@Name>: Sender address rejected: Domain not found

Why is this?? I am running PHP's fast-cgi on ubuntu Why doesn't sendmail use the header that I have specified via the PHP code?

aherlambang
  • 14,290
  • 50
  • 150
  • 253

6 Answers6

29

It looks like www-data@Name is your envelope "from" address. The envelope "from" address is different from the address that appears in your "From:" header of the email. It is what sendmail uses in its "MAIL FROM/RCPT TO" exchange with the receiving mail server.The main reason it is called an "envelope" address is that appears outside of the message header and body, in the raw SMTP exchange between mail servers.

The default envelope "from" address on unix depends on what sendmail implementation you are using. But typically it will be set to the username of the running process followed by "@" and the hostname of the machine. In a typical configuration this will look something like username@example.com.

If your emails are being rejected by receiving mail servers, or if you need to change what address bounce emails are sent to, you can change the envelope "from" address to solve your problems.

To change the envelope "from" address on unix, you specify an "-r" option to your sendmail binary. You can do this globally in php.ini by adding the "-r" option to the "sendmail_path" command line. You can also do it programmatically from within PHP by passing -r mail@smartrek.blah.me as the additional parameter argument to the mail() function (the 5th argument). If you specify an address in both places, the sendmail binary will be called with two "-r" options, which may have undefined behavior depending on your sendmail implementation. With the Postfix MTA, later "-r" options silently override earlier options, making it possible to set a global default and still get sensible behavior when you try to override it locally.

EDIT

About optional flags that can be passed to sendmail: -f will set the From address, -r will override the default Return-path that sendmail generates (typically the From address gets used). If you want your bounce-backs to go to a different address than the from address, try using both flags at once: -f mail@smartrek.blah.me -r bounced-mail@smartrek.blah.me

my php.ini

[mail function]
; For Win32 only.
; http://php.net/smtp
SMTP = localhost
; http://php.net/smtp-port
smtp_port = 25

; For Win32 only.
; http://php.net/sendmail-from
;sendmail_from = me@example.com

; For Unix only.  You may supply arguments as well (default: "sendmail -t -i").
; http://php.net/sendmail-path
;sendmail_path =

; Force the addition of the specified parameters to be passed as extra parameters
; to the sendmail binary. These parameters will always replace the value of
; the 5th parameter to mail(), even in safe mode.
;mail.force_extra_parameters =

; Add X-PHP-Originating-Script: that will include uid of the script followed by the filename
mail.add_x_header = On

; Log all mail() calls including the full path of the script, line #, to address and headers
;mail.log =
anubhava
  • 761,203
  • 64
  • 569
  • 643
  • I added the -r option in sendmail_path and now I got: sendmail[2719]: p3EGvC1r002719: from=www-data, size=259, class=0, nrcpts=0, msgid=<201104141657.p3EGvC1r002719@DynusT>, relay=www-data@localhost – aherlambang Apr 14 '11 at 16:57
  • If I specify -f mail@smartrek.blah.me in my sendmail_path it works, but I don't want to do this – aherlambang Apr 14 '11 at 16:59
  • Just for testing can you try removing `From:` and `Reply-To:` from your code. – anubhava Apr 14 '11 at 17:01
  • May I know your reservations against providing `-f mail@smartrek.blah.me` but you are okay to use the same in `From:` and `Reply-To:` headers. – anubhava Apr 14 '11 at 17:04
  • because it is possible to have different From address. That is like hardcoding the sender's address – aherlambang Apr 14 '11 at 17:09
  • 5
    Inside your php you can call mail function like this: `mail('to-email@example.com', 'the subject', 'the message', $headers, '-fmail@smartrek.blah.me');` to supply runtime value to mail function. – anubhava Apr 14 '11 at 17:11
  • I know that, my curiosity is why doesn't it take directly from the header? – aherlambang Apr 14 '11 at 17:17
  • That explanation is covered in the first paragraph of my answer above. In short `From:` in header is different from what goes in `-f`. – anubhava Apr 14 '11 at 17:21
  • also I just tried doing the -f from PHP and it didn't send the mail, I got the following in my log Apr 14 17:25:45 DynusT sendmail[2812]: p3EHPjBi002812: Authentication-Warning: DynusT: www-data set sender to mail@smartrek.blah.me using -f Apr 14 17:25:45 DynusT sendmail[2812]: p3EHPjBi002812: from=mail@smartrek.blah.me, size=269, class=0, nrcpts=0, msgid=<201104141725.p3EHPjBi002812@DynusT>, relay=www-data@localhost – aherlambang Apr 14 '11 at 17:27
  • One more attempt: can you try this call please: `mail('to-email@example.com', 'the subject', 'the message', $headers, '-fmail@smartrek.blah.me -rmail@smartrek.blah.me');` – anubhava Apr 14 '11 at 17:37
  • I've got nothing in my log now, but the email is no where to be found in my inbox nor spam folder – aherlambang Apr 14 '11 at 17:48
  • Can you check the return value from above mail function call? And also try sending `null` in place of `$headers` above. – anubhava Apr 14 '11 at 17:51
  • It just beats me. I just copy pasted above mail function call in my php script on Ubuntu and executed that from a browser. Not only mail function returned **TRUE** I also received my email on the to-email address. – anubhava Apr 14 '11 at 18:06
  • hmmm...super weird, then it has something to do with my configuration of my php/server/mail server. How do you set up so that when you actually invoke sendmail from the CL it sends from something@yourdomain.com? as of now when I send something from the CL it sends it from root@machinehostname – aherlambang Apr 14 '11 at 18:08
  • I pasted my php.ini above in my answer as well. – anubhava Apr 14 '11 at 18:25
  • hmm..everything seems to be commented there – aherlambang Apr 14 '11 at 18:28
  • what do you have in your var/hosts? aside from that my php.ini config looks somewhat similar to yours except I have sendmail_path uncommented and points to sendmail_path = /usr/sbin/sendmail -t -i – aherlambang Apr 14 '11 at 18:34
  • All my `/etc/hosts` files are empty pretty much. Try commenting all the `sendmail_` lines in your php.ini – anubhava Apr 14 '11 at 19:16
  • @anubhava Excellent answer! Thanks for breaking this down so clearly, this helped me solve a similar problem I was having regarding the sender envelope not being authenticated by SES. I did notice now that when sending test emails from my WP site that they end up in my spam folder in gmail. Could it be the sender envelope not matching the from address causing this? – gregtzar Apr 07 '14 at 04:01
  • Yes that seems to be reason why gmail marks it as spam. I am sure there would be some WP plugin to customize this but I am not a WP expert. – anubhava Apr 07 '14 at 13:47
  • 1
    @anubhava You were a big help from this question in order to help me on [this question](http://unix.stackexchange.com/a/288549/22780). – Volomike Jun 09 '16 at 02:22
10

Although this is an old question, I'm adding this answer in case it is of help to someone:

I had the same problem with the From: header being re-written to www-data@host... I eventually tracked it down to the ssmtp bridge service that was piping mail from our web server into our mailserver. I added the line FromLineOverride=YES in the file /etc/ssmtp/ssmtp.conf and the problem disappeared.

David G
  • 5,408
  • 1
  • 23
  • 19
6

In my case, I've got a hosted server so I needed to edit this file :

/etc/ssmtp/ssmtp.conf

Then uncomment this line :

FromLineOverride=YES

Once done, personals headers are working.

DependencyHell
  • 1,027
  • 15
  • 22
2

I was having similar problem with www-data when all my mails were sent and received with this header:

From: www-data <www-data@example.com>

I used the -f info@example.com flag as 5th argument with the PHP email() function (as mentioned in accepted answer), but i was still receiving my emails as:

From: www-data <info@example.com>

So i added one more flag -f info@example.com -F info to set the full name of the email and finally i was getting emails as i wanted:

From: info <info@example.com>

I'm posting this answer because nobody mentions it here and i got a little stuck on it.

Mirous
  • 403
  • 7
  • 14
0

This worked for me:

$mail->Sendmail = $mail->Sendmail.' -f '.$mail_errorsto; 
Gwenc37
  • 2,064
  • 7
  • 18
  • 22
Martin
  • 9
  • 1
0

I had this issue using exim4 with smarthost. The mails were sent with

Return-path: <www-data@servername>

which was rejected by the ISP. I needed to change it to at least www-data@example.com (assuming 'example.com' is the servers public domain name). I could achieve that by changing /etc/mailname from

servername

to

example.com

This has already worked for me, having www-data@example.com as Return-path.

However - If you want to completely change the email address, you can configure it in /etc/email-addresses as

www-data: notifications@example.com

After that the emails have been sent by default with

Return-path: <notifications@example.com>
Paul Spiegel
  • 30,925
  • 5
  • 44
  • 53