本地环境下的php mail()函数

15
我在本地服务器上使用 PHP 的 mail() 函数时遇到了问题。当我尝试使用该函数发送邮件来测试我的电子邮件应用程序时,无法在本地主机上进行测试。
我遇到了以下错误: 警告:mail() [function.mail]:无法连接到位于“localhost”端口 25 的邮件服务器,请验证您的 php.ini 中的“SMTP”和“smtp_port”设置,或使用 ini_set()。 位于 F:\wamp\www\product\ajax.php 的第64行 我正在使用 WAMP 服务器,如果有人知道解决方法,请帮忙提供。

5
你甚至安装了邮件服务器吗? - dialer
https://dev59.com/nFPTa4cB1Zd3GeqPgRsN - random
6个回答

14
你需要在机器上设置一个邮件服务器才能让邮件功能正常工作。如果你使用的是Windows操作系统(从你使用WAMP可以猜测),你可以设置一个Pegasus邮件服务器
其他选择包括使用类似于SwiftMailerPHPMailer的封装类,并使用它们连接到另一个SMTP服务器,例如您的GMail帐户。即使您选择在本地主机上使用Pegasus邮件服务器,我仍然建议使用我上面提到的这两个类之一。它们为您提供更大的灵活性并且更安全。
连接到您的ISP SMTP服务器或GMail或任何其他SMTP服务器都是最简单的方法。

4
+1 推荐使用 Swift 或 PHPMailer,因为它们可以为您的项目增加更多的灵活性,而不是依赖于服务器的 mail() 配置。 - AlfaTeK

10

经过2天的研究,我已经解决了php邮件功能问题,并可以帮助您做同样的事情。这已经浪费了足够的时间,让我们开始吧...

PHP有一个内置的php邮件函数,可用于从脚本发送邮件,但此函数在某种程度上受限,因为它无法连接到简单邮件传输协议(SMTP)服务器。我假设您正在使用WAMP / XAMPP,虽然我没有真正尝试过XAMPP,但是您可以按照以下步骤找出:

首先,我们需要找到一种方法将我们的Web服务器(wamp)连接到外部SMTP。在这种情况下,我们将使用Gmail,但在此之前,我们需要下载/安装一个工具,该工具将从php脚本中抓取我们的电子邮件并将其推送到Gmail SMTP。

  1. First go to http://glob.com.au/sendmail/ and click on the download sendmail.zip to download.

  2. After downloading, extract to C:\wamp\ extract it as a folder meaning it's contents should be in a folder called sendmail and can be located at C:\wamp\sendmail.

  3. Now in the send mail folder, right click on sendmail.ini and open as an administrator since we are about to modify its contents.

  4. change the following lines

     [sendmail]
     smtp_server=smtp.gmail.com
     smtp_port= 465
     smtp_ssl=ssl
     default_domain=localhost
     error_logfile=error.log
     debug_logfile=debug.log
     auth_username= enter your gmail account here        
     auth_password= enter the password for that account here
     ;pop3_server=
     ;pop3_username=
     ;pop3_password=
     ;force_sender=
     ;force_recipient=
     hostname= localhost 
    
请注意并按照上面所示的操作进行。我已经从我的 sendmail.ini 文件中删除了大部分不必要的内容,以使阅读更加轻松。
  1. 保存文件
  2. 导航到您的 wamp 文件夹并移动到 bin\apache\apache[version here]\bin\php.ini,并以管理员身份修改 php 文件,如下所示:

如果您使用记事本,可以在编辑选项卡下使用查找,或者按下 ctrl+F 并输入 "mail function",以快速导航到 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 = 

    ;For Unix only.  You may supply arguments as well (default: "sendmail -t -i").
    ;http://php.net/sendmail-path
    sendmail_path = "C:\wamp\sendmail\sendmail.exe -t -i" ----> this is the changed part. 

