PHP邮件功能无法完成电子邮件的发送

 圣峰冰寒_869 发布于 2023-01-04 14:10

虽然这个答案的某些部分仅适用于mail()函数本身的使用,但许多故障排除步骤都可以应用于任何PHP邮件系统.

您的脚本似乎没有发送电子邮件的原因有多种.除非有明显的语法错误,否则很难诊断这些事情.如果没有一个,您需要查看下面的清单,找出您可能遇到的任何潜在陷阱.

确保启用错误报告并将其设置为报告所有错误

错误报告对于根除代码中的错误和PHP遇到的常规错误至关重要.需要启用错误报告才能接收这些错误.将以下代码放在PHP文件的顶部(或主配置文件中)将启用错误报告.

error_reporting(-1);
ini_set('display_errors', 'On');
set_error_handler("var_dump");

有关详细信息,请参阅此Stack Overflow答案.

确保mail()调用该函数

它可能看起来很愚蠢,但常见的错误是忘记将mail()函数实际放在代码中.确保它在那里,没有注释掉.

确保mail()正确调用该函数

bool mail(string $ to,string $ subject,string $ message [,string $ additional_headers [,string $ additional_parameters]])

邮件功能需要三个必需参数,可选择第四个和第五个参数.如果您的呼叫mail()至少没有三个参数,则会失败.

如果您的呼叫mail()没有正确顺序的正确参数,它也将失败.

检查服务器的邮件日志

您的Web服务器应记录所有通过它发送电子邮件的尝试.这些日志的位置会有所不同(您可能需要向服务器管理员询问它们所在的位置),但通常可以在用户的​​根目录下找到它们logs.内部将是服务器报告的错误消息(如果有),与您尝试发送电子邮件有关.

检查端口连接故障

端口块是一个非常常见的问题,大多数开发人员在整合其代码以使用SMTP传递电子邮件时面临这一问题 并且,这可以在服务器maillogs上轻松跟踪(邮件日志服务器的位置因服务器而异,如上所述).如果您在共享主机服务器上,默认情况下端口25和587仍然处于阻止状态.此块是由您的托管服务提供商专门完成的.即使对于某些专用服务器也是如此.当这些端口被阻止时,尝试使用端口2525进行连接.如果您发现该端口也被阻止,那么唯一的解决方案是联系您的托管服务提供商以取消阻止这些端口.

大多数托管服务提供商阻止这些电子邮件端口,以保护他们的网络不发送任何垃圾邮件.

端口25或587用于普通/ TLS连接,端口465用于SSL连接.对于大多数用户,建议使用端口587来避免某些主机提供商设置的速率限制.

不要使用错误抑制运算符

当错误抑制运算符 @被添加到PHP中的表达式之前,将忽略该表达式可能生成的任何错误消息.在某些情况下,使用此运算符是必要的,但发送邮件不是其中之一.

如果您的代码包含,@mail(...)那么您可能会隐藏重要的错误消息,这些消息将帮助您进行调试.删除@并查看是否报告任何错误.

只有在事后检查error_get_last()具体故障时才建议这样做.

检查mail()返回值

mail()函数:

TRUE如果邮件已成功接受传递,FALSE则返回,否则返回.重要的是要注意,仅仅因为邮件被接受传递,并不意味着邮件实际上将到达预定目的地.

这一点很重要,因为:

如果您收到FALSE返回值,则表示错误在于您的服务器接受您的邮件.这可能不是编码问题,而是服务器配置问题.您需要与系统管理员联系,以了解发生这种情况的原因.

如果您收到TRUE返回值,则并不意味着您的电子邮件肯定会被发送.它只是意味着电子邮件已成功通过PHP发送到服务器上的各自处理程序.PHP控件之外还有更多的失败点可能导致电子邮件无法发送.

因此,FALSE有助于指出您正确的方向,TRUE并不一定意味着您的电子邮件已成功发送.这一点很重要!

确保您的托管服务提供商允许您发送电子邮件,但不限制邮件发送

