<?php
$name = $_POST['name'];
$email = $_POST['email'];
$message = $_POST['message'];
$from = 'From: yoursite.com';
$to = 'contact@yoursite.com';
$subject = 'Customer Inquiry';
$body = "From: $name\n E-Mail: $email\n Message:\n $message";
if ($_POST['submit']) {
if (mail ($to, $subject, $body, $from)) {
echo '<p>Your message has been sent!</p>';
} else {
echo '<p>Something went wrong, go back and try again!</p>';
}
}
?>
我试过创建一个简单的邮件表单 . 表单本身在我的 index.html
页面上,但是提交到单独的"thank you for your submission"页面 thankyou.php
,其中嵌入了上面的PHP代码 . 代码提交完美,但从不发送电子邮件 . 请帮忙 .
24 回答
大多数情况下,
mail()
功能在共享主机中被禁用 . 更好的选择是使用SMTP . 最好的选择是Gmail或SendGrid .SMTPconfig.php
SMTPmail.php
contact_email.php
对于任何发现这种情况的人,我不建议使用
mail
. 有一些答案涉及到这一点,但不是 why .PHP的
mail
函数不仅不透明,它完全依赖于您使用的任何MTA(即Sendmail)来完成工作 .mail
只会告诉您MTA是否未能接受它(即当您尝试发送时Sendmail已关闭) . 它无法告诉你邮件是否成功,因为它回答了详细信息),你现在可以摆弄MTA的日志,并希望它足以告诉你有关未能修复它的信息 . 如果你有权访问MTA日志,那你就不走运了 . 遗憾的是,Linux的大多数vanilla安装的默认设置都是这样处理的 .邮件库(PHPMailer,Zend Framework 2等)与
mail
有很大不同 . 他们所做的是直接打开接收邮件服务器的套接字,然后直接通过该套接字发送SMTP邮件命令 . 换句话说,该类充当其自己的MTA(请注意,您可以告诉库使用mail
最终发送邮件,但我强烈建议您不要这样做) .这对您来说意味着您可以直接看到来自接收服务器的响应(例如,在PHPMailer中,您可以turn on debugging output) . 不再猜测邮件是否发送失败或原因 .
您还可以获得更好的界面 . 使用
mail
,您必须设置所有 Headers ,附件等 . 使用库,您可以使用专用函数来完成此操作 . 这也意味着该功能正在完成所有棘手的部分(如 Headers ) .只需在发送邮件之前添加一些 Headers :
还有一件事 .
mail()
函数在localhost中不起作用 . 将代码上传到服务器并尝试 .通过执行以下操作,它在000webhost上为我工作:
发送电子邮件时直接输入电子邮件地址
使用
''
而不是""
此代码有效,但收到的电子邮件滞后半小时
如果仅使用
mail()
函数,则需要完成配置文件 .您需要打开邮件扩展,并设置
SMTP smtp_port
等,最重要的是,设置您的用户名和密码 . 没有它,就无法发送邮件 . 此外,您可以使用PHPMail类发送 .你使用SMTP配置发送你的电子邮件?尝试使用phpmailer . 您可以从https://github.com/PHPMailer/PHPMailer下载该库 . 我用这种方式创建了我的电子邮件:
如果您在本地服务器(即用于开发目的的计算机)上运行此代码,它将不会将电子邮件发送给收件人 . 会发生什么,它将在名为
mailoutput
的文件夹中创建.txt
文件 .如果您使用的是免费的软管服务,如
000webhost
或hostinger
,那些服务提供商会禁用mail()
功能,以防止意外使用电子邮件欺骗,垃圾邮件等 . 我希望您与他们联系,看看他们是否支持此功能 .如果您确定服务提供商支持mail()函数,您可以查看此PHP手册以获取进一步的参考,PHP mail()
要检查托管服务支持mail()函数的天气,请尝试运行此代码, (Remember to change the recipient email address)
希望这有帮助 .
虽然此答案的某些部分仅适用于
mail()
函数本身的使用,但许多故障排除步骤可应用于任何PHP邮件系统 .您的脚本似乎没有发送电子邮件的原因有多种 . 除非出现明显的语法错误,否则很难诊断这些事情 . 如果没有,您需要查看下面的清单,找出您可能遇到的任何潜在陷阱 .
确保启用错误报告并设置为报告所有错误
错误报告对于根除代码中的错误和PHP遇到的一般错误至关重要 . 需要启用错误报告才能接收这些错误 . 将以下代码放在PHP文件的顶部(或主配置文件中)将启用错误报告 .
有关详细信息,请参阅this Stack Overflow answer .
确保调用mail()函数
这可能看起来很愚蠢但是常见的错误就是忘记了实际上将
mail()
函数放在代码中 . 确保它在那里,没有注释掉 .确保正确调用mail()函数
邮件功能需要三个必需参数,可选择第四个和第五个参数 . 如果您对
mail()
的调用至少没有三个参数,则会失败 .如果您对
mail()
的调用没有正确顺序的正确参数,它也将失败 .检查服务器的邮件日志
您的Web服务器应记录所有通过它发送电子邮件的尝试 . 这些日志的位置会有所不同(您可能需要向服务器管理员询问它们所在的位置),但通常可以在
logs
下的用户根目录中找到它们 . 内部将是服务器报告的错误消息(如果有),与您尝试发送电子邮件有关 .检查端口连接失败
端口块是一个非常常见的问题,大多数开发人员在整合他们的代码以使用SMTP传递电子邮并且,这可以在服务器maillogs上轻松跟踪(邮件日志服务器的位置可能因服务器而异,如上所述) . 如果您在共享主机服务器上,默认情况下端口25和587仍然处于阻止状态 . 此块是由您的托管服务提供商专门完成的 . 即使对于某些专用服务器也是如此 . 当这些端口被阻止时,尝试使用端口2525进行连接 . 如果您发现该端口也被阻止,那么唯一的解决方案是联系您的托管服务提供商以取消阻止这些端口 .
大多数托管服务提供商阻止这些电子邮件端口,以保护他们的网络不发送任何垃圾邮件 .
端口25或587用于普通/ TLS连接,端口465用于SSL连接 . 对于大多数用户,建议使用端口587来避免某些主机提供商设置的速率限制 .
不要使用错误抑制运算符
当error suppression operator
@
被添加到PHP中的表达式之前,将忽略该表达式可能生成的任何错误消息 . 在某些情况下,使用此运算符是必要的,但发送邮件不是其中之一 .如果您的代码包含
@mail(...)
,那么您可能隐藏了可帮助您调试此错误的重要错误消息 . 删除@
并查看是否报告了任何错误 .只有在事后发生具体故障时才建议这样做 .
检查mail()返回值
mail()功能:
这一点很重要,因为:
如果收到
FALSE
返回值,则表示错误在于服务器接受您的邮件 . 这可能不是编码问题,而是服务器配置问题 . 您需要与系统管理员联系,以了解发生这种情况的原因 .如果您收到
TRUE
返回值,则表示您的电子邮件肯定会被发送 . 它只是意味着PHP通过PHP成功将电子邮件发送到服务器上的各自处理程序 . PHP控制之外还有更多的失败点可能导致电子邮件无法发送 .因此
FALSE
将帮助您指向正确的方向,而TRUE
并不一定意味着您的电子邮件已成功发送 . 这一点很重要!确保您的托管服务提供商允许您发送电子邮件,但不限制邮件发送
许多共享的虚拟主机,特别是免费的虚拟主机提供商,不允许从其服务器发送电子邮件或限制在任何给定时间段内可以发送的金额 . 这是因为他们努力限制垃圾邮件发送者利用他们更便宜的服务 .
如果您认为主持人有电子邮件限制或阻止发送电子邮件,请查看他们的常见问题解答,看看他们是否列出了任何此类限制 . 否则,您可能需要联系他们的支持,以验证发送电子邮件是否存在任何限制 .
检查垃圾邮件文件夹;防止电子邮件被标记为垃圾邮件
通常,由于各种原因,通过PHP(和其他服务器端编程语言)发送的电子邮件最终会出现在收件人的垃圾邮件文件夹中 . 在排除代码故障之前,请务必检查 .
为了避免通过PHP发送的邮件被发送到收件人的垃圾邮件文件夹,您可以使用PHP代码和其他方式执行各种操作,以最大限度地减少将电子邮件标记为垃圾邮件的可能性 . 来自Michiel de Mare的好建议包括:
有关此主题的更多信息,请参见How do you make sure email you send programmatically is not automatically marked as spam? .
确保提供所有邮件 Headers
如果邮件丢失了常见 Headers ,例如“发件人”和“回复”,则某些垃圾邮件软件会拒绝邮件:
确保邮件标头没有语法错误
无效的标头与没有标头一样糟糕 . 一个不正确的角色可能只是让您的电子邮件脱轨 . 仔细检查以确保您的语法正确,因为PHP不会为您捕获这些错误 .
确保收件人值正确无误
有时,问题就像电子邮件收件人的值不正确一样简单 . 这可能是由于使用了不正确的变量 .
另一种测试方法是将收件人值硬编码到
mail()
函数调用中:这可以应用于所有
mail()
参数 .发送到多个帐户
要帮助排除电子邮件帐户问题,请将您的电子邮件发送到不同电子邮件提供商的多个电子邮如果您的电子邮件未到达用户的Gmail帐户,请将相同的电子邮件发送到Yahoo帐户,Hotmail帐户和常规POP3帐户(例如ISP提供的电子邮件帐户) .
如果电子邮件到达所有或部分其他电子邮件帐户,您知道您的代码正在发送电子邮件,但电子邮件帐户提供商很可能因某些原因阻止了这些电子邮件 . 如果电子邮件未到达任何电子邮件帐户,则问题更可能与您的代码相关 .
确保代码与表单方法匹配
如果您已将表单方法设置为
POST
,请确保使用$_POST
查找表单值 . 如果您已将其设置为GET
或根本未设置它,请确保使用$_GET
查找表单值 .确保您的表单操作值指向正确的位置
确保您的表单
action
属性包含指向您的PHP邮件代码的值 .确保Web主机支持发送电子邮件
某些Web托管提供商不允许或允许通过其服务器发送电子邮件 . 原因可能有所不同,但如果他们禁止发送邮件,您将需要使用另一种方法,使用第三方为您发送这些电子邮件 .
发送给他们的技术支持的电子邮件(在访问其在线支持或常见问题解答之后)应说明您的服务器上是否有可用的电子邮件功能 .
确保已配置localhost邮件服务器
如果使用WAMP,MAMP或XAMPP在本地工作站上进行开发,则可能未在工作站上安装电子邮件服务器 . 如果没有,PHP默认情况下无法发送邮件 .
您可以通过安装基本邮件服务器来解决此问题 . 对于Windows,您可以使用免费的Mercury Mail .
您也可以使用SMTP发送电子邮件 . 请参阅Vikas Dwivedi的this great answer以了解如何执行此操作 .
启用PHP的自定义mail.log
除了MTA 's and PHP' s日志文件之外,您还可以专门启用logging for the mail() function . 它不记录完整的SMTP交互,但至少记录函数调用参数和调用脚本 .
有关详细信息,请参阅http://php.net/manual/en/mail.configuration.php . (最好在
php.ini
或.user.ini
或.htaccess
中启用这些选项 . )检查邮件测试服务
您可以使用各种传递和垃圾邮件检查服务来测试您的MTA / Web服务器设置 . 通常,您将邮件探测发送到:他们的地址,然后获取发送报告以及更具体的故障或分析:
mail-tester.com(免费/简单)
glockapps.com(免费/ $$$)
senforensics.com(注册/ $$$)
mailtrap.io(亲/ $$$)
ultratools/…/emailTest(仅限免费/ MX支票)
各种:http://www.verticalresponse.com/blog/7-email-testing-delivery-tools/
使用其他邮件程序
PHP的内置
mail()
函数很方便,通常可以完成工作,但它has its shortcomings . 幸运的是,有一些替代方案可提供更多功能和灵活性,包括处理上述许多问题:最受欢迎的是:PHPMailer
同样特色:SwiftMailer
甚至更老的PEAR::Mail .
所有这些都可以与专业的SMTP服务器/服务提供商结合使用 . (因为在电子邮件设置/可配置性方面,典型的08/15共享虚拟主机计划会受到影响 . )
我认为这应该可以解决问题 . 我刚刚添加了一个
if(isset
并添加了连接正文中的变量将PHP与HTML分开 .如果您在使用PHP发送邮件时遇到问题,请考虑使用PHPMailer或SwiftMailer之类的替代方案 .
每当我需要用PHP发送邮件时,我通常都会使用SwiftMailer .
基本用法:
有关如何使用SwiftMailer的更多信息,请参见the official documentation .
您可以使用libmail:http://lwest.free.fr/doc/php/lib/index.php3?page=mail&lang=en
您可以使用empty()和isset()函数 . 如果你想使它适用于不同的文件,只需将
action='yourphp.php'
修改为我给你的html,并将store the PHP script
修改为yourphp.php
文件 . 您还需要将index.html
更改为index.php
以激活PHP功能 .PHP
HTML
最好的祝福!
试试这个
试试这个
也许问题是邮件服务器的配置,为了避免这类问题或者您不必担心邮件服务器问题,我建议您使用PHPMailer,它是一个插件,具有发送邮件所需的一切,唯一您必须考虑的事情是启用SMTP端口(端口:25和465)
Make sure you have Sendmail installed in your server.
如果您已检查代码并验证其中没有任何错误,请转至/ var / mail并检查该文件夹是否为空 .
如果它是空的,你需要做一个:
如果你在Ubuntu服务器上 .
For those who do not want to use external mailers and want to mail() on a dedicated linux server.
关于php邮件的方式,在
php.ini
的[mail function]
部分中描述 . 参数sendmail-path
描述了如何调用sendmail . 默认值是sendmail -t -i
,所以如果你在linux控制台中工作sendmail -t -i < message.txt
,你就完成了 . 你也可以添加mail.log
来调试,并确保真正调用mail() .不同的MTA可以实现
sendmail
,它们只是在该名称上对其二进制文件进行符号链接 . 例如,debian默认为postfix . 配置MTA以发送邮件并使用sendmail -v -t -i < message.txt
从控制台进行测试 . 文件message.txt
应包含邮件和正文的所有 Headers ,信封的目标地址将取自To:
Headers . 例:我更喜欢使用 ssmtp 作为MTA,因为它很简单,不需要在打开的端口上运行守护进程 . ssmtp仅适用于从本地主机发送邮件,它还可以通过您的帐户在公共邮件服务上发送经过身份验证的电子邮件 . 安装ssmtp并编辑config
/etc/ssmtp/ssmtp.conf
. 为了能够将本地系统邮件恢复到unix帐户(例如,从cron作业向root发送警报),请配置/etc/ssmtp/revaliases
文件 .这是我在Yandex邮件上的帐户配置:
首先,
mail()函数可能有很多参数...你最多可以有5个参数 .
mail(to,subject,message,headers,parameters);
就$from
变量而言,如果你使用的是linux cPanel,它应该自动来自你的webhost . 它自动来自您的cPanel用户名和IP地址 .还要确保mail()函数中的变量顺序正确 . 按顺序
mail($to,$subject,$message,etc.)
,否则它有可能无效 . 如果这有帮助,请告诉我......这只会影响少数几个用户,但我希望能够记录下这一小部分用户 . 由于这个问题,这一小部分成员花了6个小时对正在运行的PHP邮件脚本进行故障排除 .
如果您要去www.AceITLab.com运营XAMPP的大学,您应该知道我们的教授没有告诉我们:AceITLab防火墙(不是Windows防火墙)会阻止XAMPP中的MercuryMail . 你必须使用另一个邮件客户端,梨正在为我们工作 . 您必须发送到安全设置较低的Gmail帐户 .
是的,我知道,这对现实世界的电子邮件完全没用 . 然而,从我所看到的,学术环境和现实世界往往没有什么共同之处 .
在邮件功能中添加邮件 Headers
你可以使用codeigniter配置电子邮件,例如使用smtp(简单方法):
它对我有用!
分别尝试这两个thigs:
删除
if($_POST['submit']){}
删除
$from
(只是我的直觉)始终尝试在邮件功能中发送 Headers .
如果您通过localhost发送邮件,请执行smtp设置以发送邮件 .
如果要通过服务器发送邮件,请检查服务器上是否启用了电子邮件发送功能 .