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