.NET或MSSMTP在From标头中添加换行符

时间:2011-02-28 01:14:58

标签: c# asp.net email

我可能只是失明(非常可能!)但我无法在任何地方找到任何可以帮助我的信息:(

首先,下面是我用来发送电子邮件的代码:

MailMessage newMM = new MailMessage();

newMM.To.Add(new MailAddress(userEmail));
newMM.From = new MailAddress(getFrom, getFromName);
newMM.IsBodyHtml = true;
newMM.Subject = userSubject;
newMM.Body = userHTML;
if (chkEncoding.Checked)
{
    newMM.BodyEncoding = System.Text.Encoding.UTF8;
    newMM.SubjectEncoding = System.Text.Encoding.UTF8;
}

NetworkCredential basicAuthenticationInfo = new NetworkCredential(mUsername, mPassword);
SmtpClient smtp = new SmtpClient(mServer);
smtp.DeliveryMethod = SmtpDeliveryMethod.Network;
smtp.UseDefaultCredentials = false;
smtp.Credentials = basicAuthenticationInfo;
smtp.Send(newMM);

哪个发送正常,并且在启用等时UTF8会很好...但是在生成的电子邮件中我得到了这个(UTF8与否):

...
MIME-Version: 1.0
From: "The name i want"
 <fromname@fromdomain.com>
To: someone@atadomain.com
...

这是通过检查MSSMTP Queue文件夹中的文件来实现的,所以在我看来它的.NET添加换行符或MSSMTP在收到电子邮件时这样做。

之前有人碰到过这个吗?还是有想法? :)

这个问题很重要的原因是因为Declude说来自地址不匹配并添加垃圾邮件权重,我可以通过标题看到:

X-RBL-Warning: FROMNOMATCH: Env sender (fromname@fromdomain.com) From: ("The name i want") mismatch.
...
X-Declude-Tests: ... FROMNOMATCH [2] ...

所以我想其他的垃圾邮件过滤器也会对它产生抱怨。

编辑:

供参考;所有电子邮件在所有电子邮件客户端中看起来都非常好,这纯粹是一个标题呈现/垃圾邮件处理器问题。

如果有人有空闲时间,他们是否可以使用.NET发送消息并检查原始标题(未经编辑和未经电子邮件客户端解析)并让我知道?我现在继续卡车运输:)

EDIT2:

我使用套接字,基本回复(220's,250's,354's等)在.NET中创建了一个基本的SMTP服务器,并使用代码连接到它并发送...并且问题出现了,所以这肯定是在代码/ .NET方面而不是MS-SMTP。

我还创建了一个全新的.NET 4.0 Windows应用程序,添加了一个按钮并输入了此代码(注意我添加了使用System.Net.Mail;以及其他来自空白的新Windows应用程序的其他内容):

private void button1_Click(object sender, EventArgs e)
{
    MailMessage newMM = new MailMessage();
    newMM.To.Add(new MailAddress("toaddress@domain.com"));
    newMM.From = new MailAddress("fromaddress@domain.com", "Happy As'Larry");
    newMM.IsBodyHtml = true;
    newMM.Subject = "My Subject";
    newMM.Body = "My HTML";
    SmtpClient smtp = new SmtpClient("localhost");
    smtp.DeliveryMethod = SmtpDeliveryMethod.Network;
    smtp.Send(newMM);
}

请注意,这不会以任何方式进行编辑...因为它是测试SMTP输出应用程序的本地编辑,因此无需进行验证,因此其完全就在上面。

我的SMTP应用程序使用来自System.Net.Sockets的TcpListener和Socket对象,只将所有远程数据输出到一个简单的文本框,它解析命令缓冲区的字符串,以便它可以实际回复并获取DATA命令检查.NET正在发送什么:)

输出在这里:

EHLO WhiteDragon-PC
MAIL FROM:<fromaddress@domain.com>
RCPT TO:<toaddress@domain.com>
DATA
MIME-Version: 1.0
From: "Happy As'Larry"
 <fromaddress@domain.com>
To: toaddress@domain.com
Date: 28 Feb 2011 19:00:19 +1100
Subject: My Subject
Content-Type: text/html; charset=us-ascii
Content-Transfer-Encoding: quoted-printable

My HTML

.

所以有了2个全新的应用程序,每个应用程序都有非常基本的代码,我仍然会遇到问题!

这是一个.NET 4.0错误吗?如果有人想要SMTP代码我也会粘贴它,如果你想检查这个东西。

3 个答案:

答案 0 :(得分:3)

确定!

我的编辑的最后一部分显示了结果。

将测试客户端应用程序切换到.NET 3.5,并且from标头变为:

来自:“Happy As'Larry”&lt; fromaddress@domain.com>

将测试客户端应用程序切换到.NET 4.0,并且from标头变为:

来自:“Happy As'Larry”
 &LT; fromaddress@domain.com>

所以这是.NET 4.0库中的问题,现在我有了一个解决方案......将配置文件更改为.NET 3.5!

感谢所有帮助过的人:)

编辑:标签的对齐和编码......嘿

EDIT2:此外,这已修复了Declude的垃圾邮件检查标题,NOFROMMATCH [2]加权消失,因此我的电子邮件不那么“垃圾邮件”

我的建议是,如果您使用.NET 4.0并发送电子邮件......请检查此内容!

答案 1 :(得分:0)

在我的一个项目中将您的源代码与类似的源代码进行比较,我想出的唯一可能性是:

您的getFrom变量包含换行符。

答案 2 :(得分:0)

问题是早期版本的MailMessage还有很多其他错误;看一下这个主题:http://social.msdn.microsoft.com/forums/en-US/netfxnetcom/thread/879f13d7-24e6-4a0f-b396-627e9da25fc1/

所以,如果有人能建议一个不依赖MailMessage的更好的课程 - 我会非常感激。

为了您的乐趣,这里是.NET 4.0中的Encode方法,它会弄乱您的电子邮件地址:

// Encodes the full email address, folding as needed
internal string Encode(int charsConsumed)
{ 
    string encodedAddress = String.Empty;
    IEncodableStream encoder; 
    byte[] buffer; 

    Debug.Assert(this.Address != null, "address was null"); 

    //do we need to take into account the Display name?  If so, encode it
    if (!String.IsNullOrEmpty(this.displayName))
    { 
        //figure out the encoding type.  If it's all ASCII and contains no CRLF then
        //it does not need to be encoded for parity with other email clients.  We will 
        //however fold at the end of the display name so that the email address itself can 
        //be appended.
        if (MimeBasePart.IsAscii(this.displayName, false)) 
        {
            encodedAddress = String.Format("\"{0}\"", this.displayName);
        }
        else 
        {
            //encode the displayname since it's non-ascii 
            encoder = encoderFactory.GetEncoderForHeader(this.displayNameEncoding, false, charsConsumed); 
            buffer = displayNameEncoding.GetBytes(this.displayName);
            encoder.EncodeBytes(buffer, 0, buffer.Length); 
            encodedAddress = encoder.GetEncodedString();
        }

        //the extra space is because there should be a non-printable whitespace char 
        //following the fold (CRLF) and there is supposed to be a space between the display name and
        //the address so this is necessary. 
        encodedAddress += "\r\n "; 
    }

    //now we have the encoded display name (if present), we need to append the address to it.
    if (!String.IsNullOrEmpty(encodedAddress))
    {
        //address should be enclosed in <> when a display name is present 
        encodedAddress += SmtpAddress;
    } 
    else 
    {
        //no display name, just return the address 
        encodedAddress = this.Address;
    }

    return encodedAddress; 

}