为Jmail.net增加ReplyTO功能并加快发送多封邮件速度
首先声明:本文的内容及所涉及的技术,仅做学习和技术研究,并不涉及任何对相关公司软件版权的有意侵犯。
放长假以来,天天在琢磨邮件的事,不过通过这几天也还是认真的学习和了解了一下SMTP协议和指令,对邮件发送的各个方面也有了一些了解,特别是自己编写的那个邮件发送平台小软件为了做的更好,不得不一次次深入的学习,自己的能力也得到了提高。
在邮件发送小程序的编写过程中,我做了几次测试,发现邮件的发送速度都很慢,平均下来要15秒到16秒才能发出一封,这样的话,如果我某个时段有100封邮件需要发送,那差不多要半个多小时,用手机发短信都用不了那么长时间呀。一开始我以为是自己的代码有问题,仔细检查后没有发现问题。下在纠结的时候,一次偶然的测试时,我没有使用公司的SMTP服务器,而是使用了新浪的smtp.sina.com服务器,这时发现邮件发送的速度约为1至2秒一封,问题找到了,原来是出在公司的邮件服务器上。
公司的邮件服务器使用的是Lotus Notes 8.0,一台小型机,四千左右用户,从理论上来说,不应该这么慢。与邮件服务器管理员联系,请他在后台监测一下发送的过程,他监测后告诉我,每发送一封邮件,都要连接一次服务器,而我们的服务器前段时间刚做了一次安全基线,加上了一个参数,“用于验证的 SMTP 会话发送的邮件是否来自通过验证的用户的 Internet 地址,此设置的目的是确认用户没有尝试伪造“收件人”域”。这有可能是造成每次连接服务器验证时间过长的情况。相关信息如下:
[454808:00136-03743] 2010-10-08 13:32:13 SMTP Server: localhost (10.169.**.**) connected
[454808:00136-03743] 2010-10-08 13:32:13 SMTP Server: Authentication succeeded for user ******* ; connecting host 10.169.**.**
[454808:00136-02218] 2010-10-08 13:32:13 SMTP Server: Message 001E6A8C (MessageID: ) received
[454808:00136-03743] 2010-10-08 13:32:13 SMTP Server: localhost (10.169.**.**) disconnected. 1 message[s] received
[364650:00020-04113] 2010-10-08 13:32:13 Router: Message 001E6A8C delivered to *******
[454808:00136-02218] 2010-10-08 13:32:30 SMTP Server: localhost (10.169.**.**) connected
[454808:00136-02218] 2010-10-08 13:32:30 SMTP Server: Authentication succeeded for user ******* ; connecting host 10.169.**.**
[454808:00136-03743] 2010-10-08 13:32:30 SMTP Server: Message 001E710C (MessageID: ) received
[454808:00136-02218] 2010-10-08 13:32:30 SMTP Server: localhost (10.169.**.**) disconnected. 1 message[s] received
[364650:00016-03085] 2010-10-08 13:32:30 Router: Message 001E710C delivered to *******
如果问题的确是出在每次连接验证的时候时间过长的话,如果是发送多封邮件,是否可以验证一次后连续发送,最后再关闭呢?认真的查阅了Jmail.Net的各个参数,发现Jmail.Net并没有提供这方面的功能,它只能每次发送一封邮件时连接一次服务器,它自身的群组邮件功能也不适用于我想达到的每封邮件内容不相同的目的,在网上搜索了一些相当内容也没有合适的,最后决定自己动手改造Jmail.Net。
下载到一个Jmail.Net的反编译源码(需要的网友请自行搜索下载,这里就不给出下载地址了),装入VS2005,开始阅读代码。
从编写代码时的自动提示就可以看出,发送的代码由Dimac.Jmail.Smtp.Send()来实现,直接查看Dimac.JMail.Smtp项目下的Smtp.cs代码。定位到最主要的功能实现代码上:
01
public
void
Send(Message message)
02
{
03
if
(message ==
null
)
04
{
05
throw
new
ArgumentNullException(
"message"
,
"Message cannot be null."
);
06
}
07
using
(SmtpClient client =
new
SmtpClient(
this
.m_logStream))
08
{
09
client.Connect(
this
.m_hostName,
this
.m_port);
10
client.Helo(
this
.m_domain);
11
client.Auth(
this
.m_authentication, (
this
.m_userName ==
null
) ?
string
.Empty :
this
.m_userName, (
this
.m_password ==
补充:软件开发 , C# ,
部分文章来自网络,