zoukankan      html  css  js  c++  java
  • 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);
            }

    结果然是令人兴奋,对比而言选择方案一,至于为什么……看看代码就晓得了!

  • 相关阅读:
    关于李约瑟难题的思考
    《MDX解决方案(第2版)》实例数据部署过程
    在SQL SERVER 2008种使用表值参数
    解决了一个想了很久的问题
    发现可以在两个数据库中共享只读文件组
    java 包位置
    单元测试java
    Cannot determine build data storage root for project
    Vue——绑定值
    浪潮之巅第八章 — 没落的贵族(摩托罗拉)
  • 原文地址:https://www.cnblogs.com/PEPE/p/4513720.html
Copyright © 2011-2022 走看看