Sendmail Wamp Php

22
我花了整个上午在互联网上寻找关于这个问题的解决办法。我已经在Windows 8.1上安装了wamp服务器,并尝试使用sendmail(http://glob.com.au/sendmail/)和我的gmail账户发送邮件。
当我将sendmail配置为使用端口号465时,我总是会收到以下错误:Socket Error #10060连接超时。
如果我尝试使用端口号587,则在错误日志中会出现“连接已正常关闭”的提示。但是没有发送电子邮件。
以下是我的sendmail.ini文件。
[sendmail]
smtp_server=smtp.gmail.com
;I tried both: 587, 465
smtp_port=587
; I tried: "blank, auto ssl, tls, none"
smtp_ssl=
error_logfile=error.log
debug_logfile=debug.log
auth_username=myaccoun@gmail.com
auth_password=mypass
hostname=localhost

以下是php.ini文件

[mail function]
smtp_port = 465
sendmail_path="C:\wamp\sendmail\sendmail.exe -t"
mail.add_x_header = On

Apache上启用了ssl_module,而php使用了php_open_ssl和php_socket扩展。

我也尝试使用stunnel,但没有成功。

编辑于2014年1月27日

我在sendmail.ini中设置了smtp_port = 465和smtp_ssl = ssl。此外,我设置了sendmail.exe必须作为Windows XP SP3程序运行。完成后,在Windows控制台上运行sendmail.exe时,可以正确发送电子邮件。但是,当wamp尝试发送邮件时,我在sendmail的错误日志中收到此错误:Socket Error # 10060连接超时。

这是我用来测试sendmail的代码:

<?php
$email = "mymail@gmail.com";
$to = "mymail@gmail.com";
$subject = "Hi!";
$body = "Hi,How are you?";
$headers = 'From: ' .$email . "\r\n".'Reply-To: ' . $email. "\r\n".'X-Mailer: PHP/' . phpversion();
if (mail($to, $subject, $body, $headers)) echo("<p>Email successfully sent</p>");
else echo("<p>Email delivery failed</p>");
?>

1
唯一看起来不对的是 hostname=localhost,请尝试将其注释掉。 - RiggsFolly
谢谢您的回复。我尝试了,但没有解决问题。:( - Rumpelstinsk
1
你可以尝试在[mail function]部分的php.ini文件中添加以下行:mail.log = "c:\wamp\logs\php_mail.log",这将打开邮件日志记录并有助于识别问题。 - RiggsFolly
在执行完这个操作之后,再进行另一个测试,php_mail.log 的内容如下:mail() on [C:\wamp\www\testSendMail.php:7]: To: myemail@gmail.com -- Headers: From: myemail@gmail.com Reply-To: myemail@gmail.com X-Mailer: PHP/5.4.16。sendmail 错误日志只有:Connection Closed Gracefully。 - Rumpelstinsk
也许你在 PHP 中没有正确地创建电子邮件。 - RiggsFolly
显示剩余2条评论
4个回答

68

终于找到答案了。

问题在于sendmail必须以管理员身份运行。以下是解决方案,可以帮助任何遇到类似情况的人。

  1. 右键单击 sendmail.exe
  2. 属性
  3. 兼容性
  4. 更改所有用户的配置
  5. 以Windows XP SP 3模式运行
  6. 以管理员身份运行

然后保存 :D

在这种无意义的事情上浪费了两天 :(


1
;(这浪费了我1.5个小时。 - user2286243
5
迷失在这荒谬的事情中已经两天了 :( - Yohanim
2
如果这不起作用,请为所有用户开启兼容模式。 - bastey
:P 这浪费了2年的时间 :P - Rhak Kahr
真的吗?这么简单!哇,浪费了整整两天! - Farshad
显示剩余4条评论

8
作为对已接受答案的扩展说明:
如果你在PHP中运行发送邮件功能,可能会弹出一个对话框,要求你以管理员身份运行“发送邮件”应用程序。点击“是”后,它将显示一个命令提示符对话框,并且在命令提示符关闭之前,页面将挂起而不会发生任何事情。邮件函数甚至会返回“True”,但实际上没有发送任何消息。
为了解决这个问题,需要按照已接受答案的说明进行操作,并以管理员身份运行服务器(或IDE),方法如下:
1)右键单击程序(例如服务器、IDE、命令提示符)并单击“以管理员身份运行”
2)或者右键单击程序 > 属性 > 兼容性 > 勾选以管理员身份执行
例如,如果你正在使用PHP内置服务器,请以管理员身份运行命令提示符,并使用以下方式正常启动服务器
C:\wamp\bin\php\php5.5.12\php.exe -S localhost:80 -t C:\Users\path\to\rootFolder

当然,根据您的需要更改文件路径。
希望这能帮助某些人!!! 我为此花了很长时间!

1
那救了我的一天!谢谢。 - Arnie
我正在使用一个旧的xampp安装,正如Yahya所提到的,我将C:\xampp\xampp-control.exe设置为管理员运行,并执行Rumppelstinsk所提到的操作。我不再收到sendmail命令提示弹窗和sendmail error.log中的“Socket Error # 10060<EOL>Connection timed out.”错误信息。 - Carlton
尝试将/php/php.exe设置为管理员运行。对我来说,这个方法有效。 - Dollique

7
问题在于sendmail必须以管理员身份运行。这是解决方案来帮助我这种情况的。
  1. 右键单击sendmail.exe
  2. 属性
  3. 兼容性
  4. 更改所有用户的配置
  5. 将其执行为Windows XP SP 3
  6. 以管理员身份运行
  7. 如果您使用的是gmail,您需要创建新密码“您的应用程序专用密码”

1
我不理解第七步。你能详细解释一下吗? - s427

1

Compatibility Troubleshooter

在Windows 10上,我发现唯一可行的方法是运行兼容性故障排除程序。
  1. 右键单击sendmail.exe
  2. 点击“属性”
  3. 选择“兼容性”选项卡。
  4. 点击“运行兼容性故障排除程序”。
  5. 让Windows自动修复。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接