为程序添加自动发送Email功能

为程序添加自动发送Email功能

  (2009-09-19 00:21:31)
标签: 

smtp

 

email

 

it

分类: 开发

    最近在开发中要为部门的软件产品加上crash report功能,研究了很多关于Windows平台下的debug技术。最终方案为minidump file + email汇报方式,对于debug的相关总结我会再写一篇,这篇就先总结一下自动发送Email功能的实现方法。另外我还写了一个demo程序,虽然UI比较简单,不过发送Email的基本功能已经有了,并且用了5种库实现,一是为了比较库的性能,二是通过比较库的实现,我们可以学习一下代码设计和实现方面的技巧。

    其实当今的软件应用与网络结合越来越紧密,我们为软件加上Email发送功能有很多好处。比如可以发送软件错误报告信息,有利于软件debug;可以在帮助中加入用户意见和使用体验等信息,通过邮件汇总升级;可以在用户卸载软件时请用户选择卸载原因,收集用户使用习惯等。

    发送邮件用到的协议是SMTP(Simple Mail Transfer Protocol,简单邮件传输协议),是一种基于TCP/IP的上层应用协议,定义了邮件由源地址到目的地址的传送规则。关于SMTP协议的具体内容,大家可以参考相关资料。我们要进行Email发送,需要两个条件:

 

    1、支持SMTP的库

    也就是完成SMTP功能的代码,由于SMTP非常简单,因此往往就是一个封装类,或者一组API。当然也可以自己用socket实现SMTP,不过如果不是为了练手,还是直接用已有的开源代码吧,毕竟简单且稳定。

 

    2、一个发送邮箱账户和一个接收邮箱账户

    邮箱账户应该不是什么难事,大家随便去申请两个免费邮箱就行了。需要说明的是,发送邮件时要先登录邮件服务器根据帐号和密码进行认证,因此发送邮箱必须支持SMTP访问,比如126邮箱从07年开始便不再对新申请用户支持SMTP访问,因此126邮箱账户必须是07年以前申请的才行,否则会在认证时返回550错误码,提示用户被锁定。还有些邮箱如gmail需要SSL支持加密方式,对某些库来说可能就不支持了。

 

    我们先看一下demo程序界面,了解发送邮件需要哪些基本参数。

为程序添加自动发送Email功能

 

    可知参数包括:发送端邮箱账户和密码、接收端邮箱账户、邮件主题、内容、附件等信息,另外还要指定邮件发送服务器地址,在此我们认为是”smtp.host”形式,如按图中设置发送服务器地址即为smtp.126.com。一般库还会支持指定发送者用户名、认证方式、多个接收地址、抄送地址、html格式正文、多个附件等。

 

    下面介绍几个比较不错的SMTP库,都是用C++开发的。

    1、jwSMTP (http://sourceforge.net/projects/jwsmtp/

    jwSMTP是一个开源库,支持跨平台,SMTP常用功能都支持的不错,应用起来也非常方便。jwSMTP提供了一个封装类,接口简单易用。最难得的是它自带的文档和示例都非常完善丰富,因此也是我最终选择应用的库。在应用过程中,该库运行非常稳定,没有发现什么问题,建议大家使用jwSMTP。

    以下是应用代码:

     jwsmtp::mailer mail( (LPCTSTR)m_strToUser, (LPCTSTR)m_strFormUser, (LPCTSTR)m_strSubject, (LPCTSTR)m_strContent, (LPCTSTR)m_strServer, jwsmtp::mailer::SMTP_PORT, false);

 

     mail.username((LPCTSTR)m_strFormUser);

     mail.password((LPCTSTR)m_strFromPassword);

     mail.authtype(jwsmtp::mailer::PLAIN);

     mail.attach((LPCTSTR)m_strAttachment);

     mail.send();

     std::string strCode = mail.response();

 

    2、Windows MAPI

    微软已经为Windows系统开发者提供了SMTP协议的开发接口——MAPI(Messaging Application Progrmming Interface)。MAPI还是比较复杂的,我们如果只发送邮件的话,只用其中的Simple MAPI就足够了,用起来十分简单。Simple MAPI提供了一组API函数以及相关结构定义,只要在代码中包含mapi.h头文件即可。但是要想应用MAPI,必须要有Windows邮件系统支持,如安装Outlook等应用软件,还要在其中配置好profile。

    开发步骤为:加载mapi32.dll库 —> 通过GetProcAddress函数得到API函数地址 —> 设置MapiMessage等结构体参数 —> 调用MAPISendMail函数发送邮件。

    由于MAPI开发中的诸多限制,我们应用起来不是很方便,有兴趣的可以研究demo中的代码。

 

    3、free libsmtp (http://sourceforge.net/projects/freelibsmtp/

    free libsmtp也是一个开源C++库,从封装的结构看它提供了两个类,比jwSMTP要复杂,面向对象的效果不是太理想。它最大的缺陷就是还没有支持附件功能,我怀疑可能是我没找到更新的版本,但是sourcesforge上确实没有。它的特色是提供了一个相应的异常类,支持异常使得代码用起来更加安全。

    以下是应用代码:

     try

     {

         mail::Smtp smtp((LPCTSTR)m_strServer, 25, strName, (LPCTSTR)m_strFromPassword);

         mail::Mail email((LPCTSTR)m_strFormUser, (LPCTSTR)m_strToUser);

         email.setSubject((LPCTSTR)m_strSubject);

         email.setMessage((LPCTSTR)m_strContent);

         smtp.sendMail(email);

     }

     catch (mail::Exception& e)

     {

         printf(e.why().c_str());

         return ;

     }

 

    4、SMailer (http://morningspace.51.net/resource/SMailer.php

    这个是国内ITer写的封装类,用起来还不错。但是跟free libsmtp一样,封装性做的不是太好,使用不太方便;也支持异常。

    以下为应用代码:

     MUtils::WinSockHelper wshelper;

 

     SMailer::MailInfo info;

     info.setSenderName((LPCTSTR)m_strFormUser);

     info.setSenderAddress((LPCTSTR)m_strFormUser);

     info.addReceiver((LPCTSTR)m_strToUser, (LPCTSTR)m_strToUser);

     info.setSubject((LPCTSTR)m_strSubject);

     info.setPriority(SMailer::Priority::normal);

     info.addMimeContent(&SMailer::TextPlainContent((LPCTSTR)m_strContent));

     info.addMimeContent(&SMailer::AppOctStrmContent((LPCTSTR)m_strAttachment));

 

     try

     {

         SMailer::MailSender sender((LPCTSTR)m_strServer, (LPCTSTR)m_strFormUser, (LPCTSTR)m_strFromPassword);

         sender.setMail(&SMailer::MailWrapper(&info));

         sender.sendMail();

     }

     catch (SMailer::MailException& e)

     {

         printf(e.what());

         return ;

     }

     catch (...)

     {

         return ;

     }

 

    5、Smtp

    最后这个是在网上无意找到的,没有查到正式的名字和主页,姑且这么叫吧。看源码是很早以前写得了,以至于我使用的时候并没有发送成功,也没时间调试具体原因。里面封装的类很多,使用起来也比较麻烦。放进来的原因,一是它专门为MFC应用程序写得,二是可以研究一下源码,因为数据结构没有用到STL,很多都是自己设计的。

      

    好了,先介绍到这里,demo的源码放在下面,大家可以看看参考一下。

 

 email_smtp 

(在打开的网页中点击表格中的free按钮,然后填下验证码,点download就可以了)

或者到我的网盘去下载:http://e.ys168.com/?tinyfun

 email_stmp

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值