我使用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ÆØÅ"));
总结:
对于编码问题,我的意思是'ø'显示为
答案 0 :(得分:1)
您是否尝试明确指定Subject / Body和MailAddress的编码?
我想当.NET将邮件写入文件夹时,它可以某种方式定义正确的编码(或者文件阅读器可能会以某种方式找到正确的编码来转换数据)。在内存中,一切都是默认编码,这对你不起作用。
答案 1 :(得分:1)
不幸的是,MailMessage对象有问题并且界面很差。
好处是.NET 4.5在Send()中使用allowUnicode标志部分修复它(遗憾的是Send方法仍然是私有的)
下面修改了“解决方案1”。 它以与“解决方案2”相同的方式对主题进行编码。 仅限.NET Framework 4.5。
private static MemoryStream ConvertMailMessageToMemoryStream(MailMessage message)
{
Assembly systemAssembly = typeof(SmtpClient).Assembly;
Type mailWriterType = systemAssembly.GetType("System.Net.Mail.MailWriter");
const BindingFlags nonPublicInstance = BindingFlags.Instance | BindingFlags.NonPublic;
ConstructorInfo mailWriterContructor = mailWriterType.GetConstructor(nonPublicInstance, null, new[] typeof(Stream) }, null);
MethodInfo sendMethod = typeof(MailMessage).GetMethod("Send", nonPublicInstance);
MethodInfo closeMethod = mailWriterType.GetMethod("Close", nonPublicInstance);
using (MemoryStream memoryStream = new MemoryStream())
{
object mailWriter = mailWriterContructor.Invoke(new object[] { memoryStream });
//AssertHelper.IsTrue(sendMethod.GetParameters().Length > 2, ".NET framework must be 4.5 or higher in order to properly encode email subject.");
sendMethod.Invoke(message, nonPublicInstance, null,
new[] { mailWriter, true, false },
null);
closeMethod.Invoke(mailWriter, nonPublicInstance, null, new object[] { }, null);
return memoryStream;
}
}
答案 2 :(得分:0)
message.BodyEncoding = message.SubjectEncoding = message.HeadersEncoding = Encoding.UTF8;