注意:只需要更改上面提到的sendmail_path,其他设置保留原样。您提取sendmail文件夹的位置可能会有所不同。
7.保存php.ini文件。 8.返回到C:\wamp\bin,选择php\php[版本号]\php.ini并像上面一样编辑sendmail路径,保存文件(以管理员身份运行或在打开之前通过右键单击以管理员身份打开)。 9.作为管理员运行wampserver,并在其变成绿色时打开以下内容: - 左键单击绿色图标并移动到php -> php扩展 -> php_sockets(单击以使其显示黑色勾选)。 - 等待图标再次变为绿色,然后按照上述步骤打开php_openssl。 - 如果图标变为绿色,则是时候通过移动到Apache模块来打开apaches ssl_module了,此操作可以在单击绿色wampserver图标时找到。
完成以上三个步骤后,退出并以管理员身份再次运行wampserver以生效更改。
10.返回sendmail提取的文件夹,右键单击sendmail.exe,转到其属性 -> 兼容性 -> 更改所有用户的设置 -> 兼容性模式(更改为Windows XP(Service Pack 3)) -> 以管理员身份运行此程序(选中此选项)。
保存并应用更改。我们必须这样做,以便每次调用sendmail应用程序时,它都会作为管理员运行。
11.现在,我们需要配置Gmail帐户以与此sendmail应用程序配合使用。登录Gmail帐户,在右上角单击齿轮以选择设置。在设置中,移至转发和POP / IMAP选项卡,并启用IMAP。保存更改。
12.最后回到收件箱,在最右上角的电子邮件地址旁边有一个小箭头指向下方,单击它以选择我的帐户。如果您没有这个选项,则可以尝试单击您的个人资料图片,然后从那里选择我的帐户。
单击“登录和安全”选项卡,向下滚动到页面底部。您将找到“允许不安全的应用程序:”,并将其打开。通常情况下,此选项将关闭。
13.这就是你需要做的所有事情,因此您现在可以从本地主机上的php脚本发送电子邮件。您现在可以尝试使用4个最小参数运行mail()函数。希望这有所帮助。如果有帮助,请投票,我会花时间发布更多有趣的解决方案。

非常详细的回答,它起作用了。非常感谢@linuxhini!! - odedta
1
对我来说非常完美,在Windows 10上使用XAMPP。由于XAMPP附带了sendmail,因此我跳过了步骤1、2、9和10。 - Sandwich

1
这是在Windows上使用mail()时的一个众所周知的问题,因为通常你没有本地SMTP服务。正如您的错误消息所说,您需要在php.ini中定义SMTP设置,以通过允许您发送出站邮件的邮件服务器进行通信,无论是否进行身份验证。请参阅mail()文档。

1

我使用一个简单的工具测试邮件服务器。它将.eml输出文件保存在一个文件夹中,并在使用mail()函数时自动打开它。


如果有人在尝试从不支持SMTP的系统发送邮件时遇到麻烦,那么这个工具可以帮助您解决头痛问题。 - Syed

1
在Windows中创建邮件服务器最简单的方法是安装Python,然后使用内置的SMTP调试服务器,并使用以下一行代码:
python -m smtpd -c DebuggingServer -n localhost:25

在Windows上,我发现它有时会对本地主机和127.0.0.1表现出奇怪的行为,所以如果一切都失败了,您可以尝试使用“ipconfig”命令(在DOS命令提示符下)查找您的IP地址,您可能会看到类似于以下内容:
c:\> ipconfig

-- stuff cut here ---

Wireless LAN adapter WiFi:

Connection-specific DNS Suffix  . :
Link-local IPv6 Address . . . . . : fe80::856d:fd33:3e01:e656%9
IPv4 Address. . . . . . . . . . . : 192.168.8.111
Subnet Mask . . . . . . . . . . . : 255.255.255.0
Default Gateway . . . . . . . . . : 192.168.8.1

假设你发现你的IP地址是192.168.8.11(就像我在上面的例子中一样),那么将命令更改为:

python -m smtpd -c DebuggingServer -n 192.168.8.11:25

在你的php.ini文件中设置以下行:

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

而且,在某些情况下,这对我非常有效!

我还注意到,您可以通过输入以下命令来检查本地邮件服务器是否正常工作:

C:/> telnet localhost 25

或者对于我的第二个配置:

C:/> telnet 192.168.8.111 25

在Linux上,Telnet是免费的,但在Windows上获取它需要前往“程序和功能”,然后点击左侧的小面板中的“打开或关闭Windows功能”,然后在Windows功能列表中选中“Telnet客户端”复选框。

当您运行telnet命令时,如果服务器未运行,则会看到类似于以下内容:

C:\Projects>telnet localhost 25
Connecting To localhost...Could not open connection to the host, on port 25: Connect failed

但是,如果一切正常,您应该能够从邮件服务器获得屏幕清除和“服务器标识符”字符串。在我的机器上,它看起来像:

220 ZOOT Python SMTP proxy version 0.3     

如果你真的很热衷,你可以输入一些SMTP命令并在此发送邮件,或者你可以输入“quit”以断开与服务器的连接。


0
尝试为本地主机设置邮件服务器。否则它在本地主机上将无法工作。

这应该是被接受的答案。它完全可行。 - stackunderflow

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