I'm running Apache on xampp, and I want to use sendmail.exe to send emails with PHP.
I tried using Mercury/32 to setup the email server, and I had it working for a while, but now Mercury's SMTP won't start (ports 25 and 110 won't start in xampp control panel), and I can't use it anymore.
After that I switched to hMailServer. SMTP, POP3 and IMAP4 are active and correctly configured. Also, Autoban function is disabled and Internet is removed from IP ranges, as result sending and receiving mails works perfectly with Thunderbird.
But when I try a PHP script to send an email, I always get this :
"TCPIP" 10228 "2015-07-24 12:53:44.262" "TCP - 127.0.0.1 connected to 127.0.0.1:25."
"DEBUG" 10228 "2015-07-24 12:53:44.262" "TCP connection started for session 158"
"SMTPD" 10228 158 "2015-07-24 12:53:44.262" "127.0.0.1" "SENT: 220 localhost ESMTP"
"SMTPD" 10780 158 "2015-07-24 12:53:44.627" "127.0.0.1" "RECEIVED: EHLO localhost"
"SMTPD" 10780 158 "2015-07-24 12:53:44.627" "127.0.0.1" "SENT: 250-localhost[nl]250-SIZE 20480000[nl]250-AUTH LOGIN[nl]250 HELP"
"SMTPD" 10228 158 "2015-07-24 12:53:44.627" "127.0.0.1" "RECEIVED: AUTH LOGIN"
"SMTPD" 10228 158 "2015-07-24 12:53:44.627" "127.0.0.1" "SENT: 334 VXNlcm5hbWU6"
"SMTPD" 11188 158 "2015-07-24 12:53:44.627" "127.0.0.1" "RECEIVED: YWRtaW4="
"SMTPD" 11188 158 "2015-07-24 12:53:44.627" "127.0.0.1" "SENT: 334 UGFzc3dvcmQ6"
"SMTPD" 11188 158 "2015-07-24 12:53:44.627" "127.0.0.1" "RECEIVED: ***"
"SMTPD" 11188 158 "2015-07-24 12:53:44.632" "127.0.0.1" "SENT: 535 Authentication failed. Restarting authentication process."
"DEBUG" 10780 "2015-07-24 12:53:44.632" "The read operation failed. Bytes transferred: 0 Remote IP: 127.0.0.1, Session: 158, Code: 2, Message: End of file"
"DEBUG" 10780 "2015-07-24 12:53:44.632" "Ending session 158"
Here is my php.ini
mail_function part:
[mail function]
; XAMPP: Comment out this if you want to work with an SMTP Server like Mercury
SMTP = localhost
smtp_port = 25
; For Win32 only.
; http://php.net/sendmail-from
sendmail_from = admin@car-services.dz
; XAMPP IMPORTANT NOTE (1): If XAMPP is installed in a base directory with spaces (e.g. c:\program filesC:\xampp) fakemail and mailtodisk do not work correctly.
; XAMPP IMPORTANT NOTE (2): In this case please copy the sendmail or mailtodisk folder in your root folder (e.g. C:\sendmail) and use this for sendmail_path.
; XAMPP: Comment out this if you want to work with fakemail for forwarding to your mailbox (sendmail.exe in the sendmail folder)
sendmail_path = "\"C:\xampp\sendmail\sendmail.exe\" -t"
; XAMPP: Comment out this if you want to work with mailToDisk, It writes all mails in the C:\xampp\mailoutput folder
;sendmail_path="C:\xampp\mailtodisk\mailtodisk.exe"
; 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=Off
; Log all mail() calls including the full path of the script, line #, to address and headers
;mail.log = "C:\xampp\php\logs\php_mail.log"
And sendmail.ini
:
; configuration for fake sendmail
; if this file doesn't exist, sendmail.exe will look for the settings in
; the registry, under HKLM\Software\Sendmail
[sendmail]
; you must change mail.mydomain.com to your smtp server,
; or to IIS's "pickup" directory. (generally C:\Inetpub\mailroot\Pickup)
; emails delivered via IIS's pickup directory cause sendmail to
; run quicker, but you won't get error messages back to the calling
; application.
smtp_server=127.0.0.1
; smtp port (normally 25)
smtp_port=25
; SMTPS (SSL) support
; auto = use SSL for port 465, otherwise try to use TLS
; ssl = alway use SSL
; tls = always use TLS
; none = never try to use SSL
smtp_ssl=auto
; the default domain for this server will be read from the registry
; this will be appended to email addresses when one isn't provided
; if you want to override the value in the registry, uncomment and modify
default_domain=car-services.dz
; log smtp errors to error.log (defaults to same directory as sendmail.exe)
; uncomment to enable logging
error_logfile=error.log
; create debug log as debug.log (defaults to same directory as sendmail.exe)
; uncomment to enable debugging
debug_logfile=debug.log
; if your smtp server requires authentication, modify the following two lines
auth_username=admin
auth_password=password
; if your smtp server uses pop3 before smtp authentication, modify the
; following three lines. do not enable unless it is required.
pop3_server=
pop3_username=
pop3_password=
; force the sender to always be the following email address
; this will only affect the "MAIL FROM" command, it won't modify
; the "From: " header of the message content
force_sender=admin@car-services.dz
; force the sender to always be the following email address
; this will only affect the "RCTP TO" command, it won't modify
; the "To: " header of the message content
force_recipient=
; sendmail will use your hostname and your default_domain in the ehlo/helo
; smtp greeting. you can manually set the ehlo/helo name if required
hostname=
Windows host file:
127.0.0.1 localhost
127.0.0.1 car-services.dz
PHP script :
$headers = "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: text/html; charset=ISO-8859-1\r\n";
$headers .= "From: admin@car-services.dz";
$subject = "Confirmation mail";
$message = 'This is a confirmation mail';
var_dump(mail("test@car-services.dz", $subject, $message, $headers));
mail function always fails (return false), and this is the error log :
15/07/24 12:53:44 : Authentication failed. Restarting authentication process.<EOL>
Account name and password are the same on both sides (client application and server).
The problem was in the settings of sendmail (sendmail.ini). This line should be like this:
auth_username=admin@car-services.dz
I figured that out, using RawCap to capture local TCP and WireShark to view the captures of sendmail.exe and Thunderbird, then comparing the captures I noticed that the USER sent is not the same (username crypted), so I tried to add the domain name to the username and it worked ! Thanks Akhil Thayyil