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

eml文件的解析和发送 [三角猫]

阅读更多

最近,我发布了几篇关于 .NET 和 EML 文件的邮件相关 的博文,引来了一些网友的关注与讨论。尤其是对于“如何解析EML文件的内容”和 “发送现有的EML文件”。

目前,比较主流的解析EML文件的方式,基本是对MIME格式的分析,基于对 RFC822及其后续扩展的标准 的理解。但是,此种方法工作量太大,且过于繁琐。

我是个懒人,喜欢找捷径

大家都知道,微软的 outlook express 是可以保存和打开并发送EML文件的。那么很明显,outlook express 肯定是可以解析EML文件的。

问题就来了:我们可不可以利用微软现有的成果呢?

针对这个问题,我们再回到.NET中发送邮件的功能上,为了体现的明显,我们回到.NET 1.1上,.NET 1.1 发送邮件的是 System.Web.Mail ,这个System.Web.Mail 当时是比较弱的,原因就是它是基于 cdosys.dll 的基础上的且并未做富实现。

cdosys.dll是从windows 2000 开始被正式引入的,后续的操作系统都支持,关于cdosys.dll的细节,请看MSDN

经过一个晚上对cdosys的研究,终于得出了结果:CDOSYS是可以加载eml文件并进行解析和直接发送的

cdosys属于COM,在.NET使用,需要添加COM引用。

CDOSYS

 

添加引用,会在项目的引用里出现下面的2项:

image

下面我对发送EML文件,封装了一个类(只做了基本封装,大家可以自己扩展)

