QT开发之旅四邮件发送工具
终于有了一个晚上安静的写写程序,最近一直忙着公司商务上的事情,一直想用QT实现一个调用最底层socket通信来实现的邮件发送程序,以前用C#写过,微软都封装好的,不知道底层是如何实现的,只知道调用方法,这次用C++实现了下,参考了很多网上的例子。
其实说白了,无非就是smtp协议的使用,这个是国际通用的标准,所以QQ邮箱和163邮箱都可以用,都可以互发,来自百度百科的解释:SMTP目前已是事实上的在Internet传输E-Mail的标准,是一个相对简单的基于文本的协议。在其之上指定了一条消息的一个或多个接收者(在大多数情况下被确定是存在的),然后消息文本就传输了。可以参见http://baike.baidu.com/link?url=UAahhbpfOatRRHfUpG6jUyrgYgF3Kj7ll2WkJ6104RiAETv-jh-f-Xm1fwWMotrP
项目名称:邮件发送工具
开发环境:XP+QT4.7+QT CREATOR2.8+MINGW
已编译通过测试平台:XP、Win7、ubuntu、tiny210、TE6410
技术实现:通过socket通信实现smtp协议,根据应答解析协议并作出处理发送邮件
基本功能:
1:支持主流邮箱例如163邮箱QQ邮箱的发送。
2:支持富文本发送,可以发送带有HTML格式的文本。
3:支持多个附件发送,附件可以是图片。
说明:163邮箱和126邮箱,发送端口都是25,不使用SSL协议,而QQ邮箱必须使用SSL协议,端口为465。如果是QQ邮箱发送的话,前提要在QQ邮箱设置中将smtp协议开通,否则发送不成功,我就困在这里半个小时,结果收到QQ邮箱发过来的一封邮件,内容如下:
你妹啊,默认QQ邮箱没有开启SMTP服务。

运行截图:


