ConvertMailMessagetoRawText同。这是相同的解决方案,但作为MailMessage的扩展方法。通过在静态上下文中一次获取ConstructorInfo和MethodInfo成员,可以最大限度地减少一些反射开销。//////使用反射从MailMessage中获取原始内容。///publicstaticclassMailMessageExtensions{privatestaticreadonlyBindingFlagsFlags=BindingFlags.Instance|}BindingFlags.NonPublic;privatestaticreadonlyTypeMailWriter=typeof(SmtpClient).Assembly.GetType("System.Net.Mail.MailWriter");privatestaticreadonlyConstructorInfoMailWriterConstructor=MailWriter.GetConstructor(Flags,null,new[]{typeof(Stream)},null);privatestaticreadonlyMethodInfoCloseMethod=MailWriter.GetMethod("Close",Flags);privatestaticreadonlyMethodInfoSendMethod=typeof(MailMessage).GetMethod("Send",Flags);//////确定我们///需要传递给SaveMethod的参数数量的小技巧。///privatestaticreadonlyboolIsRunningInDotNetFourPointFive=SendMethod.GetParameters().Length==3;//////此MailMessage的原始内容作为MemoryStream。//////呼叫者,召集者。///一个MemoryStream机智h此MailMessage的原始内容。publicstaticMemoryStreamRawMessage(thisMailMessageself){varresult=newMemoryStream();varmailWriter=MailWriterConstructor.Invoke(newobject[]{result});SendMethod.Invoke(self,Flags,null,IsRunningInDotNetFourPointFive?new[]{mailWriter,true,true}:new[]{mailWriter,true},null);result=newMemoryStream(result.ToArray());CloseMethod.Invoke(mailWriter,Flags,null,newobject[]{},null);返回结果;}}要获取底层MemoryStream:varemail=newMailMessage();using(varm=email.RawMessage()){//对原始消息做一些事情}i在MimeKit中实现逻辑,允许您将System.Net.Mail.MailMessage转换为MimeKit.MimeMessage完成后,您只需编写消息到流:varmessage=(MimeMessage)CreateSystemNetMailMessage();使用(varstream=File.Create("C:\message.eml"))message.WriteTo(stream);这不需要反映到内部方法中,这意味着它不依赖于运行时,使其比目前给出的其他答案更具可移植性。我见过这样做依赖于反射的代码。我改编了一个在网上找到的示例来创建此方法:privatestaticMemoryStreamConvertMailMessageToMemoryStream(MailMessagemessage){BindingFlags.NonPublic;程序集assembly=typeof(SmtpClient).Assembly;输入mailWriterType=assembly.GetType("System.Net.Mail.MailWriter");ConstructorInfomailWriterContructor=mailWriterType.GetConstructor(flags,null,new[]{typeof(Stream)},null);objectmailWriter=mailWriterContructor.Invoke(newobject[]{stream});MethodInfosendMethod=typeof(MailMessage).GetMethod("发送",标志);sendMethod.Invoke(message,flags,null,new[]{mailWriter,true},null);MethodInfocloseMethod=mailWriter.GetType().GetMethod("Close",flags);closeMethod.Invoke(mailWriter,flags,null,newobject[]{},null);返回流;然后,您可以将MemoryStream转换为字符串或您需要的任何内容。更新:.NET4.5中的方法签名已更改,这打破了上述内容:System.Net.Mail.MailMessageasaMemoryStreamin.NET4.5beta这就是C#学习教程的全部内容:将MailMessage转换为原始文本共享,如果有用的话给你和你需要了解更多的C#学习教程,希望你多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
