让我解释一下我的标题。让我们说,例如,我正在为一个网上商店/目录创建一个小型电子商务系统。客户有可能选择,他们是否希望收到新闻通讯。如果他们这样做,那么逻辑上应该立即发送新闻通讯,因为新闻通讯已经形成并准备就绪。
当然可以通过从数据库中获取所有指定的用户电子邮件并使用for
周期通过mail
函数循环发送邮件来简单地完成,但问题是我被告知,这是不好的做法。简单而不便宜的方式是购买用于发送新闻通讯的互联网服务,但是对于php程序员来说需要什么呢?
所以我问你们谦卑的同志,你们的观点可能是什么解决方案?
NB!你可能不会相信我,但这不是垃圾邮件。
UPD:我可能已经解释过自己错了,但我想听到的解决方案不仅包括发送邮件的正确方式,还包括正确的传送方式。因为不是每个邮件发送总是发送 当然有一些原因是不可预测的。例如,某个地方出现了故障并且邮件丢失(如果可能的话),但也有其他原因可能会受到服务器或其他地方的影响。也许需要和托管人讨论这个问题?
答案 0 :(得分:24)
答案 1 :(得分:6)
使用Swiftmailer,PHPmailer或Zend_mail之类的内容是使用简单mail()
功能的更好选择,因为它可以很容易地标记为垃圾邮件。邮件中存在太多需要考虑的问题 - 其中大部分问题都是通过使用预先存在的库来解决的。
手动发送群发电子邮件时需要解决的几个问题:
使用错误的标题。
处理退回邮件
由于电子邮件的涌入导致脚本失效。
修改强>
可能不是您正在寻找的答案。但是,我强烈建议你投资Campaign Monitor或Mail Chimp之类的东西。由于此过程不是出于教育目的,而是出于商业目的,我将强烈建议上述服务。
答案 2 :(得分:2)
我得到了你的问题,但在回答之前,让我去做一般的考虑。首先,我强烈建议使用像Mail Chimp这样的服务。它对于小型工作来说是免费的,并且有许多很酷的功能,比如追踪打开的电子邮件数量,点击的数量,交付失败的数量......想想为自己做一个忙,不要重新发明轮子。
现在,为了了解目的,让我们回答您的问题。
要记住的第一件事是强制您的列表是一个好的列表。怎么做?好吧,对于一个好的列表,我指的是一个有效的电子邮件地址列表。简单地在您的页面上放置一个简报形式,只有一个字段(可能是验证码,但我认为没有必要)。
将所有输入保存到数据库表,默认情况下将字段“isValid”设置为false,以及任何类型的唯一哈希。然后您发送一封确认电子邮件,其中包含一个链接(生成的哈希)以进行混淆,点击后将使“isValid”标志为真,并提供取消链接(始终在您的所有电子邮件中发送此取消链接)。
这就是商店和认真的网站所做的事情。任何迫使你的客户/访客接收的东西都是一种糟糕的道德行为(即垃圾邮件)。
第二件事,使用一个好的托管服务。垃圾邮件发送者通常会使用太便宜的服务,而主要的电子邮件服务会将来自这些地址的所有内容列入黑名单。
我知道,你应该问自己我的问题是否错了。不,我没有,技术的东西现在来了。
为什么不好的做法会在for循环中放置一个邮件功能?简单。因为函数邮件每次调用都会执行多个操作。 PHP,将打开与邮件服务器的连接,发送要解析的数据,请求发送,注册邮件服务器状态,关闭连接,冒泡状态以完成您调用的邮件功能并清理内存混乱。
从编程的角度来看,这种连接开销是人们将其视为不良实践的问题。使用SMTP / IMAP解决方案更好,因为它可以优化此过程。
关于技术的一点点我看到你关于交付的问题。好吧,正如我所说,你有一些方法可以确保你的电子邮件清单足够好。但是,如果发生另一个异常,例如在客户服务器上发生停电+不中断故障会怎么样?
好吧,PHP保持“要求邮件服务器发送,邮件服务器发送”的状态。如果邮件服务器发送了您的消息,PHP将返回true。周期。
如果客户端无法接收或拒绝,您应检查电子邮件标头和电子邮件状态。这些是在电子邮件服务器上再次,可以使用SMTP / POP / IMAP扩展访问这些信息,而不是使用邮件功能。
如果你想更进一步,请阅读IMAP文档,搜索电子邮件类(phpclasses.org,pear和pecl是最好的地方)。
额外提示:RFC可能很有用,因为您可以更好地了解电子邮件服务器之间的真实对话。
额外提示2:访问您的gmail或ymail并检查您的已发送/已接收消息的“完整版”并阅读其标题。你可以用它们学到很多东西。
答案 3 :(得分:0)
答案 4 :(得分:0)
只需使用PHP Mail并研究IMF以及如何构建自定义标题,您可以附加第四个参数,例如
<?php
// multiple recipients
$to = 'aidan@example.com' . ', '; // note the comma
$to .= 'wez@example.com';
// subject
$subject = 'Birthday Reminders for August';
// message
$message = '
<html>
...
</html>
';
// 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";
// Additional headers
$headers .= 'To: Mary <mary@example.com>, Kelly <kelly@example.com>' . "\r\n";
$headers .= 'From: Birthday Reminder <birthday@example.com>' . "\r\n";
$headers .= 'Cc: birthdayarchive@example.com' . "\r\n";
$headers .= 'Bcc: birthdaycheck@example.com' . "\r\n";
// Mail it
mail($to, $subject, $message, $headers);
?>
答案 5 :(得分:0)
创建一个邮件队列子系统,其中可能包含mail_queue,mail_status,mail_attachments,mail_recipients和mail_templates等表...
答案 6 :(得分:0)
您可以考虑使用PHPMailer http://phpmailer.worxware.com/index.php?pg=exampleasendmail
您可以添加多个收件人和一个特殊的回调函数,以处理发送的每封邮件的返回邮件。 (例如访问链接)
我不认为通过php捕获“邮件传递失败”错误邮件是可能的,除了您通过SMTP使用PHPMailer并且偶尔监视来自您的传出电子邮件集合中的任何收件人的任何返回邮件。