`
zu14
  • 浏览: 459941 次
  • 性别: 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#解析eml、CDO解析发送eml(Demo)

    C#中可以使用System.Net.Mail命名空间下的MailMessage类来解析EML文件。以下是一段基本的代码示例: ```csharp using System.IO; using System.Net.Mail; public static MailMessage ParseEmlFile(string filePath...

    C#读取.eml文件(带附件下载)

    在C#中,我们可以使用`System.Net.Mail`命名空间中的`MailMessage`类来解析`.eml`文件。以下是一段示例代码,展示了如何加载和解析`.eml`文件: ```csharp using System.IO; using System.Net.Mail; public void ...

    C#批量转换邮件格式MSG-EML互转

    这段代码会遍历"InputFolder"下的所有文件,根据文件扩展名调用相应的转换函数,并将转换后的文件保存到"OutputFolder"。 通过这种方式,你可以轻松地实现C#环境中大规模的邮件格式转换。记住,使用Aspose.Email库...

    C# 使用SmtpClient类发送电子邮件

    在C#编程语言中,`System.Net.Mail`命名空间提供了`SmtpClient`类,用于通过SMTP(简单邮件传输协议)发送电子邮件。本教程将详细解释如何使用`SmtpClient`类来实现电子邮件的发送,并结合提供的源代码进行分析。 ...

    EMAIL发送系统(C#+基于SMTP认证)2.0[源文件]

    C#提供了FileStream、MemoryStream等类来处理文件,结合MailMessage的Attachments属性,可以方便地添加或处理邮件附件。 8. 错误处理和异常处理:在实际开发中,需要考虑网络不稳定、服务器错误等情况。C#的try-...

    提取eml文件或txt文件中的电子邮件地址.rar_eml c#_eml 邮件_提取txt_邮件_邮件提取

    首先,我们需要读取eml文件并将其转换为MailMessage对象,然后可以访问其To、Cc和Bcc属性,它们分别代表了收件人、抄送人和密送人的列表,这些列表中包含了电子邮件地址。同时,我们还需要遍历邮件的正文中可能存在...

    C#+基于SMTP认证

    总之,C#通过SMTP认证发送邮件涉及了`SmtpClient`和`MailMessage`类的使用,以及必要的身份验证设置。了解这些基本概念和方法,开发者就能创建出能够安全、可靠地发送邮件的C#程序。在实际项目中,根据需求,还可以...

    C#+NET 网上书店系统

    《C#+.NET 网上书店系统》项目是一个基于.NET框架和C#编程语言的电子商务平台,旨在实现一个...通过这个项目,开发者可以深入了解.NET框架和C#语言在实际项目中的应用,为将来从事更复杂的Web应用开发打下坚实基础。

    C#使用MailMessage发送邮件

    总结一下,C#使用`MailMessage`发送邮件的过程主要包括:创建`MailMessage`对象,设置邮件属性,创建并配置`SmtpClient`,然后通过`SmtpClient`发送邮件。在实际项目中,还需要考虑异常处理、日志记录和性能优化等...

    C# 邮件发送类,MailMessage

    本篇文章将深入探讨`MailMessage`类及其在C#中的应用。 首先,让我们了解`MailMessage`类的基本概念。`MailMessage`类代表一封电子邮件,包含了邮件的所有关键属性,如发件人、收件人、主题和正文。以下是一些主要...

    Haokoo.net免费域名系统 (C#+VS.net版)

    《Haokoo.net免费域名系统 (C#+VS.net版)》是一个专为初学者设计的教育项目,旨在帮助用户了解并掌握.NET框架下C#语言和Visual Studio开发环境的应用。这个系统涵盖了WEB服务器控件的基本使用,以及一些关键功能的...

    一个采用ASP.NET +C#+Gmail credentials实现邮件发送的程序例子

    1. **配置SMTP服务器**:设置SmtpClient的属性,如Host(Gmail的SMTP服务器地址)、Port(通常是587或465,取决于是否使用SSL/TLS加密)、UseDefaultCredentials(设置为false)以及Credentials(使用Google提供的...

    MSG转EML工具.zip

    这段代码首先加载了一个MSG文件,然后将其转换为Aspose.Email中的MailMessage对象,最后将这个MailMessage对象保存为EML格式的文件。值得注意的是,由于使用了Aspose试用版,转换后的EML文件中可能会包含“&lt;试用版&gt;...

    基于C#+ASP.NET实现的Email Sending Web Service服务程序源码

    5. **System.Net.Mail命名空间**:熟悉C#中用于邮件处理的类,如MailMessage(用于构建邮件内容)、SmtpClient(用于与SMTP服务器交互)和SmtpDeliveryMethod(定义邮件发送方式)。 6. **Web服务调用**:了解如何在...

    c#定时器+多线程

    在C#中,使用`System.Net.Mail`命名空间的`SmtpClient`和`MailMessage`类可以方便地发送邮件。在`OnTimedEvent`事件处理程序中,可以构造邮件信息并发送: ```csharp using System.Net; using System.Net.Mail; ...

    C#实现简单的SmtpClient发送邮件

    本文将深入探讨如何使用C#语言结合.NET Framework中的`System.Net.Mail`命名空间下的`SmtpClient`类来实现邮件的发送,这不仅适用于初学者了解邮件发送的基本原理,也对有经验的开发者优化和调试邮件服务有所帮助。...

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

    例如,`mailMessage.Attachments.Add(new Attachment("path_to_your_file"))`,其中`path_to_your_file`是你要附加的文件路径。 4. **SMTP配置**:接下来,创建一个`SmtpClient`对象并设置SMTP服务器的相关信息,如...

    C#发送邮件(MailMessage,MailAddress)

    总结来说,C#中的`MailMessage`和`MailAddress`是用于构建邮件消息的核心类,配合`SmtpClient`进行发送操作,使得在C#应用程序中发送邮件变得简单而高效。理解并掌握这些类的使用方法,对于任何需要通过代码发送邮件...

    C#邮件发送接收+邮件内容解码

    在C#中,我们可以使用System.Net.Mail命名空间中的SmtpClient类来实现邮件发送。以下是一个基本的SMTP邮件发送示例: ```csharp using System.Net; using System.Net.Mail; public void SendMail(string from, ...

Global site tag (gtag.js) - Google Analytics