许多共享的虚拟主机,特别是免费的虚拟主机提供商,要么不允许从服务器发送电子邮件,要么限制在任何给定时间段内可以发送的数量.这是因为他们努力限制垃圾邮件发送者利用他们更便宜的服务.

如果您认为主持人有电子邮件限制或阻止发送电子邮件,请查看他们的常见问题解答,看看他们是否列出了任何此类限制.否则,您可能需要联系他们的支持,以验证是否有任何限制发送电子邮件.

检查垃圾邮件文件 防止电子邮件被标记为垃圾邮件

通常,由于各种原因,通过PHP(和其他服务器端编程语言)发送的电子邮件最终会出现在收件人的垃圾邮件文件夹中.在排除代码故障之前,请务必检查

为了避免通过PHP发送的邮件被发送到收件人的垃圾邮件文件夹,您可以在PHP代码和其他方面做各种事情,以最大限度地减少电子邮件被标记为垃圾邮件的可能性.Michiel de Mare的好建议包括:

使用电子邮件身份验证方法(如SPF和DKIM)来证明您的电子邮件和域名属于一起,并防止欺骗您的域名.SPF网站包含一个向您生成站点DNS信息的向导.

检查您的反向DNS,以确保您的邮件服务器指向的IP地址,您用于发送邮件的域名.

确保您使用的IP地址不在黑名单中

确保回复地址是有效的现有地址.

在"收件人"字段中使用收件人的完整真实姓名,而不仅仅是电子邮件地址(例如"John Smith" ).

监控您的滥用帐户,例如abuse@yourdomain.com和postmaster@yourdomain.com.这意味着 - 确保这些帐户存在,阅读发送给他们的内容,并根据投诉采取行动.

最后,让取消订阅真的很容易.否则,您的用户将通过按垃圾邮件按钮取消订阅,这将影响您的声誉.

请参阅如何确保以编程方式发送的电子邮件不会自动标记为垃圾邮件?有关此主题的更多信息.

确保提供所有邮件标头

如果邮件丢失了常见标题,例如"发件人"和"回复",则某些垃圾邮件软件会拒绝邮件:

$headers = array("From: from@example.com",
    "Reply-To: replyto@example.com",
    "X-Mailer: PHP/" . PHP_VERSION
);
$headers = implode("\r\n", $headers);
mail($to, $subject, $message, $headers);
确保邮件标头没有语法错误

无效的标头与没有标头一样糟糕.一个不正确的角色可能只是让您的电子邮件脱轨.仔细检查以确保您的语法正确,因为PHP 不会为您捕获这些错误.

$headers = array("From from@example.com", // missing colon
    "Reply To: replyto@example.com",      // missing hyphen
    "X-Mailer: "PHP"/" . PHP_VERSION      // bad quotes
);
确保收件人值正确无误

有时,问题就像电子邮件收件人的值不正确一样简单.这可能是由于使用了不正确的变量.

$headers = array("From: $_POST[contactform_sender_email]"); // No!

另一种测试方法是将接收者值硬编码到From:函数调用中:

$to = 'user@example.com';
// other variables ....
mail($recipient, $subject, $message, $headers); // $recipient should be $to

这可以适用于所有From:参数.

发送到多个帐户

为了帮助排除电子邮件帐户的问题,发送电子邮件到多个电子邮件帐户在不同的电子邮件提供商.如果您的电子邮件未到达用户的Gmail帐户,请将相同的电子邮件发送到Yahoo帐户,Hotmail帐户和常规POP3帐户(如ISP提供的电子邮件帐户).

如果电子邮件到达所有或部分其他电子邮件帐户,您知道您的代码正在发送电子邮件,但电子邮件帐户提供商很可能因某些原因阻止了这些电子邮件.如果电子邮件未到达任何电子邮件帐户,则问题更可能与您的代码有关.

确保代码与表单方法匹配

如果您已将表单方法设置为mail(),请确保使用mail()以查找表单值.如果您已将其设置为POST或根本未设置,请确保使用$_POST查找表单值.

确保您的表单GET值指向正确的位置

