• 20945阅读
  • 24回复

QT编写的邮件发送工具 [复制链接]

上一主题 下一主题
离线liudianwu
 

图酷模式  只看楼主 倒序阅读 楼主  发表于: 2014-03-12
— 本帖被 realfan 执行加亮操作(2014-03-13) —
终于有了一个晚上安静的写写程序,最近一直忙着公司商务上的事情,一直想用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
编译通过测试平台:XPWin7ubuntutiny210TE6410
技术实现:通过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
本站源码下载: myEmailTools.zip (42 K) 下载次数:918
1条评分好评度+1
丰色彗心 好评度 +1 - 2019-02-17
欢迎关注微信公众号:Qt实战 (各种开源作品、经验整理、项目实战技巧,专注Qt/C++软件开发,视频监控、物联网、工业控制、嵌入式软件、国产化系统应用软件开发)QQ:517216493  WX:feiyangqingyun  QQ群:751439350
在线toby520

只看该作者 1楼 发表于: 2014-03-12
牛X,希望楼主多分享一些代码,甚至分享一些思路 都可以 呵呵
QtQML多多指教开发社区 http://qtclub.heilqt.com
将QtCoding进行到底
关注移动互联网,关注金融
开发跨平台客户端,服务于金融行业
专业定制界面
群号:312125701   373955953(qml控件定做)
离线庚琰1001

只看该作者 2楼 发表于: 2014-03-12
还没学习这么多,刚入门。
我什么都不懂,还能做CEO吗?
离线XChinux

只看该作者 3楼 发表于: 2014-03-13
支持楼主,这是论坛上首个关于SMTP发邮件的代码.
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线maple918

只看该作者 4楼 发表于: 2014-03-13
,感谢楼主分享!
离线realfan

只看该作者 5楼 发表于: 2014-03-13
文件夹里缺个test.jpg文件
补上,试了一下,很好用。
离线anetworker

只看该作者 6楼 发表于: 2014-03-13
我是来学习的。。。。。。
离线mxcai2005

只看该作者 7楼 发表于: 2014-03-13
mark ....................
离线morg

只看该作者 8楼 发表于: 2014-03-15
谢谢,非常有用。

只看该作者 9楼 发表于: 2014-03-18



163、126都可以,但是QQ发送却一直失败。。。不知道为什么,SMTP已开启!
博客地址:https://waleon.blog.csdn.net
微信公众号:高效程序员
QQ 群:242790253
微信群:加微信(iwaleon),邀请入群。

承接各种 C++/Qt/QML 项目,专业的团队,一流的服务,不二的选择!
离线foxgod

只看该作者 10楼 发表于: 2014-03-28
为什么我在QT5.0上运行你的程序,总是提示我发送失败呢
离线foxgod

