Php 可靠地发送电子邮件并可靠地处理错误

Php 可靠地发送电子邮件并可靠地处理错误,php,email,pear,Php,Email,Pear,作为一名java后端开发人员,我正在制作我的第一个学习练习站点。我正在建立一个用户注册表格,因为这将是我的用户第一次浏览我的网站,我想确保我尽可能稳健地处理事情。通过一些试验,我发现并实施了几乎所有这些解决方案: php的mail()函数-在我测试它的第一天它就工作了,后来就停止了工作。我第一次意识到发送邮件不是一项“给定”的简单任务 pear邮件类-今晚实现了这个,目前仍在工作 pear smtp邮件-阅读有关此的信息。让我觉得我应该使用smtp 在这一点上,我已经意识到可靠地发送电子邮件

作为一名java后端开发人员,我正在制作我的第一个学习练习站点。我正在建立一个用户注册表格,因为这将是我的用户第一次浏览我的网站,我想确保我尽可能稳健地处理事情。通过一些试验,我发现并实施了几乎所有这些解决方案:

  • php的
    mail()
    函数-在我测试它的第一天它就工作了,后来就停止了工作。我第一次意识到发送邮件不是一项“给定”的简单任务
  • pear邮件类-今晚实现了这个,目前仍在工作
  • pear smtp邮件-阅读有关此的信息。让我觉得我应该使用smtp
在这一点上,我已经意识到可靠地发送电子邮件并不像我最初认为的那样琐碎。我的问题是发送邮件的最可靠方式是什么,以及处理异常的最可靠方式是什么?例如,如果SMTP是最可靠的方式,请解释原因并提供一个简单的错误处理示例

对于发生的任何错误,这些错误是否有利于进行自动重试?我明白,仅仅因为我发送邮件并不意味着这个人会收到邮件,但我想问的是,最可靠的解决方案是什么,因为我相信其他人已经做了100多次了

为了证明我不仅仅是一个懒惰的程序员,这是我迄今为止一直在工作的东西——但我不知道这到底有多强大(pear mail):


编辑: 使用SMTP进行错误处理的代码示例

<?php } else if ($_SERVER['REQUEST_METHOD'] == 'POST') {

    include('Mail.php');
    include('Mail/mime.php');

    $to = $_POST['email'];
    $to = urldecode($to);
    if (preg_match('(\r|\n)', $to)) {
        die('No email injection for you!');
    }

    $headers = array(
            'From'=>'tag <me@mysite.com>',
            'Subject'=>'Registration for mysite.com'
            );
    $text_body = 'boring text message';
    $html_body = '<html>
        <head><title>Welcome</title></head>
        <body>
            <p>slightly less boring message</p>
        </body>
    </html>';

    //Utilize the mime class to generate mime body and add mime headers
    $mime = new Mail_mime();
    $mime->setTXTBody($text_body);
    $mime->setHTMLBody($html_body);
    $body = $mime->get();
    $headers = $mime->headers($headers);

    //Utilize the mail class to send the mime mail
    $host = 'mail.mysite.com';
    $port = '26';
    $username = 'me@mysite.com';
    $password ='myPassword';

    $smtp = Mail::factory('smtp', array (
            'host' => $host,
            'port' => $port,
            'auth' => true,
            'username' => $username,
            'password' => $password
            ));
    $mail = $smtp->send($to, $headers, $body);

    if (PEAR::isError($mail)) {
        echo("<p>" . $mail->getMessage() . "</p>");
    } else {
        echo("<p>Message successfully sent!</p>");
    }
?>

发送邮件通常涉及几个步骤:

  • 应用:将邮件放入本地传递代理的队列
  • 传递代理:将邮件发送到已配置的SMTP服务器
  • SMTP服务器:将邮件发送到目标邮件服务器
  • 用户邮件应用程序:从邮件服务器获取邮件
  • 用户:点击邮件,阅读它
  • PHP的
    mail()
    函数将邮件放入unix上本地邮件传递代理的队列中。如果不起作用,您只会得到一个错误(返回值
    false
    )。当代理无法进一步传递邮件或执行任何步骤2-5时,不会通知您

    使用到SMTP服务器的直接SMTP连接,如果邮件无法传递到SMTP服务器,至少可以为您提供一个安全的解决方案,这比使用
    mail()
    获得的信息要多。如果邮件未被读取或只是被过滤到垃圾邮件文件夹中,或者远程邮件帐户不存在,则无法获得信息(3-5)

    要知道远程帐户存在,您需要解析错误响应邮件(“未送达的邮件返回给发件人”),或者实现完整的远程服务器SMTP连接并自行发送(步骤3),我不建议这样做

    为了查明邮件是否已被阅读,您可以嵌入一个“web bug”,一个很小的(可能是清晰的)显示在HTML邮件中并通知您邮件已显示的图像。您可以使用该图像将发送的邮件放入数据库,并在调用web bug图像URL时将其标记为已读。在X天内未被读取的邮件可以被视为“未读取”或“失败”-但用户也可以只是在休假:)

    可靠性和鲁棒性 当远程用户的邮件服务器关闭时,您自己的邮件服务器(步骤3)会自动尝试重新发送邮件。如果这不起作用,您将收到“邮件发送延迟24小时”之类的邮件,当它停止发送邮件时,会收到另一封邮件


    因此,一旦邮件在您的邮件服务器上,您可以确保该服务器将尽其所能提供邮件。

    不要重新发明轮子,那里有很多可靠的php邮件库。我最喜欢的是,标记为正确答案,因为详细程度向我表明,通过SMTP发送邮件更可靠,因为我们是消除更多潜在断点。将添加一个答案,以便为通过SMTP发送的其他用户提供代码以及错误处理。
    <?php } else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    
        include('Mail.php');
        include('Mail/mime.php');
    
        $to = $_POST['email'];
        $to = urldecode($to);
        if (preg_match('(\r|\n)', $to)) {
            die('No email injection for you!');
        }
    
        $headers = array(
                'From'=>'tag <me@mysite.com>',
                'Subject'=>'Registration for mysite.com'
                );
        $text_body = 'boring text message';
        $html_body = '<html>
            <head><title>Welcome</title></head>
            <body>
                <p>slightly less boring message</p>
            </body>
        </html>';
    
        //Utilize the mime class to generate mime body and add mime headers
        $mime = new Mail_mime();
        $mime->setTXTBody($text_body);
        $mime->setHTMLBody($html_body);
        $body = $mime->get();
        $headers = $mime->headers($headers);
    
        //Utilize the mail class to send the mime mail
        $host = 'mail.mysite.com';
        $port = '26';
        $username = 'me@mysite.com';
        $password ='myPassword';
    
        $smtp = Mail::factory('smtp', array (
                'host' => $host,
                'port' => $port,
                'auth' => true,
                'username' => $username,
                'password' => $password
                ));
        $mail = $smtp->send($to, $headers, $body);
    
        if (PEAR::isError($mail)) {
            echo("<p>" . $mail->getMessage() . "</p>");
        } else {
            echo("<p>Message successfully sent!</p>");
        }
    ?>