PHP mail() 函数返回 true 但没有消息
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/17195280/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
PHP mail() function return true but no message
提问by Stephanus Budiwijaya
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.
我有一个简单的 PHP 脚本,可以使用 Mercury 邮件服务器向本地主机发送电子邮件,并使用 Mozilla Thunderbird 阅读它。这是工作。
And then, I upgarde XAMPP version to 1.8.1 and my function return true but no email delivered.
然后,我将 XAMPP 版本升级到 1.8.1,我的函数返回 true 但没有发送电子邮件。
<?php
$to = "[email protected]";
$subject = "Hi!";
$body="test";
$headers = "From: [email protected]";
if (mail($to, $subject, $body, $headers)) {
echo "Message successfully sent!";
} else {
echo "Message delivery failed...";
}
?>
I tried to send email with Thunderbird to [email protected] and it work.
我尝试使用 Thunderbird 向 [email protected] 发送电子邮件并且它工作正常。
So iI try to change mail function in php.ini to this but not work
所以我尝试将 php.ini 中的邮件功能更改为此但不起作用
[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 = [email protected]
; 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?
任何的想法?
回答by Marc B
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.
如果邮件返回 true,那么 php 的工作就完成了。它已将电子邮件移交给您的外发邮件服务器。您需要检查该服务器的日志以查看从那时起会发生什么。
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.
例如,PHP 在发送电子邮件中的作用基本上相当于拿起您递给它的信封,走到街角,然后将其放入邮箱。之后,PHP 就完成了,它可以报告成功。
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.
如果那个邮箱被醉酒的司机钉住并且邮件被破坏,那不是 PHP 的错。如果邮件被拾起并发送到邮政分拣设施,然后丢失,那也不是 PHP 的问题。
So go check your mail server's logs. If it can't deliver the mail, it'll report why. If it DIDdeliver 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.
所以去检查你的邮件服务器的日志。如果它不能发送邮件,它会报告原因。如果DID投递邮件到目标服务器,它会报告这样了,那么你需要找出原因,接收服务器没有做的工作-也许你的电子邮件遭到举报为垃圾邮件和垃圾场。
回答by TheRealChx101
Check this directory: C:\xampp\apache\mailoutput
检查此目录:C:\xampp\apache\mailoutput
回答by Gregg
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.
我的 php mail() 函数返回 true,但我没有收到消息。就我而言,结果证明它毕竟与 PHP 无关。
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.
我使用 Plesk 来管理我服务器上的站点。此特定版本的 Plesk 不允许我为给定的网站/域打开或关闭邮件服务。我在别处托管我的电子邮件。
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.
所以这就是正在发生的事情:PHP mail() 正在以它应该的方式发送消息。但是我的服务器给人的印象是它应该接收这些消息发送到的特定域的消息。但是那个域没有这样的邮箱,因为我又在别处托管了我的电子邮件。
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.
解决方案是让我进入 var/qmail/control 并从“virtualdomains”文件中删除域名,然后重新启动 qmail。
Again, I hope this can save someone else all the time and frustration. Gregg
再次,我希望这可以节省其他人的时间和挫折。格雷格
回答by agmezr
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: [email protected]";
Maybe this is the problem. See thisanswer for more information
也许这就是问题所在。有关更多信息,请参阅此答案
回答by Stephanus Budiwijaya
Case Solved
案例解决
I downgrade XAMPP version to 1.7 and it works :)
我将 XAMPP 版本降级到 1.7 并且它有效:)