确保您的表单$_GET属性包含指向PHP邮件代码的值.

mail('user@example.com', $subject, $message, $headers); 
确保Web主机支持发送电子邮件

某些Web托管服务提供商不允许或启用通过其服务器发送电子邮件.原因可能有所不同,但如果他们禁止发送邮件,您将需要使用另一种方法,使用第三方为您发送这些电子邮件.

发送给他们的技术支持的电子邮件(在他们的在线支持或常见问题解答之后)应该澄清您的服务器上是否有电子邮件功能.

确保action已配置邮件服务器

如果使用WAMP,MAMP或XAMPP在本地工作站上进行开发,则可能未在工作站上安装电子邮件服务器.如果没有,PHP默认情况下无法发送邮件.

您可以通过安装基本邮件服务器来解决此问题.对于Windows,您可以使用免费的Mercury Mail.

您也可以使用SMTP发送电子邮件.见这个伟大的答案从维卡斯Dwivedi学习如何做到这一点.

启用PHP的自定义 action

除了MTA和PHP的日志文件之外,您还可以专门为该localhost功能启用日志记录.它不记录完整的SMTP交互,但至少记录函数调用参数和调用脚本.

有关详细信息,请参见http://php.net/manual/en/mail.configuration.php.(最好在mail.log或者mail()或者php.ini可能启用这些选项.)

查看邮件测试服务

您可以使用各种传递和垃圾邮件检查服务来测试您的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的内置.user.ini功能非常方便,通常可以完成工作,但它有其缺点.幸运的是,有一些替代方案可提供更多功能和灵活性,包括处理上述许多问题:

最受欢迎的是:PHPMailer

同样特色:SwiftMailer

甚至是旧的PEAR :: Mail.

所有这些都可以与专业的SMTP服务器/服务提供商结合使用.(因为在电子邮件设置/可配置性方面,典型的08/15共享虚拟主机计划会受到影响.)

