对于邮件的SPAM标记,大多遵循着spamassassin规则。
一般是注重根据你的邮件的头部和正文的合法性、语法性,当然啦,还有对正文内容的简单判断。
最近受到比较多的这方面的影响。不过我还是没搞明白为什么。
外国朋友总结的几点:
- Ensure that you're not actually sending any spam, either wittingly or unwittingly (spammers might be exploiting your code, or an open relay on the box etc)
- Make sure that your internet-facing mail server has a working and correct reverse DNS.
- Ensure that you're not violating any SPF policy on your source domain(s)
- Don't forge mail's envelope-sender or "From:" - don't claim the message is from anyone who it isn't, or any domain you don't own, control and have permission to send from (see SPF above)
- Don't share hosting with spammers (i.e. anyone)
- Pay loads of $$$ to those incompetent corrupt bastards who put you on their bent blacklist for no reason whatsoever other than they were in a bad mood at the time, or an idiot AOL loser reported your (non-spam) message as spam
OK,我们就这几点来分析下:
第1点,不在我们讨论范围,我们是良民,不发垃圾邮件。至于邮件服务器是否被设成公开转发站,我想大多不会被设为,可以谷歌“Mail relay testing”来测试。
第2点,需要通过你的 ISP 额外设置一个 PTR rDNS 将你的网域映射至你的 IP 地址,这要运营商、主机商等协助,这个太麻烦,暂时不在考虑范围。
第3点,必须的,SPF是必须搞的,而且也是最简单的,你只要加个DNS解析的txt记录,何乐而不为呢?至于怎么做,请移驾到《[Postfix进阶]Postfix配置SPF并禁止伪造发件人》和《Postfix添加DKIM协议,完善DNS中的SPF解析》查看。
第4点,或许大家不大明白,那就是你在使用mail函数发送邮件时,对header定义中,带了from的伪造来源话,容易被标记为Spam,基本spam分数会多了3分,5分就是spam,你自己看着办吧。举个例子,像我使用的是wordpress这货,评论邮件提醒,这总该有的吧,其中的header定义,大家可以看基本都定义了From:博客名<no-reply@你的域名>。So,这就是伪造来源。嗯哼哼,伪造来源,你想干嘛,这是违法滴。。。好吧,我觉得很坑爹。如果你不想动这一项的话,你最好保证其它,不会过多增加spam分数,可以谷歌“spamassassin 垃圾邮件规则”。当然如果你是postfix的话,你可以使用后面的那个办法来解决这个问题。
第5点,vps现在大多是独立ip,基本不存在这个问题。至于虚拟主机,我只能说愿老天爷保佑你,同个ip的邻居,没有违反ToS。
第6点,对于这种奇葩,我们只能表示无奈,没办法,谁让人(系统)心情不好,就想拉黑你,人品不行。
那么如何解决第4点呢?
1.定义from的时候,name如果是中文的话,定义不要太长,或者encode。
2.使用postfix的虚拟用户(域)功能。
第1种方法,说的比较明白了。
谈下第2种方法,Postfix如何创建虚拟用户,伪造发信来源?
首先,在/etc/postfix/main.cf中,添加:
virtual_maps = hash:/etc/postfix/virtual
编辑虚拟域/etc/postfix/virtual,添加(自个看需求):
kn007.net anything
[email protected]
用postmap命令生成虚拟域数据库:
postmap /etc/postfix/virtual
题外话:无论你使用的是不是wordpress程序驱动,程序的邮件函数总要使用到php的内置函数mail()。而其中的$header,又是用的较多,我们会定义各种类型,甚至伪造来源之类的。但很多人还是习惯用\n或\r\n来分割。但是其实用$headers[]这种array方式,更简洁无误。
举个例子,wordpress的评论邮件回复,大多是以这样形式定义header:
$from = "From: "" . $blogname . "" <$wp_email>";
$headers = "$from\nContent-Type: text/html; charset=" . get_option('blog_charset') . "\n";
直接copy,当然没问题,但是对于那些经常写的人,其实常常要考虑其语法问题,如果你不是用高亮编辑器的话。而且看着也不舒服。
而用array的方式,简单明了,如下:
$headers[] = 'From: '.$blogname.' <'.$wp_email.'>';
$headers[] = 'Content-Type: text/html; charset="UTF-8"';
当然啦,人各有志,我只能说我习惯规范简洁效率的语法。