0

我正在使用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);
}
4

1 回答 1

1

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

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

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

更新:

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

Char.IsControl(c) && c != '\r' && c != '\n' ? ' ' : c
于 2011-03-25T00:20:53.903 回答