首页 文章

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

提问于
浏览
403
<?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 回答

  • 32

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

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

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

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

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

    有关详细信息,请参阅this Stack Overflow answer .

    确保调用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来避免某些主机提供商设置的速率限制 .

    不要使用错误抑制运算符

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

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

    只有在事故发生后才会出现具体故障 .

    检查mail()返回值

    mail()功能:

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

    这一点很重要,因为:

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

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

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

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

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

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

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

    通常,由于各种原因,通过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 . 这意味着 - 确保这些帐户存在,阅读发送给他们的内容,并根据投诉采取行动 . 最后,让取消订阅真的很容易 . 否则,您的用户将通过按垃圾邮件按钮取消订阅,这将影响您的声誉 .

    有关此主题的更多信息,请参见How do you make sure email you send programmatically is not automatically marked as spam? .

    确保提供所有邮件 Headers

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

    $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
    );
    

    确保收件人值正确无误

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

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

    另一种测试方法是将收件人值硬编码到 mail() 函数调用中:

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

    这可以应用于所有 mail() 参数 .

    发送到多个帐户

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

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

    确保代码与表单方法匹配

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

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

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

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

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

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

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

    确保已配置localhost邮件服务器

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

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

    您也可以使用SMTP发送电子邮件 . 请参阅Vikas Dwivedithis great answer以了解如何执行此操作 .

    启用PHP的自定义mail.log

    除了MTA 's and PHP' s日志文件之外,您还可以专门启用logging for the mail() function . 它没有记录完整的SMTP交互,但至少记录函数调用参数和调用脚本 .

    ini_set("mail.log", "/tmp/mail.log");
    ini_set("mail.add_x_header", TRUE);
    

    有关详细信息,请参阅http://php.net/manual/en/mail.configuration.php . (最好在 php.ini.user.ini.htaccess 中启用这些选项 . )

    检查邮件测试服务

    您可以使用各种传递和垃圾邮件检查服务来测试您的MTA / Web服务器设置 . 通常,您将邮件探测发送到:他们的地址,然后获取发送报告以及更具体的故障或分析:

    使用其他邮件程序

    PHP的内置 mail() 功能非常方便,通常可以完成工作但是它has its shortcomings . 幸运的是,有一些替代方案可提供更多功能和灵活性,包括处理上述许多问题:

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

  • 2

    在邮件功能中添加邮件 Headers

    $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>'; 
    }
    
  • 9
    • 始终尝试在邮件功能中发送 Headers .

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

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

  • 7

    你使用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";
    }
    
  • 17

    只需在发送邮件之前添加一些 Headers :

    <?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中不起作用 . 将代码上传到服务器并尝试 .

  • 2

    通过执行以下操作,它在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)
    

    使用 '' 而不是 ""

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

  • 3

    分别尝试这两个thigs:

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

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

  • 1

    大部分 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();
    }
    ?>
    
  • 419

    如果仅使用 mail() 函数,则需要完成配置文件 .

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

  • 13

    你可以使用codeigniter配置电子邮件,例如使用smtp(简单方法):

    $config = Array(
            'protocol' => 'smtp',
            'smtp_host' => 'mail.domain.com', //your smtp host
            'smtp_port' => 26, //default port 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
    }
    

    它对我有用!

  • 7

    对于任何发现这种情况的人,我不建议使用 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) . 不再猜测邮件是否发送失败或原因 .

    如果您正在使用SMTP(即您正在调用isSMTP()),则可以使用SMTPDebug属性获取SMTP会话的详细记录 . 通过在脚本中包含这样的行来设置此选项:$ mail-> SMTPDebug = 2;

    您还可以获得更好的界面 . 使用 mail ,您必须设置所有 Headers ,附件等 . 使用库,您可以使用专用函数来完成此操作 . 这也意味着该功能正在完成所有棘手的部分(如 Headers ) .

  • 5

    我认为这应该可以解决问题 . 我刚刚添加了一个 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>'; 
        }
    }
    
    ?>
    
  • 21
    $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 style="padding:50px; color:white;">Hello ,
    ' . '

    ' . 'Name:' .$name.'
    ' . 'Email:' .$email.'
    ' . '
    ' . '</div>'; $sendmessage = "<div style=\"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>"; }
  • 1

    尝试这个

    <?php
    $to = "somebody@example.com, somebodyelse@example.com";
    $subject = "HTML email";
    
    $message = "
        <html>
        <head>
           <title>HTML email</title>
        </head>
        <body>
          <p>This email contains HTML Tags!</p>
          <table>
            <tr>
             <th>Firstname</th>
             <th>Lastname</th>
            </tr>
            <tr>
              <td>John</td>
              <td>Doe</td>
            </tr>
          </table>
        </body>
        </html>";
    
    // Always set content-type when sending HTML email
    $headers = "MIME-Version: 1.0" . "\r\n";
    $headers .= "Content-type:text/html;charset=UTF-8" . "\r\n";
    
    // More headers
    $headers .= 'From: <webmaster@example.com>' . "\r\n";
    $headers .= 'Cc: myboss@example.com' . "\r\n";
    
    mail($to,$subject,$message,$headers);
    ?>
    
  • 12

    试试这个

    if ($_POST['submit']) {
        $success= mail($to, $subject, $body, $from);
        if($success)
        { 
            echo '
            <p>Your message has been sent!</p>
            ';
        } else { 
            echo '
            <p>Something went wrong, go back and try again!</p>
            '; 
        }
    }
    
  • 7

    Make sure you have Sendmail installed in your server.

    如果您已检查代码并验证其中没有任何错误,请转至/ var / mail并检查该文件夹是否为空 .

    如果它是空的,你需要做一个:

    sudo apt-get install sendmail
    

    如果你在Ubuntu服务器上 .

  • 1

    如果您在使用PHP发送邮件时遇到问题,请考虑使用PHPMailerSwiftMailer之类的替代方案 .

    每当我需要用PHP发送邮件时,我通常都会使用SwiftMailer .


    基本用法:

    require 'mail/swift_required.php';
    
    $message = Swift_Message::newInstance()
        // The subject of your email
        ->setSubject('Jane Doe sends you a message')
        // The from address(es)
        ->setFrom(array('jane.doe@gmail.com' => 'Jane Doe'))
        // The to address(es)
        ->setTo(array('frank.stevens@gmail.com' => 'Frank Stevens'))
        // Here, you put the content of your email
        ->setBody('<h3>New message</h3><p>Here goes the rest of my message</p>', 'text/html');
    
    if (Swift_Mailer::newInstance(Swift_MailTransport::newInstance())->send($message)) {
        echo json_encode([
            "status" => "OK",
            "message" => 'Your message has been sent!'
        ], JSON_PRETTY_PRINT);
    } else {
        echo json_encode([
            "status" => "error",
            "message" => 'Oops! Something went wrong!'
        ], JSON_PRETTY_PRINT);
    }
    

    有关如何使用SwiftMailer的更多信息,请参阅the official documentation .

  • 9

    也许问题是邮件服务器的配置,为了避免这类问题或者你不必担心邮件服务器问题,我建议你使用PHPMailer,它是一个插件,具有发送邮件所需的一切,唯一您必须考虑的事情是启用SMTP端口(端口:25和465)

    require_once 'PHPMailer/PHPMailer.php';
    require_once '/servicios/PHPMailer/SMTP.php';
    require_once '/servicios/PHPMailer/Exception.php';
    
    $mail = new \PHPMailer\PHPMailer\PHPMailer(true);
    try {
           //Server settings
           $mail->SMTPDebug = 0;                                 
           $mail->isSMTP();                                      
           $mail->Host = 'smtp.gmail.com';  
           $mail->SMTPAuth = true;                               
           $mail->Username = 'correo@gmail.com';                 
           $mail->Password = 'contrasenia';                           
           $mail->SMTPSecure = 'ssl';                          
           $mail->Port = 465;                                    
    
           //Recipients
           $mail->setFrom('correo@gmail.com', 'my name');    
           $mail->addAddress('destination@correo.com');               
    
           //Attachments
           $mail->addAttachment('optional file');         // Add files, is optional
    
           //Content
           $mail->isHTML(true);// Set email format to HTML
           $mail->Subject = utf8_decode("subject");
           $mail->Body    = utf8_decode("mail content");
           $mail->AltBody = '';
           $mail->send();
         }
         catch (Exception $e){
            $error = $mail->ErrorInfo;
         }
    
  • 0

    For those who do not want to use external mailers and want to mail() on a dedicated linux server.

    php.ini[mail function] 部分中描述了php邮件的方式 . 参数 sendmail-path 描述了如何调用sendmail . 默认值是 sendmail -t -i ,所以如果你在linux控制台中工作 sendmail -t -i < message.txt ,你就完成了 . 您还可以添加 mail.log 进行调试,并确保真正调用mail() .

    不同的MTA可以实现 sendmail ,它们只是在该名称上与其二进制文件 Build 符号链接 . 例如,debian默认为postfix . 配置MTA以发送邮件并使用 sendmail -v -t -i < message.txt 从控制台进行测试 . 文件 message.txt 应包含邮件和正文的所有 Headers ,信封的目标地址将取自 To: Headers . 例:

    From: myapp@example.com
    To: mymail@example.com
    Subject: Test mail via sendmail.
    
    Text body.
    

    我更喜欢使用 ssmtp 作为MTA,因为它很简单,不需要运行带有打开端口的守护进程 . ssmtp仅适用于从本地主机发送邮件,它还可以通过您的帐户在公共邮件服务上发送经过身份验证的电子邮件 . 安装ssmtp并编辑config /etc/ssmtp/ssmtp.conf . 为了能够将本地系统邮件重新发送到unix帐户(例如,从cron作业向root发送警报),请配置 /etc/ssmtp/revaliases 文件 .

    这是我在Yandex邮件上的帐户配置:

    root=mymail@example.com
    mailhub=smtp.yandex.ru:465
    FromLineOverride=YES
    UseTLS=YES
    AuthUser=abcde@yandex.ru
    AuthPass=password
    
  • 0

    首先,

    mail()函数可能有很多参数...你最多可以有5个参数 . mail(to,subject,message,headers,parameters);$from 变量而言,如果你使用linux cPanel,它应该自动来自你的webhost . 它自动来自您的cPanel用户名和IP地址 .

    $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";
    

    还要确保mail()函数中的变量顺序正确 . 按顺序 mail($to,$subject,$message,etc.) ,否则它有可能无效 . 如果这有帮助,请告诉我......

  • 3

    这只会影响少数几个用户,但我希望能够记录下这一小部分用户 . 由于这个问题,这一小部分成员花了6个小时对正在运行的PHP邮件脚本进行故障排除 .

    如果您要去www.AceITLab.com运营XAMPP的大学,您应该知道我们的教授没有告诉我们:AceITLab防火墙(不是Windows防火墙)会阻止XAMPP中的MercuryMail . 你必须使用另一个邮件客户端,梨正在为我们工作 . 您必须发送到安全设置较低的Gmail帐户 .

    是的,我知道,这对现实世界的电子邮件完全没用 . 然而,从我所看到的,学术环境和现实世界往往没有什么共同之处 .

  • 5

    您可以使用empty()和isset()函数 . 如果你想让它适用于不同的文件,只需将 action='yourphp.php' 修改为我给你的html,并将 store the PHP script 修改为该 yourphp.php 文件 . 您还需要将 index.html 更改为 index.php 以激活PHP功能 .

    PHP

    <?php
    
        error_reporting(0);
        $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 (!(empty($_POST['name']))) {
                            if (!(empty($_POST['email']))){
                                if (!(empty($_POST['message']))){
                                    mail ($to, $subject, $body, $from);
                                    echo '<p>Your message has been sent!</p>';
                                }else{
                                    echo '<p>Fill your message please.</p>';}
                            }else {
                                echo '<p>Fill your email please.</p>';}
                    }else{
                        echo '<p>Fill your name please.</p>';}              
        }else{
                echo '<p>Fill the form.</p>';}
    ?>
    

    HTML

    <html>
        <form method="post" action="?">
            <table>
                <tr><td>Name</td><td><input type='text' name='name' id='name'/></td></tr>
                <tr><td>Email</td><td><input type='text' name='email' id='email'/></td></tr>
                <tr><td>Message</td><td><input type='text' name='message' id='message'/></td></tr>
                <tr><td></td><td><input type='submit' name='submit' id='submit'/></td></tr>
            </table>
        </form>
    </html>
    

    最好的祝福!

  • 2

    如果您在本地服务器(即用于开发目的的计算机)上运行此代码,它将不会将电子邮件发送给收件人 . 会发生什么,它将在名为 mailoutput 的文件夹中创建一个 .txt 文件 .

    如果您使用的是免费的软管服务,如 000webhosthostinger ,那些服务提供商会禁用 mail() 功能,以防止意外使用电子邮件欺骗,垃圾邮件等 . 我希望您与他们联系,看看他们是否支持此功能 .

    如果您确定服务提供商支持mail()函数,您可以查看此PHP手册以获取进一步的参考,PHP mail()

    要检查托管服务支持mail()函数的天气,请尝试运行此代码, (Remember to change the recipient email address)

    <?php
        $to      = 'nobody@example.com';
        $subject = 'the subject';
        $message = 'hello';
        $headers = 'From: webmaster@example.com' . "\r\n" .
            'Reply-To: webmaster@example.com' . "\r\n" .
            'X-Mailer: PHP/' . phpversion();
    
        mail($to, $subject, $message, $headers);
    ?>
    

    希望这有帮助 .

  • 8

    你可以使用libmail:http://lwest.free.fr/doc/php/lib/index.php3?page=mail&lang=en

    include "libmail.php";
    $m = new Mail(); // create the mail
    $m->From( $_POST['form'] );
    $m->To( $_POST['to'] );
    $m->Subject( $_POST['subject'] );
    $m->Body( $_POST['body'] );
    $m->Cc( $_POST['cc']);
    $m->Priority(4);
    //  attach a file of type image/gif to be displayed in the message if possible
    $m->Attach( "/home/leo/toto.gif", "image/gif", "inline" );
    $m->Send(); // send the mail
    echo "Mail was sent:"
    echo $m->Get(); // show the mail source
    

相关问题