因此,下面的代码曾经在.NET 4中用于将System.Net.Mail.MailMessage对象作为MemoryStream获取,但是随着.NET 4.5 beta的发布,发生了运行时异常.
Assembly assembly = typeof(SmtpClient).Assembly;
Type mailWriterType = assembly.GetType("System.Net.Mail.MailWriter");
using (MemoryStream stream = new MemoryStream())
{
ConstructorInfo mailWriterContructor = mailWriterType.GetConstructor(BindingFlags.Instance | BindingFlags.NonPublic, null, new[] { typeof(Stream) }, null);
object mailWriter = mailWriterContructor.Invoke(new object[] { stream });
MethodInfo sendMethod = typeof(MailMessage).GetMethod("Send", BindingFlags.Instance | BindingFlags.NonPublic);
sendMethod.Invoke(message, BindingFlags.Instance | BindingFlags.NonPublic, null, new[] { mailWriter, true }, null);
.....
}
Run Code Online (Sandbox Code Playgroud)
sendMethod.Invoke()上发生运行时异常.
我正在使用Exchange Server发送带有SmtpClient(正在成功发送)的MailMessages,但希望我发送的电子邮件转到我发送的电子邮件地址的已发送文件夹(未发生).
using (var mailMessage = new MailMessage("fromaddress@blah.com", "toaddress@blah.com", "subject", "body"))
{
var smtpClient = new SmtpClient("SmtpHost")
{
EnableSsl = false,
DeliveryMethod = SmtpDeliveryMethod.Network
};
// Apply credentials
smtpClient.Credentials = new NetworkCredential("smtpUsername", "smtpPassword");
// Send
smtpClient.Send(mailMessage);
}
Run Code Online (Sandbox Code Playgroud)
是否有我缺少的配置,以确保我发送的所有来自"fromaddress@blah.com"的电子邮件都到达他们的已发送文件夹?
我使用Amazon SES SendRawEmail API,因此我需要一个MailMessage作为Memorystream.
我在stackoverflow上找到了MailMessage到MemoryStream问题的几个答案.
解决方案1:使用使用私有方法的方法会导致电子邮件部分的编码错误:https: //stackoverflow.com/a/8826833
解决方案2:使用此解决方案无编码问题,您将其发送到拾取目录,然后将其读回:https: //stackoverflow.com/a/14350088
我非常不喜欢这样一个事实:我需要写一个临时文件才能使其正常工作.有没有人知道纯MemoryStream解决方案如何搞乱一些编码.
iam测试的邮件是这样的:
var mailMessage = new MailMessage();
mailMessage.Subject = "HEADER WITH SPECIAL ÆØÅ";
mailMessage.Body = "TEST";
Attachment att = new Attachment(@"C:\AttachmentWithSpecial ÆØÅ.pdf");
mailMessage.Attachments.Add(att);
mailMessage.From = new MailAddress("test@test.com", "NameÆØÅ");
mailMessage.To.Add(new MailAddress("test@test.com", "NameÆØÅ"));
Run Code Online (Sandbox Code Playgroud)
总结一下:
对于编码问题,我的意思是'ø'出现

我正在尝试使用SmtpClient和MailMessage类发送包含非ASCII字符的电子邮件.
我正在使用外部邮件服务(MailChimp),我的一些电子邮件已被其SMTP服务器拒绝.我联系了他们,这是他们回复的内容:
主题行似乎是Base64编码,然后是Quoted-Printable编码,通常应该没问题,但其中一个字符被分成两行.因此,当您的主题行有点长时,为了正确处理,它会被分为两行.当在主题行中使用UTF-8引用可打印时,不应该在行之间断开字符串.相反,应该缩短一行,以便将完整的字符串保持在一起.在这种情况下,没有发生这种情况,因此表示单个字符的字符串在多行中被破坏,因此无法有效地使用UTF-8引用 - 可打印编码.
有问题的主题如下:
Subject: XXXXXXX - 5 personnes vous ont nommé guide
Run Code Online (Sandbox Code Playgroud)
在UTF-8/Base64中:
Subject: WFhYWFhYWCAtIDUgcGVyc29ubmVzIHZvdXMgb250IG5vbW3DqSBndWlkZQ==
Run Code Online (Sandbox Code Playgroud)
因为该标头将超过某个最大长度(我不确定它是Quoted-Printable编码及其每行76个字符的限制,还是SMTP标头限制),在编码和拆分后,标题将变为:
Subject: =?utf-8?B?WFhYWFhYWCAtIDUgcGVyc29ubmVzIHZvdXMgb250IG5vbW3D?=
=?utf-8?B?qSBndWlkZQ==?=
Run Code Online (Sandbox Code Playgroud)
显然,这会在解码时导致问题(因为第一行无法解码为有效字符串).我不确定我是否完全理解这个问题,我有以下问题:
另请注意,其他一些SMTP服务器将接受此消息,但这并不意味着它有效.
作为一种解决方法,我尝试禁用Base64编码,这显然是不必要的,但MailMessage类具有控制此编码的BodyTransferEncoding属性,但仅适用于消息的正文部分.没有属性似乎控制主题的"转移"编码.