`
zu14
  • 浏览: 446304 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类

MailMessage保存为eml文件(C#+SmtpClient)

阅读更多

.NET 自从2.0开始,大大提升了 Mail.SmtpClient 的功能,对于发邮件,可谓游刃有余了。但是,美中不足的是没有提供保存邮件内容为eml文件的功能

实际上,SmtpClient 和 MailMessage 已经实现了这个功能,只是这个功能是 NonPublic 的,对于空间外,不可见而已。

利用 Reflector 反编译一下 System.Net.Mail.SmtpClient 可以看到:

SmtpClient.Send

 

在 Send(MailMessage) 方法中,在MAIL被发送之前,是调用了一个 MailWriter fileMailWriter = this.GetFileMailWriter(this.PickupDirectoryLocation);

我们顺藤摸瓜,继续定位 GetFileMailWriter 这个方法

System.Net.Mail.MailWriter

上面的代码中,赫然醒目的显示着 .eml ,看了里面的逻辑,我们其实就清楚了,SmtpClient.Send 之前,也是先生成了一个临时的eml文件,然后再发送这个文件出去的。

其中的关键就在 new MailWriter(new FileStream(str2, FileMode.CreateNew)) 这里。

我们接下来定位到我们的核心 MailWriter :

SmtpClient.Send

从上面可以看到,MailWriter 是一个 internal 的 class,所以我们在普通的调用Mail.SmtpClient 等的命名空间下,是看不到的,这时我们就需要用到反射(Reflection) 了。

下面给出完整的实现代码:

/// <summary>
/// 将MailMessage保存为eml文件
/// </summary>
/// <param name="msg">待保存的具有内容的MailMessage</param>
/// <param name="emlFileAbsolutePath">保存后的eml文件的路径</param>
static void SaveToEml(MailMessage msg, string emlFileAbsolutePath)
{
const BindingFlags flags = BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy;
using (MemoryStream ms = new MemoryStream())
{
Assembly assembly = typeof(System.Net.Mail.SmtpClient).Assembly;
Type tMailWriter = assembly.GetType("System.Net.Mail.MailWriter");
object mailWriter = Activator.CreateInstance(tMailWriter, flags, null, new object[] { ms }, CultureInfo.InvariantCulture);
msg.GetType().GetMethod("Send", flags).Invoke(msg, new object[] { mailWriter, true });
File.WriteAllText(emlFileAbsolutePath, System.Text.Encoding.Default.GetString(ms.ToArray()), System.Text.Encoding.Default);
}
}

 

使用方法:

MailMessage msg = new MailMessage();
msg.Subject = "hello, i am deltacat";
msg.From = new MailAddress("deltacat@microsoft.com");
msg.To.Add("zu14.cn@live.cn");
msg.Body = "welcome to www.zu14.cn";
SaveToEml(msg, @"d:\test.eml");

 

好了 ,完结了,祝大家好运吧!

分享到:
评论

相关推荐

    C#使用MailMessage发送邮件

    C#编码,使用MailMessage对象发送邮件

    C# 邮件发送类,MailMessage

    C# 邮件发送类,MailMessage

    C#发送邮件(MailMessage,MailAddress)

    利用MailMessage,MailAddress发送邮件

    c#发送邮件

    MailMessage MailMessage_Mai = new MailMessage(); FileStream FileStream_my = null; //附件文件流 #region 设置Smtp服务器信息 /// /// 设置Smtp服务器信息 /// /// &lt;param name="ServerName"&gt;SMTP...

    c# 实现发送邮件的功能

    微软已经为我们准备好了现成的工具类供我们调用: MailMessage //邮件信息类 SmtpClient //邮件发送类 首先需要在项目的类文件中引用以下命名空间: using System.Net; using System.Net.Mail; 然后直接上封装...

    从.EML文件轻松检索电子邮件信息-修订

    将EML上载到System.Net.Mail.MailMessage的C#类

    C#发送邮件

    C#使用MailMessage和SmtpClient发送邮件,可多人发送和抄送,可发送附件

    C#全能速查宝典

    《C#全能速查宝典》共分为8章,分别介绍了C#语言基础、Windows窗体及常用控件、Windows高级控件、控件公共属性、方法及事件、数据库开发、文件、数据流与注册表、GDI+绘图技术和C#高级编程,共包含562个C#编程中常用...

    简单发邮件小程序

    1:发邮件功能如下:  a:批量添加邮箱  b:添加多个附件、并支持查看附件信息和移除附件。...3:功能采用c#的SmtpClient和MailMessage实现,源代码如下: 批量导入邮箱: 添加附件: 邮件发组: 发邮件:

    Visual C# 2005程序设计自学手册 随书源码第一部分(共三部)

    16.4.1 MailMessage类和SmtpClient类的作用 367 16.4.2 POP3类的作用 368 16.4.3 电子邮件的发送 369 16.4.4 电子邮件的接收 370 16.5 本章小结 375 第17章 注册表应用 376 17.1 注册表基础知识 377 ...

    Csharp发送电子邮件

    Csharp发送电子邮件 MailMessage SmtpClient

    c#发送邮件实例(可以添加附件)

    winform发送邮件的一个小demo,填入收件人、发件人、授权码、服务器和端口即可发送邮件。

    Winform测试发送邮件

    MailMessage 类:MailMessage类是.NET Framework中管理邮件的专用类,表示可以使用SmtpClient类发送的电子邮件。MailMessage 类的实例表示一个电子邮件的所有内容,并用SmtpClient类来传输到SMTP服务器。若要指定...

    C#邮件 功能实现教学 PPT

    6.1 基本概念 6.1.1 邮件传输规范 6.1.2 SMTP基本命令 ...6.2.3 MailMessage类 6.2.4 Attachment 类 6.2.5 SmtpClient 类 6.3 收件收发举例 6.3.1 同步方式收发邮件举例 6.3.2 异步方式收发邮件举例

    c#发送邮件类方法源码

    c#发送邮件类方法源码 自定义邮件发送类mail 发送方法sendMail(MailMessage mm) 及发送附件setAttachment(MailMessage mm, string[] files)

    C# Email发送邮件 对方打开邮件可获得提醒

    本文实例为大家分享了C# Email发送邮件的具体代码,供大家参考,具体内容如下 //回执地址 var Receipt = 填写你需要回执的地址; //实例化两个必要的 MailMessage mail = new MailMessage(); SmtpClient smtp = ...

    C#邮件直接发送组件

    C#写的直接邮件发送组件. 使用它可以直接发送邮件,不需要 smtp服务器. 但是有一个前提是你所在的ip没有被对方列入了黑名单. 大部分的动态地址都已经被列入黑名单了. 所以你可能会发送失败. 发送失败是有直接提示会...

    asp.net Email

    asp.net在线发邮件! /// /// 发送邮件using System.Net.Mail; /// /// 接收方邮件地址 /// 邮件标题 ... _smtpClient.Send(_mailMessage); return true; } catch { return false; } }

    SMTP范例程序 C#

    MailMessage mm = new MailMessage(); //实例化一个邮件类 mm.From = new MailAddress("hello@long.cn", "LT-SMTP服务器", System.Text.Encoding.UTF8); //收件方看到的邮件来源; //第一个参数是发信人邮件...

Global site tag (gtag.js) - Google Analytics