EML文件发送类
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->  1    /**//// <summary>
  2    /// 功能: 发送EML文件
  3    /// 作者: 三角猫
  4    /// 网址: http://www.zu14.cn
  5    /// 声明: 转载务必保留此信息
  6    /// </summary>

  7    public class EmlSender
  8    {
  9        private string emlFilePath;
 10        private string smtpServer;
 11        private string smtpServerPort = "25";
 12        private string smtpUserName;
 13        private string smtpPassword;
 14        /**//// <summary>
 15        /// 构造函数
 16        /// </summary>
 17        /// <param name="EmlFilePath">EML文件的绝对路径</param>

 18        public EmlSender(string EmlFilePath)
 19        {
 20            emlFilePath = EmlFilePath;
 21        }

 22
 23        /**//// <summary>
 24        /// SMTP服务器地址
 25        /// </summary>

 26        public string SmtpServer
 27        {
 28            set { smtpServer = value; }
 29        }

 30
 31        /**//// <summary>
 32        /// SMTP服务器端口号
 33        /// </summary>

 34        public string SmtpServerPort
 35        {
 36            set { smtpServerPort = value; }
 37        }

 38
 39        /**//// <summary>
 40        /// SMTP服务器认证帐号
 41        /// </summary>

 42        public string SmtpUserName
 43        {
 44            set { smtpUserName = value; }
 45        }

 46
 47        /**//// <summary>
 48        /// SMTP服务器认证密码
 49        /// </summary>

 50        public string SmtpPassword
 51        {
 52            set { smtpPassword = value; }
 53        }

 54
 55        /**//// <summary>
 56        /// 使用CDOSYS发送EML文件
 57        /// </summary>

 58        public void Send()
 59        {
 60            CDO.Message oMsg = new CDO.Message();         
 61            CDO.IConfiguration iConfg = oMsg.Configuration;
 62            ADODB.Fields oFields = iConfg.Fields;
 63
 64            //设置CDO相关的发送参数,主要是用于SMTP服务器的认证
 65            ADODB.Field oField = oFields["http://schemas.microsoft.com/cdo/configuration/sendusing"];
 66            oField.Value = "2";
 67
 68            oField = oFields["http://schemas.microsoft.com/cdo/configuration/smtpserverport"];
 69            oField.Value = smtpServerPort;
 70
 71            oField = oFields["http://schemas.microsoft.com/cdo/configuration/smtpserver"];
 72            oField.Value = smtpServer;
 73
 74            oField = oFields["http://schemas.microsoft.com/cdo/configuration/languagecode"];
 75            oField.Value = "0x0804";
 76
 77            //下面三项可以自己根据需要去填写,我比较懒
 78            oField = oFields["http://schemas.microsoft.com/cdo/configuration/sendemailaddress"];
 79            oField.Value = "";
 80
 81            oField = oFields["http://schemas.microsoft.com/cdo/configuration/smtpuserreplyemailaddress"];
 82            oField.Value = "";
 83
 84            oField = oFields["http://schemas.microsoft.com/cdo/configuration/smtpaccountname"];
 85            oField.Value = "";
 86            //------------------------
 87
 88            oField = oFields["http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout"];
 89            oField.Value = "60";
 90
 91            oField = oFields["http://schemas.microsoft.com/cdo/configuration/sendusername"];
 92            oField.Value = smtpUserName;
 93
 94            oField = oFields["http://schemas.microsoft.com/cdo/configuration/sendpassword"];
 95            oField.Value = smtpPassword;
 96
 97            oField = oFields["http://schemas.microsoft.com/cdo/configuration/smtpauthenticate"];
 98            oField.Value = "1";
 99
100            oFields.Update();
101
102            try
103            {
104                //读取EML文件到CDO.MESSAGE,做分析的话,实际是用了下面的部分
105                ADODB.Stream stm = new ADODB.Stream();
106                stm.Open(System.Reflection.Missing.Value,
107                         ADODB.ConnectModeEnum.adModeUnknown,
108                         ADODB.StreamOpenOptionsEnum.adOpenStreamUnspecified,
109                         """");
110                stm.Type = ADODB.StreamTypeEnum.adTypeBinary;//二进制方式读入
111
112                stm.LoadFromFile(emlFilePath); //将EML读入数据流
113
114                oMsg.DataSource.OpenObject(stm, "_stream"); //将EML数据流载入到CDO.Message,要做解析的话,后面就可以了。
115
116                stm.Close();
117
118                oMsg.Send(); //发送
119            }

120            catch
121            {
122                throw;
123            }

124            finally
125            {
126                oField = null;
127                oFields = null;
128                oMsg = null;
129            }

130        }

131    }

 

使用实例
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->1EmlSender eml = new EmlSender(@"d:\a.eml");
2            eml.SmtpServer = "smtp.zu14.cn";
3            eml.SmtpServerPort = "25";
4            eml.SmtpUserName = "admin@zu14.cn";
5            eml.SmtpPassword = "*****";
6            eml.Send();

 

至此, 我关于.NET 发送MAIL和保存EML,以及对EML的发送和解析相关的内容, 算是告一段落了。

希望大家多拍砖吧。

分享到:
评论

相关推荐

    eml文件解析 C++ 代码

    eml文件解析 C++ 代码,从codeproject上面下载,希望对你有用。 http://lamp.codeproject.com/Articles/5759/MIME-Message-Composer-Analyser?rp=/KB/IP/mimecpp/mimecpp_src.zip

    c#解析eml、CDO解析发送eml(Demo)

    本篇文章将详细探讨如何使用C#编程语言解析EML文件,并通过CDO(Collaborative Data Objects)库来发送EML邮件。我们将通过具体的Demo来展示这两种方法。 首先,我们来讨论C#解析EML文件。C#中可以使用System.Net....

    eml文件解析

    在IT行业中,电子邮件格式EML(Email Message Format)是一种用于...基础是理解EML文件格式和MIME规范,关键步骤包括文件读取、邮件头解析和BASE64解码。实际的代码实现应结合具体需求和库函数进行,确保安全性和性能。

    vc++开发,eml文件解析

    本项目聚焦于使用VC++来解析`.eml`文件,这是一种常见的电子邮件格式,通常用于存储邮件信息,包括邮件头、邮件体和附件。 `.eml`文件解析涉及到的关键知识点主要包括: 1. **邮件协议**:`.eml`文件主要与邮件...

    对邮件eml文件的完整解析

    本篇将深入探讨如何对`.eml`文件进行完整解析,涉及邮件解析的基础知识、Base64和QP解码的原理以及在邮件分析中的应用。 首先,我们需要了解`.eml`文件的结构。`.eml`文件基于互联网邮件扩展(MIME)标准,遵循RFC ...

    python3.7解析eml文件

    通过对eml文件的解析获得其中的from、to、date、subject、body、atta 该文件可以实现基本功能,未经过严格测试,可能存在一定缺陷和BUG

    C++ 解析eml格式邮件

    在IT行业中,C++是一种强大的编程语言,常用于开发...总之,C++解析EML格式邮件是一项涉及多种技术的任务,包括ADO、MIME解析和文件操作。通过学习和实践,开发者可以掌握这一技能,为各种邮件处理应用提供强大的支持。

    EML格式解析及其访问实现

    在Windows平台上,可以使用Visual C++(如VC6.0)作为开发工具,实现对EML文件的解析和处理。 ##### 3.1 解析邮件头部 邮件头部的信息可以通过读取EML文件并按照规定的格式解析每一条目来获取。具体步骤包括: - ...

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

    以下是一段示例代码,展示了如何加载和解析`.eml`文件: ```csharp using System.IO; using System.Net.Mail; public void ReadEmlFile(string filePath) { // 创建MailMessage对象 MailMessage message = new ...

    Eml文件怎么打开?eml文件打开方法有哪些?【详解】.docx

    3. 等Eml文件上传完成之后,确认邮件信息后,单击“发送”。 4. 等邮件发送成功后,单击“收件箱”,然后单击接收到的刚才发送的邮件。 5. 单击附件栏下的“预览”,即可查看Eml文件正文。 三、使用记事本打开Eml...

    eml文件阅读器中文版绿色版.rar

    EML文件阅读器中文版是一款专门设计用于打开和阅读EML格式邮件的绿色软件。EML文件是电子邮件的标准格式之一,通常由许多电子邮件客户端(如早期版本的Microsoft Outlook Express、Windows Live Mail或 Thunderbird...

    php读取eml实例、php解析eml、eml解析成网页

    本实例将探讨如何使用PHP来读取和解析EML文件,以便在网页中展示或处理邮件内容。 首先,我们需要了解EML文件的结构。EML是Internet Message Format (IMF)的文件扩展名,遵循RFC 822标准,后来被RFC 5322所取代。...

    eml 解析 构建

    通过以上步骤,你应该能够在iOS应用中实现EML文件的解析和展示。记得在实际开发中,遵循良好的编程实践,编写清晰的代码,同时注意性能优化,以提供流畅的用户体验。如有问题,可以参考库的文档或在线社区寻求帮助。

    .eml解析,内容直接打印html代码

    javaEmail html 预览 .eml邮件,直接打印html代码,格式与html邮箱预览一样,附件没有写,自行看javaEmail文档,要求JDK1.7、java EE6 LIbraries

    eml-format:RFC 822 EML文件格式解析器和生成器

    EML文件格式一个纯Node.js库,用于解析和构建EML文件,即描述的电子邮件格式()。 EML由POP3协议返回,并由许多电子邮件代理(如Mozilla Thunderbird或Microsoft Outlook)处理。 一个EML文件由类似于HTTP结构的...

    eml文件怎么打开.docx

    EML 文件是一种电子邮件格式文件,主要用于存储电子邮件的内容和信息。EML 文件格式是微软公司在 Outlook 中所使用的一种遵循 RFC822 及其后续扩展的文件格式,并成为各类电子邮件软件的通用格式。 EML 文件的组成...

    eml文件怎么打开,eml是什么格式呢?.docx

    EML 文件格式在欧洲政府机关和全世界的一些非政府组织中得到了广泛的实际应用。 打开 EML 文件的方法: 1. 使用 Outlook 打开 EML 文件:右击 EML 文件,选择“打开方式”,然后找到 Outlook。 2. 使用 Foxmail ...

    批量提取eml

    在IT行业中,电子邮件...综上所述,批量提取EML文件的附件和邮件头涉及文件I/O操作、邮件解析、数据提取和处理,以及可能的性能优化和安全措施。熟练掌握这些知识点可以帮助IT专业人士高效地处理大量的电子邮件数据。

    C#读取.dbx文件导出邮件为.eml文件

    2. **解析.dbx文件结构**:.dbx文件的内部结构并不直观,需要按照其特定的二进制格式解析,找到邮件的起始和结束位置。 3. **读取邮件数据**:提取邮件的各个部分,包括主题、发件人、收件人、日期等,以及邮件正文...

    eml文件如何打开.docx

    EML 文件格式在欧洲政府机关和全世界的一些非政府组织得到了广泛的实际应用。 EML 文件可以用 Foxmail 这个电子邮件客户端软件打开。打开 EML 文件的步骤如下: 1. 找到下载的 EML 格式文件。 2. 右击文件,选择...

Global site tag (gtag.js) - Google Analytics