13 个回答
  • 通过执行以下操作,它在000webhost上为我工作:

    $headers  = "MIME-Version: 1.0" . "\r\n";
    $headers .= "Content-type: text/html; charset=iso-8859-1" . "\r\n";
    $headers .= "From: ". $from. "\r\n";
    $headers .= "Reply-To: ". $from. "\r\n";
    $headers .= "X-Mailer: PHP/" . phpversion();
    $headers .= "X-Priority: 1" . "\r\n";
    

    发送电子邮件时直接输入电子邮件地址

    mail('email@gmail.com', $subject, $message, $headers)
    

    使用''与否""

    此代码有效,但收到的电子邮件滞后半小时

    2023-01-04 14:11 回答
    1. 始终尝试在邮件功能中发送标题.

      如果您通过localhost发送邮件,请执行smtp设置以发送邮件.

      如果您通过服务器发送邮件,请检查服务器上是否启用了电子邮件发送功能.

    2023-01-04 14:11 回答
  • 您使用SMTP配置发送电子邮件吗?尝试使用phpmailer.您可以从https://github.com/PHPMailer/PHPMailer下载该库.我用这种方式创建了我的电子邮件:

    function send_mail($email, $recipient_name, $message='')
    {
        require("phpmailer/class.phpmailer.php");
    
        $mail = new PHPMailer();
    
        $mail->CharSet = "utf-8";
        $mail->IsSMTP();                                      // Set mailer to use SMTP
        $mail->Host = "mail.example.com";  // Specify main and backup server
        $mail->SMTPAuth = true;     // Turn on SMTP authentication
        $mail->Username = "myusername";  // SMTP username
        $mail->Password = "p@ssw0rd"; // SMTP password
    
        $mail->From = "me@walalang.com";
        $mail->FromName = "System-Ad";
        $mail->AddAddress($email, $recipient_name);
    
        $mail->WordWrap = 50;                                 // Set word wrap to 50 characters
        $mail->IsHTML(true);                                  // Set email format to HTML (true) or plain text (false)
    
        $mail->Subject = "This is a Sampleenter code here Email";
        $mail->Body    = $message;
        $mail->AltBody = "This is the body in plain text for non-HTML mail clients";
        $mail->AddEmbeddedImage('images/logo.png', 'logo', 'logo.png');
        $mail->addAttachment('files/file.xlsx');
    
        if(!$mail->Send())
        {
           echo "Message could not be sent. <p>";
           echo "Mailer Error: " . $mail->ErrorInfo;
           exit;
        }
    
        echo "Message has been sent";
    }
    

    2023-01-04 14:11 回答
  • 我认为这应该可以解决问题.我刚加了一个if(isset并添加了连接到正文中的变量以将PHP与HTML分开.

    <?php
        $name = $_POST['name'];
        $email = $_POST['email'];
        $message = $_POST['message'];
        $from = 'From: yoursite.com'; 
        $to = 'contact@yoursite.com'; 
        $subject = 'Customer Inquiry';
        $body = "From:" .$name."\r\n E-Mail:" .$email."\r\n Message:\r\n" .$message;
    
    if (isset($_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>'; 
        }
    }
    
    ?>
    

    2023-01-04 14:11 回答
  • 虽然这个答案的某些部分仅适用于mail()函数本身的使用,但许多故障排除步骤都可以应用于任何PHP邮件系统.

    您的脚本似乎没有发送电子邮件的原因有多种.除非有明显的语法错误,否则很难诊断这些事情.如果没有一个,您需要查看下面的清单,找出您可能遇到的任何潜在陷阱.

    确保启用错误报告并将其设置为报告所有错误

    错误报告对于根除代码中的错误和PHP遇到的常规错误至关重要.需要启用错误报告才能接收这些错误.将以下代码放在PHP文件的顶部(或主配置文件中)将启用错误报告.

    error_reporting(-1);
    ini_set('display_errors', 'On');
    set_error_handler("var_dump");
    

    有关详细信息,请参阅此Stack Overflow答案.

    确保mail()调用该函数

    它可能看起来很愚蠢,但常见的错误是忘记将mail()函数实际放在代码中.确保它在那里,没有注释掉.

    确保mail()正确调用该函数

    bool mail(string $ to,string $ subject,string $ message [,string $ additional_headers [,string $ additional_parameters]])

    邮件功能需要三个必需参数,可选择第四个和第五个参数.如果您的呼叫mail()至少没有三个参数,则会失败.

    如果您的呼叫mail()没有正确顺序的正确参数,它也将失败.

    检查服务器的邮件日志

    您的Web服务器应记录所有通过它发送电子邮件的尝试.这些日志的位置会有所不同(您可能需要向服务器管理员询问它们所在的位置),但通常可以在用户的​​根目录下找到它们logs.内部将是服务器报告的错误消息(如果有),与您尝试发送电子邮件有关.

    检查端口连接故障

    端口块是一个非常常见的问题,大多数开发人员在整合其代码以使用SMTP传递电子邮件时面临这一问题 并且,这可以在服务器maillogs上轻松跟踪(邮件日志服务器的位置因服务器而异,如上所述).如果您在共享主机服务器上,默认情况下端口25和587仍然处于阻止状态.此块是由您的托管服务提供商专门完成的.即使对于某些专用服务器也是如此.当这些端口被阻止时,尝试使用端口2525进行连接.如果您发现该端口也被阻止,那么唯一的解决方案是联系您的托管服务提供商以取消阻止这些端口.

    大多数托管服务提供商阻止这些电子邮件端口,以保护他们的网络不发送任何垃圾邮件.

    端口25或587用于普通/ TLS连接,端口465用于SSL连接.对于大多数用户,建议使用端口587来避免某些主机提供商设置的速率限制.

    不要使用错误抑制运算符

    当错误抑制运算符 @被添加到PHP中的表达式之前,将忽略该表达式可能生成的任何错误消息.在某些情况下,使用此运算符是必要的,但发送邮件不是其中之一.

    如果您的代码包含,@mail(...)那么您可能会隐藏重要的错误消息,这些消息将帮助您进行调试.删除@并查看是否报告任何错误.

    只有在事后检查error_get_last()具体故障时才建议这样做.

    检查mail()返回值

    mail()函数:

    TRUE如果邮件已成功接受传递,FALSE则返回,否则返回.重要的是要注意,仅仅因为邮件被接受传递,并不意味着邮件实际上将到达预定目的地.

    这一点很重要,因为:

    如果您收到FALSE返回值,则表示错误在于您的服务器接受您的邮件.这可能不是编码问题,而是服务器配置问题.您需要与系统管理员联系,以了解发生这种情况的原因.

    如果您收到TRUE返回值,则并不意味着您的电子邮件肯定会被发送.它只是意味着电子邮件已成功通过PHP发送到服务器上的各自处理程序.PHP控件之外还有更多的失败点可能导致电子邮件无法发送.

    因此,FALSE有助于指出您正确的方向,TRUE并不一定意味着您的电子邮件已成功发送.这一点很重要!

    确保您的托管服务提供商允许您发送电子邮件,但不限制邮件发送

    许多共享的虚拟主机,特别是免费的虚拟主机提供商,要么不允许从服务器发送电子邮件,要么限制在任何给定时间段内可以发送的数量.这是因为他们努力限制垃圾邮件发送者利用他们更便宜的服务.

    如果您认为主持人有电子邮件限制或阻止发送电子邮件,请查看他们的常见问题解答,看看他们是否列出了任何此类限制.否则,您可能需要联系他们的支持,以验证是否有任何限制发送电子邮件.

    检查垃圾邮件文件 防止电子邮件被标记为垃圾邮件

    通常,由于各种原因,通过PHP(和其他服务器端编程语言)发送的电子邮件最终会出现在收件人的垃圾邮件文件夹中.在排除代码故障之前,请务必检查

    为了避免通过PHP发送的邮件被发送到收件人的垃圾邮件文件夹,您可以在PHP代码和其他方面做各种事情,以最大限度地减少电子邮件被标记为垃圾邮件的可能性.Michiel de Mare的好建议包括:

    使用电子邮件身份验证方法(如SPF和DKIM)来证明您的电子邮件和域名属于一起,并防止欺骗您的域名.SPF网站包含一个向您生成站点DNS信息的向导.

    检查您的反向DNS,以确保您的邮件服务器指向的IP地址,您用于发送邮件的域名.

    确保您使用的IP地址不在黑名单中

    确保回复地址是有效的现有地址.

    在"收件人"字段中使用收件人的完整真实姓名,而不仅仅是电子邮件地址(例如"John Smith" <john@blacksmiths-international.com>).

    监控您的滥用帐户,例如abuse@yourdomain.com和postmaster@yourdomain.com.这意味着 - 确保这些帐户存在,阅读发送给他们的内容,并根据投诉采取行动.

    最后,让取消订阅真的很容易.否则,您的用户将通过按垃圾邮件按钮取消订阅,这将影响您的声誉.

    请参阅如何确保以编程方式发送的电子邮件不会自动标记为垃圾邮件?有关此主题的更多信息.

    确保提供所有邮件标头

    如果邮件丢失了常见标题,例如"发件人"和"回复",则某些垃圾邮件软件会拒绝邮件:

    $headers = array("From: from@example.com",
        "Reply-To: replyto@example.com",
        "X-Mailer: PHP/" . PHP_VERSION
    );
    $headers = implode("\r\n", $headers);
    mail($to, $subject, $message, $headers);
    

    确保邮件标头没有语法错误

    无效的标头与没有标头一样糟糕.一个不正确的角色可能只是让您的电子邮件脱轨.仔细检查以确保您的语法正确,因为PHP 不会为您捕获这些错误.

    $headers = array("From from@example.com", // missing colon
        "Reply To: replyto@example.com",      // missing hyphen
        "X-Mailer: "PHP"/" . PHP_VERSION      // bad quotes
    );
    

    确保收件人值正确无误

    有时,问题就像电子邮件收件人的值不正确一样简单.这可能是由于使用了不正确的变量.

    $headers = array("From: $_POST[contactform_sender_email]"); // No!
    

    另一种测试方法是将接收者值硬编码到From:函数调用中:

    $to = 'user@example.com';
    // other variables ....
    mail($recipient, $subject, $message, $headers); // $recipient should be $to
    

    这可以适用于所有From:参数.

    发送到多个帐户

    为了帮助排除电子邮件帐户的问题,发送电子邮件到多个电子邮件帐户在不同的电子邮件提供商.如果您的电子邮件未到达用户的Gmail帐户,请将相同的电子邮件发送到Yahoo帐户,Hotmail帐户和常规POP3帐户(如ISP提供的电子邮件帐户).

    如果电子邮件到达所有或部分其他电子邮件帐户,您知道您的代码正在发送电子邮件,但电子邮件帐户提供商很可能因某些原因阻止了这些电子邮件.如果电子邮件未到达任何电子邮件帐户,则问题更可能与您的代码有关.

    确保代码与表单方法匹配

    如果您已将表单方法设置为mail(),请确保使用mail()以查找表单值.如果您已将其设置为POST或根本未设置,请确保使用$_POST查找表单值.

    确保您的表单GET值指向正确的位置

    确保您的表单$_GET属性包含指向PHP邮件代码的值.

    mail('user@example.com', $subject, $message, $headers); 
    

    确保Web主机支持发送电子邮件

    某些Web托管服务提供商不允许或启用通过其服务器发送电子邮件.原因可能有所不同,但如果他们禁止发送邮件,您将需要使用另一种方法,使用第三方为您发送这些电子邮件.

    发送给他们的技术支持的电子邮件(在他们的在线支持或常见问题解答之后)应该澄清您的服务器上是否有电子邮件功能.

    确保action已配置邮件服务器

    如果使用WAMP,MAMP或XAMPP在本地工作站上进行开发,则可能未在工作站上安装电子邮件服务器.如果没有,PHP默认情况下无法发送邮件.

    您可以通过安装基本邮件服务器来解决此问题.对于Windows,您可以使用免费的Mercury Mail.

    您也可以使用SMTP发送电子邮件.见这个伟大的答案从维卡斯Dwivedi学习如何做到这一点.

    启用PHP的自定义 action

    除了MTA和PHP的日志文件之外,您还可以专门为该localhost功能启用日志记录.它不记录完整的SMTP交互,但至少记录函数调用参数和调用脚本.

    <form action="send_email.php" method="POST">
    

    有关详细信息,请参见http://php.net/manual/en/mail.configuration.php.(最好在mail.log或者mail()或者php.ini可能启用这些选项.)

    查看邮件测试服务

    您可以使用各种传递和垃圾邮件检查服务来测试您的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的内置.user.ini功能非常方便,通常可以完成工作,但它有其缺点.幸运的是,有一些替代方案可提供更多功能和灵活性,包括处理上述许多问题:

    最受欢迎的是:PHPMailer

    同样特色:SwiftMailer

    甚至是旧的PEAR :: Mail.

    所有这些都可以与专业的SMTP服务器/服务提供商结合使用.(因为在电子邮件设置/可配置性方面,典型的08/15共享虚拟主机计划会受到影响.)

    2023-01-04 14:11 回答
  • 如果您只使用该mail()功能,则需要完成配置文件.

    您需要打开邮件扩展,并设置SMTP smtp_port等等,最重要的是,您的用户名和密码.没有它,就无法发送邮件.此外,您可以使用PHPMail类发送.

    2023-01-04 14:12 回答
  • 在邮件功能中添加邮件标题

    $header = "From: noreply@example.com\r\n";
    $header.= "MIME-Version: 1.0\r\n";
    $header.= "Content-Type: text/html; charset=ISO-8859-1\r\n";
    $header.= "X-Priority: 1\r\n";
    
    $status = mail($to, $subject, $message, $header);
    
    if($status)
    {
        echo '<p>Your mail has been sent!</p>';
    } else {
        echo '<p>Something went wrong. Please try again!</p>';
    }
    

    2023-01-04 14:12 回答
  • 只需在发送邮件之前添加一些标题:

    <?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";
    
    $headers .= "MIME-Version: 1.0\r\n";
    $headers .= "Content-type: text/html\r\n";
    $headers .= 'From: from@example.com' . "\r\n" .
    'Reply-To: reply@example.com' . "\r\n" .
    'X-Mailer: PHP/' . phpversion();
    
    mail($to, $subject, $message, $headers);
    

    还有一件事.该mail()功能在localhost中不起作用.将您的代码上传到服务器并尝试.

    2023-01-04 14:12 回答
  • 分别和一起尝试这两个thigs:

      除掉 if($_POST['submit']){}

      删除$from(只是我的直觉)

    2023-01-04 14:12 回答
  • 大部分mail()功能在共享主机中被禁用.更好的选择是使用SMTP.最好的选择是Gmail或SendGrid.


    SMTPconfig.php

    <?php 
        $SmtpServer="smtp.*.*";
        $SmtpPort="2525"; //default
        $SmtpUser="***";
        $SmtpPass="***";
    ?>
    

    SMTPmail.php

    <?php
    class SMTPClient
    {
    
        function SMTPClient ($SmtpServer, $SmtpPort, $SmtpUser, $SmtpPass, $from, $to, $subject, $body)
        {
    
            $this->SmtpServer = $SmtpServer;
            $this->SmtpUser = base64_encode ($SmtpUser);
            $this->SmtpPass = base64_encode ($SmtpPass);
            $this->from = $from;
            $this->to = $to;
            $this->subject = $subject;
            $this->body = $body;
    
            if ($SmtpPort == "") 
            {
                $this->PortSMTP = 25;
            }
            else
            {
                $this->PortSMTP = $SmtpPort;
            }
        }
    
        function SendMail ()
        {
            $newLine = "\r\n";
            $headers = "MIME-Version: 1.0" . $newLine;  
            $headers .= "Content-type: text/html; charset=iso-8859-1" . $newLine;  
    
            if ($SMTPIN = fsockopen ($this->SmtpServer, $this->PortSMTP)) 
            {
                fputs ($SMTPIN, "EHLO ".$HTTP_HOST."\r\n"); 
                $talk["hello"] = fgets ( $SMTPIN, 1024 ); 
                fputs($SMTPIN, "auth login\r\n");
                $talk["res"]=fgets($SMTPIN,1024);
                fputs($SMTPIN, $this->SmtpUser."\r\n");
                $talk["user"]=fgets($SMTPIN,1024);
                fputs($SMTPIN, $this->SmtpPass."\r\n");
                $talk["pass"]=fgets($SMTPIN,256);
                fputs ($SMTPIN, "MAIL FROM: <".$this->from.">\r\n"); 
                $talk["From"] = fgets ( $SMTPIN, 1024 ); 
                fputs ($SMTPIN, "RCPT TO: <".$this->to.">\r\n"); 
                $talk["To"] = fgets ($SMTPIN, 1024); 
                fputs($SMTPIN, "DATA\r\n");
                $talk["data"]=fgets( $SMTPIN,1024 );
                fputs($SMTPIN, "To: <".$this->to.">\r\nFrom: <".$this->from.">\r\n".$headers."\n\nSubject:".$this->subject."\r\n\r\n\r\n".$this->body."\r\n.\r\n");
                $talk["send"]=fgets($SMTPIN,256);
                //CLOSE CONNECTION AND EXIT ... 
                fputs ($SMTPIN, "QUIT\r\n"); 
                fclose($SMTPIN); 
                // 
            } 
            return $talk;
        } 
    }
    ?>
    

    contact_email.php

    <?php 
    include('SMTPconfig.php');
    include('SMTPmail.php');
    if($_SERVER["REQUEST_METHOD"] == "POST")
    {
        $to = "";
        $from = $_POST['email'];
        $subject = "Enquiry";
        $body = $_POST['name'].'</br>'.$_POST['companyName'].'</br>'.$_POST['tel'].'</br>'.'<hr />'.$_POST['message'];
        $SMTPMail = new SMTPClient ($SmtpServer, $SmtpPort, $SmtpUser, $SmtpPass, $from, $to, $subject, $body);
        $SMTPChat = $SMTPMail->SendMail();
    }
    ?>
    

    2023-01-04 14:12 回答
  • 你可以使用codeigniter配置电子邮件,例如使用smtp(简单方法):

    $config = Array(
            'protocol' => 'smtp',
            'smtp_host' => 'mail.domain.com', // Your SMTP host
            'smtp_port' => 26, // Default port for SMTP
            'smtp_user' => 'name@domain.com',
            'smtp_pass' => 'password',
            'mailtype' => 'html',
            'charset' => 'iso-8859-1',
            'wordwrap' => TRUE
    );
    $message = 'Your msg';
    $this->load->library('email', $config);
    $this->email->from('name@domain.com', 'Title');
    $this->email->to('emaildestination@domain.com');
    $this->email->subject('Header');
    $this->email->message($message);
    
    if($this->email->send()) 
    {
       // Conditional true
    }
    

    它对我有用!

    2023-01-04 14:12 回答
  • $name = $_POST['name'];
    $email = $_POST['email'];
    $reciver = '/* Reciver Email address */';
    if (filter_var($reciver, FILTER_VALIDATE_EMAIL)) {
        $subject = $name;
        // To send HTML mail, the Content-type header must be set.
        $headers = 'MIME-Version: 1.0' . "\r\n";
        $headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
        $headers .= 'From:' . $email. "\r\n"; // Sender's Email
        //$headers .= 'Cc:' . $email. "\r\n"; // Carbon copy to Sender
        $template = '<div >Hello ,<br/>'
            . '<br/><br/>'
            . 'Name:' .$name.'<br/>'
            . 'Email:' .$email.'<br/>'
            . '<br/>'
            . '</div>';
        $sendmessage = "<div background-color:#7E7E7E; color:white;\">" . $template . "</div>";
        // Message lines should not exceed 70 characters (PHP rule), so wrap it.
        $sendmessage = wordwrap($sendmessage, 70);
        // Send mail by PHP Mail Function.
        mail($reciver, $subject, $sendmessage, $headers);
        echo "Your Query has been received, We will contact you soon.";
    } else {
        echo "<span>* invalid email *</span>";
    }
    

    2023-01-04 14:12 回答
  • 对于任何发现这种情况的人,我不建议使用mail.有一些答案涉及到这一点,但不是它的原因.

    PHP的mail功能不仅是不透明的,它完全依赖于您使用的任何MTA(即Sendmail)来完成工作.mail只会告诉您MTA是否未能接受它(即当您尝试发送时Sendmail已关闭).它无法告诉您邮件是否成功,因为它已被移交.因此(如John Conde的回答详细信息),您现在可以摆弄MTA的日志,并希望它足以告诉您未能修复它的问题.如果您在共享主机上或无法访问MTA日志,那么您将失去运气.遗憾的是,Linux的大多数vanilla安装的默认设置都是这样处理的.

    邮件库(PHPMailer,Zend Framework 2+等)做了很多不同的事情mail.他们所做的是直接打开接收邮件服务器的套接字,然后直接通过该套接字发送SMTP邮件命令.换句话说,该类充当其自己的MTA(请注意,您可以告诉库使用mail最终发送邮件,但我强烈建议您不要这样做).

    这对您来说意味着您可以直接看到来自接收服务器的响应(例如,在PHPMailer中,您可以打开调试输出).不再猜测邮件是否发送失败或原因.

    如果您正在使用SMTP(即您正在呼叫isSMTP()),则可以使用该SMTPDebug属性获取SMTP会话的详细记录.

    通过在脚本中包含这样的行来设置此选项:

    $mail->SMTPDebug = 2;
    

    您还可以获得更好的界面.随着mail你必须设置你所有的标题,附件等与图书馆,你有一个专门的函数来做到这一点.它还意味着该功能正在执行所有棘手的部分(如标题).

    2023-01-04 14:12 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有