2011-03-22 42 views
0

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

MIME-Version: 1.0 
From: Myself <[email protected]> 
To: [email protected] 
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

没有看到电子邮件或源代码的身体,这是不可能肯定地说,但我会承担下列条件:

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

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

UPDATE:

Char.IsControl去除CR和LF字符以及( '\ r' 和 '\ n')。更改您的代码不会删除它们,例如:

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

此类字符可能会出现在From标题的“mailbox”的“display-name”部分。 – Anomie 2011-03-25 02:59:16

+0

@Anomie:好点。我更新了我的答案,以便更清楚。 – 2011-03-25 13:38:01

+0

谢谢你的回复。请参阅我的编辑。 – sshow 2011-03-25 18:03:07