当然,通过从数据库中获取所有指定的用户电子邮件和循环使用循环邮件功能发送邮件,可以简单的做到这一点,但问题是我被告知这是不好的做法.简单而不便宜的方式是购买互联网服务发送通讯,但是需要PHP程序员呢?
所以我问你谦卑的同志,从你的角度来看可能是一个解决方案?
UPD:我可能已经解释了自己的错误,但我想听到一个解决方案,不仅是正确的方式发送邮件,而且还有关于正确的交付.因为不是每个邮件发送都是交付的.
当然有一些原因,这是不可预测的.例如,某些事情发生的一些地方,邮件丢失了(如果这样的事情是可能的话),但也有其他原因可能受到服务器或其他地方的影响.也许有需要和宿主谈谈吗?
设置交货
>开始使用PHPmailer本身,来处理格式化,内容和头文件的编码,添加附件等.这部分功能很好,我不想从头开始写.
>电子邮件本身的“发送”只是在数据库中设置一些标志,是否/如何/应该发送给(订阅者的一部分).
>此标志设置完成后,它将自动由cronjob拾取,不再涉及网络服务器.
>我开始使用数百万个电子邮件地址严重污染的数据库,其中很多都是无效的,所以首先要验证所有的电子邮件地址格式,然后是主机:
> filter_var($email,FILTER_VALIDATE_EMAIL);超过订阅者(并且显然存储结果)摆脱了前几十万个无效电子邮件.
>从电子邮件中分离主机(并存储主机名),并验证(在DNS中有MX或至少A记录,但请记住:您可以发送电子邮件到IP地址foo @ [255.255.255.255],所以保持那些有效))摆脱了更多的部分.这里的电子邮件地址不会被永久禁用,而是显示状态标志,表示由于域名/ ip而被禁用.
>脚本被更改为要求在订阅/插入之前有效的电子邮件地址,这个废话“你会得到它@任何地方”订阅污染数据库是荒谬的.
>现在我结束了一个有潜力有效的电子邮件地址列表.本质上有三种方法来检测无效地址(请记住,所有这些都可以是临时的):
>服务器立即被拒绝.
>早期确定的服务器只是不听流量.
>在你以为你交付他们之后,他们就被弹跳了.
>奇怪的是,每个电子邮件服务器似乎有另一种格式的弹跳,首先解析,最终实际上很容易捕获使用VERP.而不是分析整个电子邮件,一个专用的电子邮件地址(让我们称之为邮件@ example.com)被配置为转发到邮箱,通过命令进行管理,如果我们发送电子邮件到user@server.tld,则返回路径是为邮件用户userserver.tld@example.com设置的.收到后可以轻松解析,并且在多少次反弹(邮箱不能存在,邮箱可能已满(是的,仍然!)等)后,您声明一个电子邮件地址不可用取决于您.
>现在,直接拒绝服务器.可能我们可以正确配置一些MTA和/或为其编写插件,但是随着电子邮件的时间敏感,我们必须在最后一个可用的交货时间内邮寄绝对可配置的控制(之后电子邮件不再对用户感兴趣),每个接收服务器的调节,一般来说,在我们所熟悉的PHP中编写一个邮件程序需要大约相同的时间,它们将SMTP协议直接用于接收服务器上的套接字25.以最小的努力量进行另一种传输的可能性,那么内置了PHPMailer中的默认选项. SMTP协议其实很简单,但有一些注意事项:
>很多接收服务器应用灰色列表:大多数的垃圾邮件机器都不会真的关心一个特定的邮件是否到达,他们只是把它们弄出来.因此,如果未知/尚未被信任的发件人发送邮件,它将被暂时拒绝.抓住(通常是代码451),并将电子邮件放在队列中供以后重试.
>一个邮件服务器,特别是较大的ISP和免费服务(gmail,hotmail / msn / live等)不会代替一大堆邮件,而不会反击:在第一个几百/千个之后,他们开始拒绝你.更多关于那个以后.
获得速度
>现在,我们有一个运行系统,但它需要快速.如果您只有10,000个地址发送到一小时内发送10,000封电子邮件,但是我们要求的最低限度是每小时约20万个.开始它是一个专门的服务器(实际上可以是相当低的电源,无论你做什么,大部分时间在电子邮件的传递是在网络,而不是在你的服务器上).
> IP的缓存:记住我们从电子邮件地址中的主机名请求的所有IP?我们把这些明显存储起来,一次又一次地查找到IP,造成相当大的滞后.然而,IP可能会改变:一个DNS记录,另一个MX在另一个地方…数据变得快速.大多数情况下,服务器实际上并没有发送任何信息(订阅报纸明显地突然出现),一个低优先级的cronjob正在运行,检查所有使用过时的IP的主机名(我们选择较旧的1天作为陈旧的)为IP地址,包括那些以前没有注册过的域名,所以为什么有人已经用他/她的全新电子邮件地址热心订阅了这个域名后呢?或者某个域的服务器问题解决了,等等.).实际上发送电子邮件现在不需要更多的域查找.
>重新使用SMTP连接:当您直接与端口25通话时,设置与服务器的连接所需的时间相对较长,才能交付电子邮件.您不必为每个电子邮件设置新的连接,您可以通过相同的连接发送下一个.有一些跟踪错误导致将默认值设置为每个连接约50个电子邮件(假设您有很多或更多的域).但是,由于电子邮件地址关闭并重新打开用于重试的连接失败,有时会有所帮助.总而言之,这真的有助于加快事情.
>一些明显的,很明显,我几乎忘了提到它:现场必须创建电子邮件的身体是浪费的:如果它是一般的邮件,准备好身体(我改变PHPMailer有点能够使用缓存的电子邮件),可能在前几天(如果你知道你星期五要发送一个邮件,你的服务器是空闲的,为什么不在星期三准备呢?如果它是个性化的,你还可以预先准备足够的时间,如果没有,至少有非个性化的部分等待去.
>多个进程.我提到大部分时间需要交付电子邮件是花在网络上吗?一个邮件过程几乎没有从您的电子邮件服务器获得最大的收益,几乎不显着的负载,邮件正在流出.播放多个进程邮寄不同部分的队列,看看你的服务器/连接是正确的,但记住2个非常重要的事情:
>不同的过程使你非常容易受到种族条件的限制:绝对确定你有一个全面的系统,永远不会发送相同的邮件两次(三次甚至更多).不仅严重地使用户烦恼,您的垃圾邮件也会上升一点.
>尽可能地将域保持在一起:从队列中随机挑选,您将失去与接收域的电子邮件的服务器保持打开连接的优势.
避免拒绝
>你会发送很多邮件.这正是垃圾邮件发送者的做法.但是,您不想被视为垃圾邮件发送者(毕竟,您不是,是吗?)?有许多机制将彻底增加您对接收服务器的可信度:
>具有正确的反向DNS:进程检查属于IP的DNS,如果第二级域匹配,则非常感谢发送邮件:您是否代表example.com发送邮件?确保服务器的反向DNS类似于somename.example.com.
>发布您的域的SPF记录:明确指出用于发送批量电子邮件的计算机是允许&期望使用From / Return-Path标头发送邮件.
>记住拒绝:服务器不喜欢它一次又一次地告诉你不同的电子邮件地址不存在.自动化机制,甚至是人类管理员,在我们处理所有未经验证的电子邮件地址(不再存在)之前,阻止了我们的服务器.以后我们没有采用双重选择,所以数据库被打错了,人们切换IP,从而电子邮件地址,恶作剧电子邮件地址等被污染.确保捕获这些无效,并给予足够或足够严重的故障,取消订阅.他们在做你没有什么好处,他们正在占用资源,如果他们真的想要你的邮件,邮箱可以在以后使用,他们只需要重新订阅.
> DKIM是另一种可能增加您的可信度的机制,但是由于我们还没有实现它,我不能很好地告诉你.
> MX记录:如果您的发送服务器也是域的接收服务器,则某些服务器仍然喜欢它.就像当时那样,我们只有一个MX,而邮件服务器还不是很忙,所以我们把它称为域的后备MX服务器.正常的MX服务器不是发送订阅的服务器,因为您尝试向(客户端等)发送重要电子邮件的服务器暂时阻止它,因为您已经发送了不太重要的邮件,因此非常烦恼.它收到MX的偏好最高,但如果失败,我们有一个很好的奖励,我们的订阅发送服务器仍然会交付,所以在危机中,我们仍然可以得到它,防止尴尬的反弹给客户尝试到达我们
告诉他们你.认真.很多主要的用户都可以通过免费电子邮件地址(如live.com)为您提供以某种方式注册的机会,或者有一些联系方式去寻求帮助和帮助.支持,如果您的电子邮件被拒绝.我有合法的理由发送这么多的电子邮件,可以肯定的是,你有这么多的订阅者,他们有可能会认真地看出每小时可以发送给他们的服务器的电子邮件数量.如果你有说服力和诚实的话,那么1000美元可能会变成万分之一甚至更高的地方.可能有合同,您必须履行的要求,并承诺您必须(并保持)允许这一点. ISP是一个分开的品牌,每个其他玩家都是不同的.不要打扰他们通常的呼叫,因为99%的时间只有你能找到的数字只会让人们愿意排除你的互联网连接,而这个连接明白了(或是被允许).滥用@电子邮件地址是一个开始的好地方,但看看您是否可以从某个地方开发更多的点对点电子邮件地址.准确,诚实和完整:您有多少订阅者与该ISP的电子邮件地址,您尝试邮寄的频率,您收到的错误或否认是什么,订阅和unscubscribe进程,和您实际提供给他们的客户的服务.另外,很好:发送这些邮件可能对您的业务有多么重要,恐慌,声称可怕的损失并不涉及他们.对事实和愿望的有礼貌的陈述,并询问他们是否可以帮助而不是要求解决方案走了很长的路.
> Throttling:尽可能多的尝试,一些服务器每小时接收一定数量的邮件和/或从您那里接收一天.了解这些数字(我们正在记录成功和失败),将它们设置为正常域的合理默认值,将其设置为对较大玩家的限制.
>第一条规则:不要垃圾邮件!
>第二条规则:永远!不是“一旦关闭”,而不是“他们没有订阅,但这可能是他们一生的交易”,而不是最好的意图,人们不得不要求你的电子邮件.
显然建立了正确的双重选择订阅机制.
> PHPMailer自己设置适当的标题,
>设置一个简单的取消订阅机制,通过网络(包括每个邮件中的链接),也可能是电子邮件和客户服务,如果你有它.确保customerervice可以直接取消订阅.
>如前所述:取消订阅(过多)失败反弹.
避免垃圾邮件处理一生的字眼.
>在您的电子邮件中谨慎使用url.
>避免添加链接到您的控制之外的域,除非你绝对确定你可以信任他们不要垃圾邮件,如果即使这样…
>为用户提供价值:通过google / yahoo / live webmail客户端的用户交互标记为垃圾邮件严重损害未来的成功(在网站注意事项:如果您注册,live / msn / hotmail将转发所有邮件您的域名由用户发送给垃圾邮件,学习喜欢它,一如既往地取消订阅,他们显然不想要您的商场,并且会伤害您的垃圾邮件评级).
>监控您的IP的黑名单.如果你出现在其中一个,那就再见了,所以要清除你的名字和确定案件是必须的.
测量成功率
>您可以控制整个过程,您可以肯定电子邮件在某处(尽管可能是MX的bitbucket或垃圾邮件文件夹),或者您已经记录了失败之所以.这照顾了“实际交付”的数字.
>有些人会尝试说服你添加到您的电子邮件(真实的或着名的1×1透明gif)的在线图像的链接,以衡量有多少人实际读取您的电子邮件.由于这些图像的高百分比阻挡了这些图像,这些数字在最大程度上是摇摇欲坠的,我们认为我们不应该打扰他们,他们的数字完全不可靠.
>如果您希望用户做某些事情,您最好的衡量实际成功率的方法会更容易.将参数添加到邮件中的链接,以便您可以衡量有多少用户到达您链接的站点,无论他们是否执行了所需的操作(观看视频,留下评论,购买的商品).
总而言之,所有的日志记录,用户界面,每个域/电子邮件/用户等的可配置设置.我们花了大约1,5个人月来构建&铁了怪物相比外包电子邮件可能相当投资,可能不是,这一切都取决于音量和音量.业务本身.
现在,我开始愚蠢地开始在PHP中编写一个MTA,我一个人非常喜欢它(这是我写了这么多文本的一个原因),以及极其通用的日志记录和设置功能,基于故障百分比等的每个主机警报正在使生活变得如此容易;)