我可能只是失明(非常可能!)但我无法在任何地方找到任何可以帮助我的信息:(
首先,下面是我用来发送电子邮件的代码:
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代码我也会粘贴它,如果你想检查这个东西。
答案 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;
}