[Postfix进阶]对于邮件被标记为Spam的一些可能原因分析

提醒:本文最后更新于 2853 天前,文中所描述的信息可能已发生改变,请仔细核实。


对于邮件的SPAM标记,大多遵循着spamassassin规则。

一般是注重根据你的邮件的头部和正文的合法性、语法性,当然啦,还有对正文内容的简单判断。

最近受到比较多的这方面的影响。不过我还是没搞明白为什么。

外国佬总结的几点:

1. 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)
2. Make sure that your internet-facing mail server has a working and correct reverse DNS.
3. Ensure that you're not violating any SPF policy on your source domain(s)
4. 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)
5. Don't share hosting with spammers (i.e. anyone)
6. 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
no-reply@kn007.net

用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"';

当然啦,人各有志,我只能说我习惯规范简洁效率的语法。

转载请注明转自:kn007的个人博客的《[Postfix进阶]对于邮件被标记为Spam的一些可能原因分析