I am new to PHP. I am running XAMPP on Windows 7 PC. I am attempting to create an e-mail contact form using the PHP mail() function. I am uncertain how the configuration of my sendmail.ini and php.ini files affects my code. Does the configuration of the files only affect how the mail function will work on my localhost? or does it affect how the code will run when I upload my content to my web server?
From my php.ini:
[mail function]
; For Win32 only.
SMTP = smtp.gmail.com
smtp_port = 995
; For Win32 only.
sendmail_from = myemail#gmail.com
; For Unix only. You may supply arguments as well (default: "sendmail -t -i").
sendmail_path = "\"\xampp\sendmail\sendmail.exe\" -t"
; 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 = "\xampp\php\logs\php_mail.log"
From my sendmail.ini:
smtp_server=smtp.gmail.com
; smtp port (normally 25)
smtp_port=995
; 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=mydomain.com
; 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=myemail#gmail.com
auth_password=mypassword
; 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=myemail#gmail.com
; 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=
My code looks like:
$name = $_POST['name1'];
$email = $_POST['email'];
$message = $_POST['body'];
$body = $message . '\n My email is ' . $email;
$header1 = "From: $email \n";
mail("myemail#gmail.com", $_POST['subject'], $body, $header1);
header('location:Contact.php');
In any case I have been getting two errors: one is that the "connection timed out" and the other is that the "connection closed gracefully.' I googled "connection closed gracefully" and found that I had to run my sendmail.exe file as an administrator and since I am using gmail I had to set up application-specific passwords.
On the post it indicated that I needed to run a server (or IDE) as an administrator as well. Anyone familiar with XAMPP who knows what/where the server/IDE is please respond.
Making sure that php and sendmail are run as administrator seems a good idea but this did not solved my problem.
Solution in sendmail.ini
smtp_server = smtp.yourisp.com
; 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=none
do not use smtp_ssl = auto that was what was causing my bug just set it to ssl tls or none according to specification of your server
Try these and I'll be back when I have more time to update this:
1) Never install XAMPP in your Programs folder in Windows. This will cause privilege issues. If you have then re-install it elsewhere.
2) All settings in your sendmail.ini must be configured with what your Apache (Xampp) installation has. The php.ini part you provided is not the full file or the part that has these settings. For example I don;t think your SMTP port is really 995 (I could be wrong).
3) Look at this post: How to configure XAMPP to send mail from localhost?
4) SMTP should work now. Your using another mail server (Gmail in this case) to send off your mail. You actually could use your computer as the server too but that is a whole nether issue.
Related
This question already has answers here:
PHP mail function doesn't complete sending of e-mail
(31 answers)
Closed 7 years ago.
I am testing to send mail form localhost using gmail smtp,
I have made following setting
C:\wamp\sendmail\sendmail.ini
smtp_server=smtp.gmail.com
;smtp port (normally 25)
smtp_port=465
smtp_ssl=ssl
default_domain=localhost
error_logfile=error.log
;debug_logfile=debug.log
auth_username = at*******t#gmail.com
auth_password = my*********password
php.ini
.
extension=php_smtp.dll
.
.
[mail function]
; For Win32 only.
; http://php.net/smtp
; SMTP = smtp.gmail.com
; http://php.net/smtp-port
; smtp_port = 25
; For Win32 only.
; http://php.net/sendmail-from
; sendmail_from = at*******t#gmail.com
; For Unix only. You may supply arguments as well (default: "sendmail -t").
; http://php.net/sendmail-path
sendmail_path = "C:\wamp\sendmail\sendmail.exe -t -i"
index.php
<?php
$to = "towhomemailid#gmail.com";
$subject = "My subject";
$txt = "Hello world!";
$headers = "From: at*******t#gmail.com#gmail.com" . "\r\n" .
"CC: anothermailid#gmail.com";
$a = mail($to,$subject,$txt,$headers);
var_dump($a);
?>
Output
false
I have enabled the IMAP setting in gmail account as well,
Also enabled the php_smtp, php_openssl, php_sockets under PHP extensions
When I tried I am getting a security mail in gmail that there is one suspicious login and I have added this device to known one as well, it seems the script is hitting the gmail account but return is getting false.
What possible change I am missing?
EDIT:
I tried with an enterprise email id ..
enterpriseemailid#example.com
it was working but not with my perswonal id, even the two step verification is off, so error seems to be somewhere in google setting, can anyone suggest possible solution
Well this is a pretty common problem. Here are some solutions which might help you.
1). Use tls instead of ssl.
2). If you've enabled 2-Factor Authentication, make sure you make appropriate settings in your gmail account to accept the login.
My requirement is to send a mail to the client's mail-id. I wrote a program in php to send mail using SMTP server and hosted it on localhost. It worked fine and I was able to send the mail successfully. I used port 25.
Now I want to run the same program using the same sender id, this time by hosting the php program on my domain name. But, I'm not able to send the mail. What changes should I make?
Please note, I don't want to send mails using my domain email. I want to send mails using the same gmail id which i used for localhost.
My sendmail.ini looks like this:
; 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=smtp.gmail.com
; 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=my_domain_name.com
; 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=my_sender_id#gmail.com
auth_password=my_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=my_sender_id#gmail.com
; 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=
This my problem,
I have a simple PHP script to send email to localhost with mercury mail server and read it with Mozilla Thunderbird. And it's work.
And then, I upgarde XAMPP version to 1.8.1 and my function return true but no email delivered.
<?php
$to = "root#localhost.com";
$subject = "Hi!";
$body="test";
$headers = "From: root#localhost.com";
if (mail($to, $subject, $body, $headers)) {
echo "Message successfully sent!";
} else {
echo "Message delivery failed...";
}
?>
I tried to send email with Thunderbird to root#localhost.com and it work.
So iI try to change mail function in php.ini to this but not work
[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 = root#localhost.com
; 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"
I try to change sendmail.ini to this but not work
; 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=localhost
; 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=mydomain.com
; 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=
auth_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=
; 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=
Any idea?
If mail returns true, then php's job is done. it's handed the email over to your outgoing mail server. You need to check that server's logs to see what happens from that point forward.
e.g. PHP's role in sending an email is basically the equivalent of taking an envelope you hand it, walking down to the street corner, and dropping it into the mailbox. After that, PHP's done and it can report success.
If that mailbox gets nailed by a drunk driver and the mail gets destroyed, that's not PHP's fault. If the mail gets picked up and sent to a postal sorting facility and then gets lost, that's also not PHP's problem.
So go check your mail server's logs. If it can't deliver the mail, it'll report why. If it DID deliver the mail to the destination server, it'll report so, and then you need to find out why the receiving server isn't doing its job - maybe your email is getting flagged as spam and dump in the trash.
Check this directory: C:\xampp\apache\mailoutput
I recently experienced this problem and after many frustrating hours figured out what was causing it, and how to fix it. Hopefully I can save someone else all that trouble.
My php mail() function was returning true, but I wasn't receiving the messages. In my case, it turned out to have nothing to do with PHP after all.
I use Plesk to manage the sites on my server. This particular version of Plesk doesn't allow me to turn mail services on or off for a given website/domain. I host my email elsewhere.
So here's what was happening: PHP mail() was sending messages, the way it was supposed to. But my server was under the impression that it was supposed to receive messages for the particular domain those messages were addressed to. But there was no such mailbox for that domain, because again I host my email elsewhere.
So the messages were never leaving my server.
The solution was for me to go into var/qmail/control and remove the domain names from the "virtualdomains" file, then restart qmail.
Again, I hope this can save someone else all the time and frustration.
Gregg
Case Solved
I downgrade XAMPP version to 1.7 and it works :)
I had a similar problem. In my case was that I modified the "From" field in the headers. In your example you have
$headers = "From: root#localhost.com";
Maybe this is the problem. See this answer for more information
I use apache, php, and sendmail.exe on my Windows.
I download sendmail.exe and configure it like this:
; 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=smtp.gmail.com
; smtp port (normally 25)
smtp_port=587
; 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=domain.com
; 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#whilgeek.com
auth_password=19910610
; if your smtp server uses pop3 before smtp authentication, modify the
; following three lines
pop3_server=
pop3_username=
pop3_password=
; to force the sender to always be the following email address, uncomment and
; populate with a valid email address. this will only affect the "MAIL FROM"
; command, it won't modify the "From: " header of the message content
force_sender=webmaster#domain.com
; 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=
and the email function in my php.ini is like this:
[mail function]
; For Win32 only.
SMTP = localhost
smtp_port = 25
; For Win32 only.
sendmail_from = admin#whilgeek.com
; For Unix only. You may supply arguments as well (default: "sendmail -t -i").
sendmail_path =C:\usr\lib\sendmail.exe -t
; 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 =
I use userCake1.4( download form here ) in my computer and it says sent email successfully. But I didn't receive the email sent to my gamil.
What't wrong?
I think your problem is reverse DNS lookup. When you send an email from a server, your server has to be connected to the internet and the reverse DNS lookup has to point back to your server.
For example, an address (A) record for mail.example.com points to the IP address 192.0.2.5. In pointer records of the reverse database, this IP address is stored as the domain name 5.2.0.192.in-addr.arpa pointing back to its designated host name mail.example.com.
See http://en.wikipedia.org/wiki/Reverse_DNS_lookup
I'm learning PHP and have installed XAMPP on my computer.
But I have a problem with the setup as the email option doesn't seem to be working.
After doing some reading I think it has something to do with the below, found on my server in the php.ini file
[mail function]
; For Win32 only.
; *hp://*php.net/smtp
SMTP = localhost
; http://php.net/smtp-port
smtp_port = 25
; For Win32 only.
; http://php.net/sendmail-from
;sendmail_from = postmaster#localhost
Is there anything I need to change? I have seen software such as swiftmailer mentioned but I don't know if XAMPP has this included already?
My favorite smtp server is hMailServer.
It has a nice windows friendly installer and wizard. Hands down the easiest mail server I've ever setup.
It can proxy through your gmail/yahoo/etc account or send email directly.
Once it is installed, email in xampp just works with no config changes.
XAMPP should have come with a "fake" sendmail program. In that case, you can use sendmail as well:
[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 = "C:/xampp/sendmail/sendmail.exe -t -i"
Sendmail should have a sendmail.ini with it; it should be configured as so:
# Example for a user configuration file
# Set default values for all following accounts.
defaults
logfile "C:\xampp\sendmail\sendmail.log"
# Mercury
#account Mercury
#host localhost
#from postmaster#localhost
#auth off
# A freemail service example
account ACCOUNTNAME_HERE
tls on
tls_certcheck off
host smtp.gmail.com
from EMAIL_HERE
auth on
user EMAIL_HERE
password PASSWORD_HERE
# Set a default account
account default : ACCOUNTNAME_HERE
Of course, replace ACCOUNTNAME_HERE with an arbitrary account name, replace EMAIL_HERE with a valid email (such as a Gmail or Hotmail), and replace PASSWORD_HERE with the password to your email. Now, you should be able to send mail. Remember to restart Apache (from the control panel or the batch files) to allow the changes to PHP to work.
Unless you have a mail server set up on your local computer, setting SMTP = localhost won't have any effect.
In days gone by (long ago), it was sufficient to set the value of SMTP to the address of your ISP's SMTP server. This now rarely works because most ISPs insist on authentication with a username and password. However, the PHP mail() function doesn't support SMTP authentication. It's designed to work directly with the mail transport agent of the local server.
You either need to set up a local mail server or to use a PHP classs that supports SMTP authentication, such as Zend_Mail or PHPMailer. The simplest solution, however, is to upload your mail processing script to your remote server.