码迷,mamicode.com
首页 > Web开发 > 详细

在.Net中将MailMessage邮件信息保存为本地的eml文件

时间:2015-07-30 18:46:51      阅读:200      评论:0      收藏:0      [点我收藏+]

标签:

最近不知道是不是服务器的IP被163的封了, 网站发送邮件发布出去, 所以想了个办法, 把邮件保存下来, 然后下载下来回复, 找了好多方法都不好用, 自己试了一些, 根据园里面的一些代码改写的, 实测可用

先定义扩展方法:

使用的framework版本为 .net 3.5

namespace System.Net.Mail
{
    public static class MailMessageExtend
    {
        //1
        public static byte[] ToArray(this MailMessage msg)
        {
            const BindingFlags flags = BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy;
            using (var ms = new MemoryStream())
            {
                var assembly = typeof(System.Net.Mail.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();
            }
        }
        //2
        public static void ToArray(this MailMessage msg, string Path)
        {
            const BindingFlags flags = BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy;
            using (var ms = new MemoryStream())
            {
                var assembly = typeof(System.Net.Mail.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 });

                byte[] content = ms.ToArray();
                using (var file = new FileStream(Path, FileMode.Create))
                {
                    file.Write(content, 0, content.Length);
                }
            }
        }
    }
}

本人菜鸟, 定义扩展方法,怎么定义, 搞了好半天才明白, 其实外面还要套一层对应的命名空间

使用示例很简单,自己改起来挺方便的, 方法2就是我自己方便使用扩展的

//生成MailMessage
MailMessage msg = SendEmailView(model, "127.0.0.1");  //项目里面的方法, 返回MailMessage
string path = string.Format("/Eml/{0}.eml", ID);
//调用方法, 不加path参数的话就是调用方法1,需要自己接收byte数组
msg.ToArray(path);
Response.Redirect(path);

参考地址

http://www.cnblogs.com/westsource/archive/2010/11/01/1865992.html

这篇博客里面的  

那接下来要做的就是用上MailWriter这个内部(internal)类,当然这是很简单的事:

这句下面的代码

里面写的这个方法, 

大概在 msg.GetType().GetMethod(  .......这个地方, 总是报错

也没查出来是什么原因, 有知道的在下面回复一下, 我开始以为是framework版本的原因, 后台几个版本都试了 不行

 

 2015-07-30

在.Net中将MailMessage邮件信息保存为本地的eml文件

标签:

原文地址:http://www.cnblogs.com/juley/p/4689778.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!