MailMessage to EML
EML格式是微软公司在Outlook中所使用的一种遵循RFC822及其后续扩展的文件格式,并成为各类电子邮件软件的通用格式。
做个笔记,C# 邮件处理保存为eml格式;
一、网上好多这样的写法,可以在.net formwork4.5里面 百试不爽…………
/// <summary> /// 2.0可以允许 4.5不可以 /// </summary> /// <param name="msg"></param> /// <returns></returns> public static byte[] MailMessageToArray(MailMessage msg) { const BindingFlags flags = BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy; using (var ms = new MemoryStream()) { var assembly = typeof(SmtpClient).Assembly; var writerType = assembly.GetType("System.Net.Mail.MailWriter"); var writer = Activator.CreateInstance(writerType, flags, null, new object[] { ms }, CultureInfo.InvariantCulture); msg.GetType().GetMethod("Send", flags).Invoke(msg, new[] { writer, true }); return ms.ToArray(); } }
.netformwork 4.5 运行报错---“用户代码未处理TargetParameterCountException 参数不匹配”
二、柳暗花明
不得不说还是老外的技术牛逼些……
/// <summary> /// MailMessage 转换成eml /// </summary> /// <param name="msg">MailMessage</param> /// <returns>eml字符串</returns> static string MailMessageToEml(MailMessage msg) { 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(msg, BindingFlags.Instance | BindingFlags.NonPublic, null, new[] { mailWriter, true, true }, null); return System.Text.Encoding.UTF8.GetString(stream.ToArray()); //return Encoding.Default.GetString( stream.ToArray()); } }
效果杠杆的
国外的大牛就是一样,发现和他的差距太TM的不小。。。。还有一种解决方案
public static class MailMessageExtensions { public static string RawMessage(this MailMessage m) { var smtpClient = new SmtpClient { DeliveryMethod = SmtpDeliveryMethod.SpecifiedPickupDirectory }; using (var tempDir = new TemporaryDirectory()) { smtpClient.PickupDirectoryLocation = tempDir.DirectoryPath; smtpClient.Send(m); var emlFile = Directory.GetFiles(smtpClient.PickupDirectoryLocation).FirstOrDefault(); if (emlFile != null) { return File.ReadAllText(emlFile); } else return null; } return null; } } class TemporaryDirectory : IDisposable { public TemporaryDirectory() { DirectoryPath = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); Directory.CreateDirectory(DirectoryPath); } public string DirectoryPath { get; private set; } public void Dispose() { if (Directory.Exists(DirectoryPath)) Directory.Delete(DirectoryPath, true); } }
调用方法
public void Mime(string mailFrom, string subject, string body, string mailTo) { MailMessage message = new MailMessage(); message.From = new MailAddress(mailFrom, "", Encoding.UTF8); message.To.Add(new MailAddress(mailTo)); message.Subject = subject; message.SubjectEncoding = Encoding.UTF8;////主题编码 message.Body = body;// "<html><body><h1>Welcome</h1><br>This is an HTML message for outofmemory.cn.</body></html>"; message.IsBodyHtml = true; message.BodyEncoding = Encoding.UTF8;//邮件内容编码 message.Priority = MailPriority.High;//优先级 //string str=MailMessageToEml(message); string ems = MailMessageExtensions.RawMessage(message); }
结果然是令人兴奋,对比而言选择方案一,至于为什么……看看代码就晓得了!
作者:PEPE
出处:http://pepe.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库