本地主机上的 php mail() 函数

Posted

技术标签:

【中文标题】本地主机上的 php mail() 函数【英文标题】:php mail() function on localhost 【发布时间】:2011-07-17 14:26:40 【问题描述】:

我在本地服务器上的 php mail() 函数有问题。当我尝试使用 php 函数发送电子邮件时,我无法在 localhost 上测试我的电子邮件应用程序 mail()

我收到此错误 Warning: mail() [function.mail]: Failed to connect to mailserver at "localhost" port 25, verify your "SMTP" and "smtp_port" setting in php.ini or use ini_set() in F:\wamp\www\product\ajax.php on line 64

我正在使用 WAMP 服务器,如果有人知道解决方案,请帮助我。

【问题讨论】:

你有没有安装邮件服务器? ***.com/questions/4595730/… 【参考方案1】:

您需要在您的机器上设置一个邮件服务器,邮件功能才能工作。如果您在 Windows 上(我猜您是使用 WAMP),您可以设置 Pegasus mail server。

其他选项包括使用包装类(例如 SwiftMailer 或 PHPMailer)并使用它们连接到另一个 SMTP 服务器(例如您的 GMail 帐户)。即使您在自己的 localhost 路由上使用 Pegasus 邮件服务器,我仍然建议使用我上面提到的两个类之一。它们为您提供更大的灵活性并且更安全。

连接到您的 ISP SMTP 服务器或 GMail 或任何最简单的路由。

【讨论】:

+1 用于 swift 或 phpmailer,因为它们为您的项目添加了更大的灵活性,而不是依赖于您的服务器 mail() 配置【参考方案2】:

在这个 php 邮件功能问题上花了 2 天后,我想通了,并会帮助你做同样的事情。这已经浪费了足够的时间,让我们开始......

PHP 有一个内置的 php 邮件功能,可用于从脚本发送邮件,但此功能受到某种限制,因为它无法将您连接到简单邮件传输协议 (SMTP) 服务器。我假设您使用的是 WAMP/XAMPP,还没有真正尝试过 XAMPP,但您可以按照以下方式弄清楚:

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

    先到http://glob.com.au/sendmail/点击下载sendmail.zip进行下载。

    下载后解压到C:\wamp\解压到一个文件夹,意思是它的内容应该在一个叫sendmail的文件夹中,可以位于C:\wamp\sendmail

    现在在发送邮件文件夹中,右击sendmail.ini并以管理员身份打开,因为我们要修改它的内容。

    更改以下行

     [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 文件中删除了大部分不需要的内容,以便于阅读。

    保存文件 导航到您的wamp文件夹并移动到bin\apache\apache[version here]\bin\php.ini并以管理员身份修改php文件如下:

如果您使用的是记事本,可以使用编辑选项卡下的查找或ctrl+F 并输入“邮件功能”快速导航到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 文件夹提取到的位置。

    保存 php.ini 文件

    移回C:\wamp\bin并选择php\php[version here]\php.ini并像上面一样编辑发送邮件路径并将文件保存为管理员/或在打开之前,通过右键单击以管理员身份打开

    以管理员身份运行 wampserver,当它变成绿色时,打开以下:

左键单击绿色图标并移动到 php -> php extensions -> php_sockets(单击以对其进行黑色检查)

等待图标再次变绿,按照上面的方法开启php_openssl。

如果图标变为绿色,则当您单击绿色 wampserver 图标时,通过移动到 apache icom 来打开 apaches ssl_module。您可以在 Apache 模块中找到它。

当您完成上述三个步骤后,退出并以管理员身份再次运行 wampserver 以实现更改。

    回到sendmail解压文件夹,右键sendmail.exe 转到其属性 -> 兼容性 -> 更改所有用户的设置 -> 兼容模式 [更改为 windows xp (service pack 3)] -> 以管理员身份运行此程序 [选中此选项]。

保存并应用。 我们必须这样做,以便每次调用 sendmail 应用程序时,它都会以管理员身份运行。

    现在我们需要配置我们的 gmail 帐户以使用此 sendmail 应用程序。 登录 gmail 帐户,然后在右上角单击齿轮以选择设置。在设置中移动到转发和 POP/IMAP 选项卡并启用 IMAP。保存更改

    最后回到你的收件箱,在你邮箱地址的右上角有个向下的小箭头,点击它选择我的账户。如果没有,您可以尝试点击您的个人资料图片,从那里选择我的帐户。

单击登录和安全选项卡并向下滚动到页面底部。您会发现允许不太安全的应用程序:并将其打开。大多数情况下,这将被关闭。

    这就是您需要做的所有事情,您现在可以从本地主机上的 php 脚本发送电子邮件。您现在可以尝试使用最少 4 个参数的 mail() 函数并查看。希望这可以帮助。如果有帮助,请投票,这样我就可以花时间发布更多有趣的解决方案。

【讨论】:

非常广泛的答案,它有效。非常感谢@linuxhini !! 非常适合我,在带有 XAMPP 的 Windows 10 中。由于 XAMPP 自带 sendmail,所以我跳过了第 1、2、9 和 10 步。【参考方案3】:

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

【讨论】:

【参考方案4】:

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

【讨论】:

如果有人在经历了从不支持 smtp 的系统尝试 mail() 的全部麻烦之后来到这里,这个工具可以省去头痛。【参考方案5】:

尝试为本地主机设置邮件服务器。否则它将无法在 localhost 中运行。

【讨论】:

这应该是公认的答案。它完全有效【参考方案6】:

我发现在 Windows 中创建邮件服务器的最简单方法是安装 Python,然后使用内置的 SMTP 调试服务器和以下单行:

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

在 Windows 上,我发现它有时对 localhost 和 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

Telnet 在 Linux 上是免费的,但要在 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 命令并在此处发送邮件,或者您可以输入“退出”以断开与服务器的连接。

【讨论】:

以上是关于本地主机上的 php mail() 函数的主要内容,如果未能解决你的问题,请参考以下文章

在本地主机上运行现有 PHP 网站时出现空白屏幕 [重复]

如何检测用户是不是在 PHP 中的本地主机上?

本地主机上的 PHP 文件禁止访问 [关闭]

在 PHP 脚本上运行 Cron 作业,在 Windows 的本地主机上

如何删除本地主机上上传的文件以及 PHP 中的用户帐户

本地主机上的 MySQL 连接被拒绝