基于Lumisoft.NET实现的邮件发送功能
在前⾯的⼀些⽂章中,有介绍过DotNet内置SMTP类的邮件发送功能,附件、嵌⼊图⽚的模式都有介绍,本⽂继续介绍Lumisoft.NET这个⾮常优秀的开源组件,⽤该组件来设计开发邮件⼯具,将变得更加⽅便,功能更加强⼤。⽹上很多⽂章基本介绍如何使⽤该组件来收取邮件较多,较少介绍使⽤该组件做邮件发送功能的。本⽂主要探寻使⽤该组件实现邮件的发送功能,邮件发送有两种⽅式,⼀种是不⽤发件⼈即可发送邮件,⼀种是使⽤发件⼈账户密码和SMTP服务器来实现邮件发送的,本⽂分别对这两种⽅式进⾏介绍。
组件下载地址:
组件论坛地址:
秉承⼀贯的做法,先贴出相关的实现图形,感官认识下,在进⼊详细的介绍说明,以求达到最好的理解深度。
1、⾸先是发件⼈的设置,可以从⽂本⽂件的导出,以及新建等操作,以⽅便⽤户操作。
2、内容也⽀持导⼊导出,并且保存到数据库,⽅便进⾏记录及操作等,另外可以对内容进⾏随机混淆,混淆的内容在HTML邮件中式隐藏的,⽅便糊弄⼀下服务器的识别。
3、邮件发送可以选择两种⽅式,下⾯将分别介绍这两种⽅式的实现,⼀种采⽤该控件封装⾮常好的邮件直投技术,不需要SMTP账号发送的;⼀种是普通的SMTP发送⽅式。当然我们还可以设置更多的参数,例如邮件尾部信息、HTML内容提⽰、以及⼀些发送期间⾃动拨号的设置操作等。
4、邮件直投技术,通过模拟账户来附加⽤户的邮件地址(或者可以成为伪装)。其中我填写了⼀些常⽤的SMTP服务器的域名,⽅便在其中构造合乎要求的邮件格式,还可以设置邮件回执通知,如下图所⽰。
5、如果是采⽤普通发送⽅式,那么就需要制定⽤户的账号密码等信息,发送的时候,⾃动从启动获取发件⼈信息进⾏批量发送操作。
6、最后体验⼀下少量邮件的发送效果,发送采⽤多线程发送,多线程采⽤⽐较有名的SmartThreadPool组件,并且发送过程总详细记录其中的⽇志,供参考。
介绍完毕相关的功能效果图,下⾯我们来分析下主要功能实现的代码:
代码
private TimerHelper timer = null;
private void btnSend_Click(object sender, EventArgs e)
{
//重置计数变量
failedItems = 0;
successItems = 0;
workItemsCompleted = 0;
workItemsGenerated = 0;
STPStartInfo stpStartInfo = new STPStartInfo();
stpStartInfo.IdleTimeout = 10;
stpStartInfo.MaxWorkerThreads = 100;
stpStartInfo.MinWorkerThreads = 0;
//stpStartInfo.StartSuspended = true;
_smartThreadPool = new SmartThreadPool(stpStartInfo);
_workItemsGroup = _smartThreadPool;
workItemsProducerThread = new Thread(new ThreadStart(this.WorkItemsProducer));
workItemsProducerThread.IsBackground = true;
workItemsProducerThread.Start();
RefreshStatusCount();
int intervalRedial = SystemConfig.Default.IntervalRedial * 1000 * 60;
if (intervalRedial > 0)
{
if (timer != null)
{
timer.Stop();
timer.Dispose();
}
timer = new TimerHelper(intervalRedial,false);
timer.Execute += new TimerHelper.TimerExecution(timer_Execute);
timer.Start();
}
}
private static object locker = new object();
private void timer_Execute()
{
if (Monitor.TryEnter(locker))
{
string message = string.Format("在时间 {0} 时刻执⾏了⼀次重拨号操作!", DateTime.Now);                ShowSendStatus(message);
string RasName = SystemConfig.Default.RasName;
if (!string.IsNullOrEmpty(RasName))
{
message = string.Format("正在准备重新拨号({0})", RasName);
ShowSendStatus(message);
}
Monitor.Exit(locker);
}
else
{
Monitor.Enter(locker);
Monitor.Exit(locker);
}
}
html实现用户注册登录代码上⾯是主要的任务⽣成操作以及相关的拨号操作,其中任务详细的⽣成代码如下所⽰。
private void WorkItemsProducer()
{
CallCtrlWithThreadSafetyEx.SendDetail, "");
EnableControl(false, true, true);
string message = string.Format("任务开始");
RecordMessage(message);
#region⽣成任务
IWorkItemsGroup workItemsGroup = _workItemsGroup;
if (null == workItemsGroup)
{
return;
}
List<string> addressList = GetAddressList();
List<MyMailInfo> mailInfoList = GetMailInfo();
for (int i = 0; i < addressList.Count; i++)
{
try
{
SendJobInfo jobInfo = new SendJobInfo();
jobInfo.domainList = mailDomainList;
jobInfo.mailTo = addressList[i];
jobInfo.mailInfo = GetOneMail(mailInfoList, i);
jobInfo.ShowSendStatus = ShowSendStatus;
jobInfo.currentDomain = (i % mailDomainList.Count);//设置⼀个标志,默认那个账户开始发送                    jobInfo.UseDirectSendType = SystemConfig.Default.EmailDirectSend;
//如果⽤户未指定发送账号,那么采⽤默认的显⽰名称
//如果为空,发送的时候,会⾃动采⽤邮件地址作为显⽰名称
if (string.IsNullOrEmpty(SystemConfig.Default.UserEmailFrom))
{
jobInfo.mailFromDisplay = SystemConfig.Default.DefaultFromDisplayName;
}
workItemCallback = new WorkItemCallback(this.DoWork);
workItemsGroup.QueueWorkItem(workItemCallback, jobInfo);
Thread.Sleep(100);
}
catch (ObjectDisposedException ex)
{
LogTextHelper.WriteLine(ex.ToString());
continue;
}
Interlocked.Increment(ref workItemsGenerated);
}
#endregion
RefreshStatusCount();
message = string.Format("共有 {0} 个任务,还剩下 {1} 个",
workItemsGenerated, workItemsGenerated - workItemsCompleted);
CallCtrlWithThreadSafetyEx.SetText(this, message);
RecordMessage(message);
try
{
//workItemsGroup.Start();
workItemsGroup.WaitForIdle();

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。