只看该作者 11楼 发表于: 2014-04-28
我按照你的代码写的,不知道为什么,信是发出去了,邮箱也接受到了,但是内容是空的,我打印你的信息,看到你也是这样发包的呀,不知道为什么,请指教
内容为
  1. void smtpclient::sendMailToServer()
  2. {
  3.     QString mime;
  4.     mime = "From:";
  5.     mime += " <" + m_sendMailAddress + ">\r\n";
  6.     mime += "To:";
  7.     mime += " <" + m_receiveMailAddress + ">\r\n";
  8.     mime += "Subject: ";
  9.     mime += m_mailTitle;
  10.     mime += "\r\n";
  11.     mime += "Mime-Version: 1.0\r\n";
  12.     sendMailContentToServer(mime);
  13. //    sendMessage(mime);
  14. //    // Send \r\n.\r\n to end the mail data
  15. //    sendMessage(".");
  16. //    waitForResponse();
  17. //    if (m_responseCode != 250)
  18. //    {
  19. //       QMessageBox::critical(0,"错误","邮件发送有错!");
  20. //    }
  21. //    else
  22. //    {
  23. //        qDebug("邮件发送成功");
  24. //    }
  25. }
  26. void smtpclient::sendMailContentToServer(QString content)
  27. {
  28.     QString mimeString = content;
  29.     //首先构造正文报文
  30.     mimeString.append("--").append(cBoundary).append("\r\n");
  31.     mimeString.append("Content-Type: text/html;charset=utf-8;\r\n");
  32.     mimeString.append("Content-Transfer-Encoding:").append("8bit\r\n");
  33.     mimeString.append(m_mailContent);
  34.     mimeString.append("\r\n");
  35.     mimeString.append("Content-Type: text/html;charset=utf-8;\r\n");
  36.     mimeString.append("Content-Transfer-Encoding:").append("8bit\r\n");
  37.     mimeString.append(m_mailContent);
  38.     mimeString.append("\r\n");
  39.     mimeString.append("Content-Type: multipart/related;");
  40.     mimeString.append(QString(" boundary=%1").arg(cBoundary));
  41.     mimeString.append("Content-Transfer-Encoding:").append("8bit\r\n");
  42.     mimeString.append("--").append(cBoundary).append("\r\n");
  43.     mimeString.append("Content-Type: text/html;charset=utf-8;\r\n");
  44.     mimeString.append("Content-Transfer-Encoding:").append("8bit\r\n");
  45.     mimeString.append(m_mailContent);
  46.     mimeString.append("--").append(cBoundary).append("--").append("\r\n");
  47.     sendMessage(mimeString);
  48.     sendMessage(".");

为什么没有内容收到呢,请指教
离线foxgod

只看该作者 12楼 发表于: 2014-04-30
为啥发送附件图片失败呢?
离线liudianwu

只看该作者 13楼 发表于: 2014-05-14
自从发布这个测试工具以来,陆续收到一些不明同学的邮件,请看
欢迎关注微信公众号:Qt实战 (各种开源作品、经验整理、项目实战技巧,专注Qt/C++软件开发,视频监控、物联网、工业控制、嵌入式软件、国产化系统应用软件开发)QQ:517216493  WX:feiyangqingyun  QQ群:751439350
离线crazy

只看该作者 14楼 发表于: 2014-10-27
mark
C/C++/Qt爱好者
邮箱: kevinlq0912@163.com
公众号: devstone
博客:http://kevinlq.com/
离线lxgsbqylbk

只看该作者 15楼 发表于: 2014-11-11
下载看看
离线molujiayou

只看该作者 16楼 发表于: 2015-01-27
可以用 邮件发送成功  最近正要做右键发送的功能 很有价值呢
离线foxgod

只看该作者 17楼 发表于: 2016-06-08
mimeString.append(QString("Content-Type: image/jpeg;name=%1\r\n").arg(strName));
mimeString.append("Content-Transfer-Encoding:").append("base64\r\n\r\n");
mimeString.append(QString("Content-Disposition: attachment;filename=%1\r\n").append(strName));
QImage img(m_attachment);
QByteArray ba;
QBuffer buf(&ba);
img.save(&buf,"JPG");//按照JPG解码保存数据
mimeString.append(ba.toBase64());

楼主,我在附件中添加图片,发出去后在邮箱里面无法正常显示,我看了SMTP协议,附件里面添加图片是这样的呀,为啥不成功呢,你知道吗,边界我也添加了
离线nigoole

只看该作者 18楼 发表于: 2016-06-09
我在arm上面用3G网络无法连接服务器,不清楚怎么回事你们有遇到的吗?
有句话说得好:好好学习,天天向上。加油~~!有上船的朋友联系企鹅393320854
离线fzeric

只看该作者 19楼 发表于: 2017-03-02
非常感谢大牛的分享。
离线pangwei

只看该作者 20楼 发表于: 2017-09-22
QQ邮箱无法正常使用


------------------------------------------------------------------------------------

缺少ssl相关库文件,已上传ssl ssl.7z (520 K) 下载次数:35
离线lsyzsl

只看该作者 21楼 发表于: 2017-10-30
回 pangwei 的帖子
pangwei:QQ邮箱无法正常使用
------------------------------------------------------------------------------------
....... (2017-09-22 09:34) 

这个ssl怎么用?
离线lirus1234

只看该作者 22楼 发表于: 2018-12-13
可以使用    这个代码应该是Qt4版本下面写的  所以如果用5的版本的话会有一些小的修改   感谢楼主
离线825772667

只看该作者 23楼 发表于: 2020-07-01
下载的zip只有4k,解压不了
深圳大龄程序员老王,目前在使用QT做PC端软件开发,及上位机开发。
support:825772667@qq.com
离线982575065

只看该作者 24楼 发表于: 2022-02-14
回 pangwei 的帖子
pangwei:QQ邮箱无法正常使用
------------------------------------------------------------------------------------
....... (2017-09-22 09:34) 

您好,请教一下这个怎么用呢
快速回复
限100 字节
 
上一个 下一个