[转载]基于Lumisoft.NET组件的SMTP账号登陆检测 – 伍华聪 – 博客园.
在邮件处理的方面,Lumisoft.NET可以说是非常不错的一个选择,我在前面几篇文章中都介绍过这个组件。
基于Lumisoft.NET组件开发碰到乱码等一些问题的解决
基于Lumisoft.NET组件的POP3邮件接收和删除操作
基于Lumisoft.NET组件开发碰到乱码等一些问题的解决
我的博客内容几乎全部来源我的项目开发或者研究工作,因此对于这个组件的使用还是有一定的说服力,这个组件封装了很多底层的一些操作,对于我们操作 邮件的发送、接收的处理,更加方便高效。本文主要介绍该组件一个小的应用,基于Lumisoft.NET组件的SMTP账号登陆检测。
做某种工作,一般都有一个背景知识,从背景里面,我们可以大致了解这个工作的应用场景和具体目的,这个基于SMTP账号登陆检测的功能来源我对一批 邮件账号进行交替邮件发送的时候需要,我手上有一批免费邮箱的SMTP账号,可以用于邮件的发送,但是我不确信是否所有的账号密码都是可以登录使用的,因 此我需要对它们进行检测,只有正确的账号密码,我才用来批量发送邮件。这种检测我希望是通过自动化进行实现,不要人工一个个登录,在偶尔的一次 Lumisoft.NET组件的使用过程中,我发现它发送邮件前,都会进行账号密码的登录操作,因此如果有成功的回应,那么就算达到目的了。
Lumisoft组件里面,SMTP_Client的对象有一个Auth方法(或者Authenticate方法),并且调用后,对象本身有一个IsAuthenticated的bool属性,这样就可以达到我们的操作目的了。
具体对SMTP_Client的SMTP账号登陆检测代码如下所示。
private bool CheckLogin(string smtp, string username, string password) { bool result = false; using (SMTP_Client client = new SMTP_Client()) { try { if (this.txtUseSSL.Checked) { client.Connect(smtp, WellKnownPorts.SMTP_SSL, true); } else { client.Connect(smtp, WellKnownPorts.SMTP, false); } client.EhloHelo(smtp); var authhh = new AUTH_SASL_Client_Plain(username, password); client.Auth(authhh); //client.Authenticate(username, password); result = client.IsAuthenticated; } catch (Exception ex) { LogHelper.Error(ex); } } return result; }
为了更有效实现账号的检测,我们使用了背景线程进行处理,以达到更好的界面体验。
private BackgroundWorker worker; public FrmEditMailConfig() { InitializeComponent(); worker = new BackgroundWorker(); worker.DoWork += new DoWorkEventHandler(worker_DoWork); worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted); }
然后在实现账号检测的事件里面对背景线程进行调用,具体操作代码如下所示。
void worker_DoWork(object sender, DoWorkEventArgs e) { string smtp = this.txtSmtpServer.Text.Trim(); string username = this.txtLoginId.Text.Trim(); string password = this.txtPassword.Text.Trim(); bool success = CheckLogin(smtp, username, password); e.Result = success; }
这个线程处理后,会返回一个结果,然后我们在线程完成的操作里面对他们进行处理,即可实现把结果展示到界面上了。
void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { string username = this.txtLoginId.Text.Trim(); bool success = Convert.ToBoolean(e.Result); if (success) { string message = string.Format("[{0}] 测试成功", username); MessageDxUtil.ShowTips(message); } else { string message = string.Format("[{0}] 测试失败,可能密码不正确或未开通SMTP", username); MessageDxUtil.ShowWarning(message); } }
当然,这个只是对一个账号密码进行SMTP登录检测,如果需要批量检测,把思路变化一下,遍历需要检测的账号密码,对账号处理完成后,把结果显示到界面上即可。