减少通过SmtpClient()发送的邮件的X-Spam命中率

时间:2011-03-22 18:08:45

标签: c# .net smtp spamassassin

我正在使用System.Net.Mail.SmtpClient通过远程SMTP服务器发送电子邮件。当我查看已发送消息的标题时,我看到该消息从X-Spam获得2.5次点击。如何防止From字段的base64编码,以及如何摆脱NULL_IN_BODY命中?虽然它没有被标记为垃圾邮件,但我希望它是完美的。我无法找到有关此问题的任何信息(如果它确实是一个问题)。

MIME-Version: 1.0
From: Myself <no-reply@myself.com>
To: me@myself.com
Date: 25 Mar 2011 15:20:23 +0100
Subject: Test subject
Content-Type: text/plain; charset=us-ascii
X-Spam-Status: No, hits=0.5 required=5.0
X-Spam-Report: 0.5 hits, 5.0 required;
    * -0.5 ALL_TRUSTED            Passed through trusted hosts only via SMTP
    *  1.0 NULL_IN_BODY           FULL: Message has NUL (ASCII 0) byte in message
X-Virus-Scanned: by moam (http://www.moam.net/)
X-Moam-Version: 0.95
Content-Transfer-Encoding: 8bit
X-MIME-Autoconverted: from quoted-printable to 8bit by mx02.example.com id p2PEKKNs014451

Hello, sshow!
Below is your login information

Username: sshow
Password: a8sJdfl

Sent from http://me.myself.com

修改:我设法通过删除该字段的所有编码来删除FROM_EXCESS_BASE64的警告,这是最重要的警告。之前我曾为该字段手动设置Encoding.UTF8

通过从body字符串中删除所有控制字符,它不再引发警告。但是,这也会删除换行符。

foreach (char c in body)
{
    stringBuilder.Append(Char.IsControl(c) ? ' ' : c);
}

编辑:删除除换行符之外的所有控件字符时,警告会返回!

foreach (char c in body)
{
    stringBuilder.Append(Char.IsControl(c) && c != '\r' && c != '\n' ? ' ' : c);
}

1 个答案:

答案 0 :(得分:1)

如果没有看到电子邮件的正文或源代码,就无法确定,但我认为以下情况属实:

  • 你有base64编码From头,即使没有必要这样做。 SpamAssassin认为这可能会混淆某些内容:http://wiki.apache.org/spamassassin/Rules/FROM_EXCESS_BASE64
  • 您的电子邮件正文中包含二进制数据(特别是空字节)。例如,如果您将UTF-16(UTF-32)编码的文本转储到电子邮件正文中,则可能会发生这种情况,因为普通的英文字符每个都表示为两(四)个字节,其中一个(三个)为空。 / LI>

如果这不能解决问题,请发布您的完整代码和整个邮件的十六进制转储。

更新:

Char.IsControl也会删除CR和LF字符(&#39; \ r&#39;和&#39; \ n&#39;)。将代码更改为不删除它们,例如:

Char.IsControl(c) && c != '\r' && c != '\n' ? ' ' : c