粗略步骤:
第一步:布局好界面,控件命名好,建议用pascal命名法。
第二步:准备好sendemailapi文件夹,里面存放的公开的第三方的支持发送附件和富文本的MIME协议文件。添加到项目中。
第三步:实例化邮件发送对象
SmtpClient smtp(ui->cboxServer->currentText(),
ui->cboxPort->currentText().toInt(),
ui->ckSSL->isChecked()?SmtpClient::SslConnection:SmtpClient::TcpConnection);
smtp.setUser(ui->txtSender->text());
smtp.setPassword(ui->txtSenderPwd->text());
第四步:构建邮件主题,包含发件人收件人附件等
MimeMessage message;
message.setSender(new EmailAddress(ui->txtSenderAddr->text()));
//逐个添加收件人
QStringList receiver = ui->txtReceiverAddr->text().split(';');
for (int i = 0; i < receiver.size(); i++){
message.addRecipient(new EmailAddress(receiver.at(i)));
}
//构建邮件标题
message.setSubject(ui->txtTitle->text());
//构建邮件正文
MimeHtml text;
text.setHtml(ui->txtContent->toHtml());
// //如果直接发送简单文本,使用以下方法
// MimeText text;
// text.setText("测试简单文本发送!");
message.addPart(&text);
//构建附件
QString atta=ui->txtAtta->text();
if (atta!=""){
QStringList attas=atta.split(";");
foreach (QString tempAtta, attas) {
QFile *file=new QFile(tempAtta);
if (file->exists()){
message.addPart(new MimeAttachment(file));
}
}
}
第五步:登录服务器发送邮件
if (!smtp.connectToHost()){
QMessageBox::critical(this,"错误","服务器连接失败!");
return;
}
if (!smtp.login()){
QMessageBox::critical(this,"错误","用户登录失败!");
return;
}
if (!smtp.sendMail(message)){
QMessageBox::critical(this,"错误","邮件发送失败!");
return;
}else{
QMessageBox::information(this,"错误","邮件发送成功!");
}
smtp.quit();
CSDN下载地址:
源码下载:http://download.csdn.net/detail/feiyangqingyun/7030449
可执行文件下载:http://download.csdn.net/detail/feiyangqingyun/7030459
QT开发之旅四邮件发送工具的更多相关文章
- java 邮件发送工具类
首先需要下载mail.jar文件,我个人通常是使用maven中心库的那个: <dependency> <groupId>javax.mail</groupId> & ...
- java 邮件发送工具类【来源网络自己已经实际应用】
最近在做一个Java发送邮件的工具类,现在分享一下完整的代码 首先需要java邮件的包javax.mail-1.5.4.jar 之前因为链接给错了,很不好意思,现在重新发一次. 包在这里可以下载htt ...
- 邮件发送工具类 SendMail.java
package com.util; import org.apache.commons.mail.EmailException; import org.apache.commons.mail.Simp ...
- [转]使用QT开发GoogleMap瓦片显示和下载工具
第一节 之前做项目的时候经常遇到需要大量地图背景数据,然后没有数据被逼着去Google上下载瓦片数据在拼接成整张影像的工作,其实遥感影像晚上有很多可以下载到的,但是大部分是作为研究用的,作为GIS的背 ...
- Java 基于mail.jar 和 activation.jar 封装的邮件发送工具类
准备工作 发送邮件需要获得协议和支持! 开启服务 POP3/SMTP 服务 如何开启 POP3/SMTP 服务:https://www.cnblogs.com/pojo/p/14276637.html ...
- kali 下的邮件发送工具 swaks
kali 下的邮件发送工具 swaks Swaks 是一个功能强大,灵活,可编写脚本,面向事务的 SMTP 测试工具,目前 Swaks 托管在私有 svn 存储库中. 官方项目 http://jetm ...
- QT开发之旅三串口设备调试工具
这里首先说明一下,这个为什么叫串口设备调试工具而不是串口调试工具,是因为这个工具比网络上的串口调试工具多出了一些真实需要的用来调试设备的功能,首先一点就是大部分的串口调试工具收到数据都是立即返回,这样 ...
- QT开发之旅一DS7400主机调试工具
接触QT三年有余,期间因为工作需要断断续续学习过,2010年开始接触,当时好像是4.7版本,现在都已经到5.2版本了,更新真快,前阵子安装了下5.2版本,还是有很多变化的,不过感觉好像编译速度慢了很多 ...
- 使用QT开发GoogleMap瓦片显示和下载工具(1)——QT开发环境准备
由于是第一次使用qt,光是QT的安装和调试就费了好大功夫,汗一个,下面记录下过程和遇到的问题的解决方法吧. 下载QT 直接Google搜索“QT”,进入官网http://qt-project.org/ ...
随机推荐
- Unity -----一些可能存在的错误
关于Unity中的资源管理,你可能遇到这些问题 张鑫 8 个月前 原文链接:关于Unity中的资源管理,你可能遇到这些问题 - Blog 在优化Unity项目时,对资源的管理可谓是个系统纷繁的大工程. ...
- c、c++---linux上的GetTickCount函数
http://blog.csdn.net/guang11cheng/article/details/6865992 http://wenda.so.com/q/1378766306062794
- 解决Eclipse代码分析插件SonarLint在Console输出乱码问题
在Eclipse安装目录下的eclipse.ini文件末尾加上一行 -Dfile.encoding=UTF-8 即可.
- httpclient 发送文件和字符串信息
HttpPost httpPost = new HttpPost(url); MultipartEntity reqEntity = new MultipartEntit ...
- jQuery Validation让验证变得如此easy(二)
上一个样例我们是统一引用jquery.validate.js这样全部必填字段的提示信息都将是This field is required. 如今要改成动态提示,比方姓名假设为空则提示姓名不能为空,密码 ...
- 使用iftop监控网卡实时流量
Iftop工具主要用来显示本机网络流量情况及各相互通信的流量集合,如单独同哪台机器间的流量大小,非常适合于代理服务器和iptables服务器使用,这样可以方便的查看各客户端流量情况.iftop可以在类 ...
- Spring-core中的cglib小用法
对象复制听说用这个更高效 /** * 拷贝对象 * @param src 源对象 * @param dist 需要赋值的对象 */ public static void copy(Object src ...
- Linq 实现两个对象实例List之间的赋值
public class UserCopy { public class LoginEntity { public string UserName { get; set; } public strin ...
- 源码分析五(HashSet的内部实现)
一:首先来看看Hashset的继承体系 public class HashSet<E> extends AbstractSet<E> implements Set<E&g ...
- openURL调用其他程序(转)
转自:http://blog.csdn.net/iefreer/article/details/8812708 一个应用程序,可以调用其它的应用程序的. 和其它应用程序进行通讯如果一个应用程序支持一些 ...