设为首页
优惠IDC
收藏本站
六狼博客
六狼论坛
开启辅助访问
切换到窄版
用户名
Email
自动登录
找回密码
密码
登录
立即注册
只需一步,快速开始
只需一步,快速开始
快捷导航
门户
首页
BBS
云计算
大数据
手机
移动开发android,ios,windows phone,windows mobile
编程
编程技术java,php,python,delphi,ruby,c,c++
前端
WEB前端htmlcss,javascript,jquery,html5
数据库
数据库开发Access,mysql,oracle,sql server,MongoDB
系统
操作系统windows,linux,unix,os,RedHat,tomcat
架构
项目管理
软件设计,架构设计,面向对象,设计模式,项目管理
企业
服务
运维实战
神马
搜索
搜索
热搜:
php
java
python
ruby
hadoop
sphinx
solr
ios
android
windows
centos
本版
帖子
用户
六狼论坛
»
首页
›
操作系统
›
windows
›
eml文件的解析和发送 [三角猫]
返回列表
查看:
56
|
回复:
0
eml文件的解析和发送 [三角猫]
[复制链接]
zu14
zu14
当前离线
积分
792
窥视卡
雷达卡
升级
58.4%
当前用户组为
进士
当前积分为
792
, 升到下一级还需要 208 点。
256
主题
256
主题
256
主题
进士
进士, 积分 792, 距离下一级还需 208 积分
进士, 积分 792, 距离下一级还需 208 积分
积分
792
发消息
楼主
|
发表于 2013-2-7 03:53:08
|
显示全部楼层
|
阅读模式
最近,我发布了几篇关于
.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引用。
添加引用,会在项目的引用里出现下面的2项:
下面我对发送EML文件,封装了一个类(只做了基本封装,大家可以自己扩展)
<div class="cnblogs_code">
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
}
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
千斤顶
显身卡
返回列表
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
本版积分规则
发表回复
回帖后跳转到最后一页
Copyright © 2008-2020
六狼论坛
(http://it.6wolf.com) 版权所有 All Rights Reserved.
Powered by
Discuz!
X3.4
京ICP备14020293号-2
本网站内容均收集于互联网,如有问题请联系
QQ:389897944
予以删除
快速回复
返回顶部
返回列表