实在说白了,无非便是smtp协议的利用,这个是国际通用的标准,以是QQ邮箱和163邮箱都可以用,都可以互发,来自百度百科的阐明:SMTP目前已是事实上的在Internet传输E-Mail的标准,是一个相对大略的基于文本的协议。在其之上指定了一条的一个或多个吸收者(在大多数情形下被确定是存在的),然后文本就传输了。
二、开拓环境项目名称:邮件发送工具
开拓环境: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邮箱发过来的一封邮件。
五、效果图六、开拓步骤
第一步:布局好界面,控件命名好,建议用pascal命名法。
第二步:准备好sendemailapi文件夹,里面存放的公开的第三方的支持发送附件和富文本的MIME协议文件。添加到项目中。
第三步:实例化邮件发送工具。
第四步:构建邮件主题,包含发件人收件人附件等。
第五步:登录做事器发送邮件
#include \公众sendemailthread.h\公众#include \"大众sendemail/smtpmime.h\公众QScopedPointer<SendEmailThread> SendEmailThread::self;SendEmailThread SendEmailThread::Instance(){ if (self.isNull()) { static QMutex mutex; QMutexLocker locker(&mutex); if (self.isNull()) { self.reset(new SendEmailThread); } } return self.data();}SendEmailThread::SendEmailThread(QObject parent) : QThread(parent){stopped = false;emialTitle = \公众邮件标题\"大众;sendEmailAddr = \"大众feiyangqingyun@126.com\"大众;sendEmailPwd = \"大众123456789\公众;receiveEmailAddr = \"大众feiyangqingyun@163.com;517216493@qq.com\公众;contents.clear(); fileNames.clear();}SendEmailThread::~SendEmailThread(){ this->stop(); this->wait(1000);}void SendEmailThread::run(){while (!stopped) {int count = contents.count();if (count > 0) { mutex.lock();QString content = contents.takeFirst();QString fileName = fileNames.takeFirst(); mutex.unlock();QString result;QStringList list = sendEmailAddr.split(\"大众@\"大众);QString tempSMTP = list.at(1).split(\公众.\公众).at(0);int tempPort = 25;//QQ邮箱端口号为465,必须启用SSL协议.if (tempSMTP.toUpper() == \"大众QQ\公众) {tempPort = 465;} SmtpClient smtp(QString(\"大众smtp.%1.com\"大众).arg(tempSMTP), tempPort, tempPort == 25 ? SmtpClient::TcpConnection : SmtpClient::SslConnection);smtp.setUser(sendEmailAddr);smtp.setPassword(sendEmailPwd);//构建邮件主题,包含发件人收件人附件等.MimeMessage message;message.setSender(new EmailAddress(sendEmailAddr));//逐个添加收件人QStringList receiver = receiveEmailAddr.split(';');for (int i = 0; i < receiver.size(); i++) {message.addRecipient(new EmailAddress(receiver.at(i)));}//构建邮件标题message.setSubject(emialTitle);//构建邮件正文MimeHtml text;text.setHtml(content);message.addPart(&text); //构建附件-报警图像if (fileName.length() > 0) {QStringList attas = fileName.split(\公众;\"大众);foreach (QString tempAtta, attas) {QFile file = new QFile(tempAtta);if (file->exists()) {message.addPart(new MimeAttachment(file));}}}if (!smtp.connectToHost()) {result = \公众邮件做事器连接失落败\"大众;} else {if (!smtp.login()) {result = \公众邮件用户登录失落败\"大众;} else {if (!smtp.sendMail(message)) {result = \"大众邮件发送失落败\公众;} else {result = \"大众邮件发送成功\"大众;}}}smtp.quit();if (!result.isEmpty()) {emit receiveEmailResult(result);} msleep(1000);} msleep(100);}stopped = false;}void SendEmailThread::stop(){ stopped = true;}void SendEmailThread::setEmialTitle(const QString &emailTitle){this->emialTitle = emailTitle;}void SendEmailThread::setSendEmailAddr(const QString &sendEmailAddr){this->sendEmailAddr = sendEmailAddr;}void SendEmailThread::setSendEmailPwd(const QString &sendEmailPwd){this->sendEmailPwd = sendEmailPwd;}void SendEmailThread::setReceiveEmailAddr(const QString &receiveEmailAddr){this->receiveEmailAddr = receiveEmailAddr;}void SendEmailThread::append(const QString &content, const QString &fileName){ mutex.lock();contents.append(content);fileNames.append(fileName); mutex.unlock();}