查看完整版本: [-- QT编写的邮件发送工具 --]

QTCN开发网 -> Qt 作品展 -> QT编写的邮件发送工具 [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

liudianwu 2014-03-12 19:57

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
已编译通过测试平台:XPWin7ubuntutiny210TE6410
技术实现:通过socket通信实现smtp协议,根据应答解析协议并作出处理发送邮件
基本功能:
1:支持主流邮箱例如163邮箱QQ邮箱的发送。
2:支持富文本发送,可以发送带有HTML格式的文本。
3:支持多个附件发送,附件可以是图片。
说明:163邮箱和126邮箱,发送端口都是25,不使用SSL协议,而QQ邮箱必须使用SSL协议,端口为465。如果是QQ邮箱发送的话,前提要在QQ邮箱设置中将smtp协议开通,否则发送不成功,我就困在这里半个小时,结果收到QQ邮箱发过来的一封邮件,内容如下:
你妹啊,默认QQ邮箱没有开启SMTP服务。
[attachment=11803]
运行截图:
[attachment=11804]
[attachment=11805]
粗略步骤:
第一步:布局好界面,控件命名好,建议用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
本站源码下载:[attachment=11806]

toby520 2014-03-12 20:03
牛X,希望楼主多分享一些代码,甚至分享一些思路 都可以 呵呵

庚琰1001 2014-03-12 20:49
还没学习这么多,刚入门。

XChinux 2014-03-13 00:41
支持楼主,这是论坛上首个关于SMTP发邮件的代码.

maple918 2014-03-13 08:42
,感谢楼主分享!

realfan 2014-03-13 08:43
文件夹里缺个test.jpg文件
补上,试了一下,很好用。

anetworker 2014-03-13 10:16
我是来学习的。。。。。。

mxcai2005 2014-03-13 15:40
mark ....................

morg 2014-03-15 10:37
谢谢,非常有用。

一去丶二三里 2014-03-18 14:50
[attachment=11842]
[attachment=11843]

163、126都可以,但是QQ发送却一直失败。。。不知道为什么,SMTP已开启!

foxgod 2014-03-28 13:54
为什么我在QT5.0上运行你的程序,总是提示我发送失败呢

foxgod 2014-04-28 17:28
我按照你的代码写的,不知道为什么,信是发出去了,邮箱也接受到了,但是内容是空的,我打印你的信息,看到你也是这样发包的呀,不知道为什么,请指教
内容为
  1. void smtpclient::sendMailToServer()
    {
        QString mime;

        mime = "From:";
        mime += " <" + m_sendMailAddress + ">\r\n";

        mime += "To:";

        mime += " <" + m_receiveMailAddress + ">\r\n";

        mime += "Subject: ";

        mime += m_mailTitle;
        mime += "\r\n";
        mime += "Mime-Version: 1.0\r\n";

        sendMailContentToServer(mime);

    //    sendMessage(mime);

    //    // Send \r\n.\r\n to end the mail data
    //    sendMessage(".");

    //    waitForResponse();

    //    if (m_responseCode != 250)
    //    {
    //       QMessageBox::critical(0,"错误","邮件发送有错!");
    //    }
    //    else
    //    {
    //        qDebug("邮件发送成功");
    //    }
    }

    void smtpclient::sendMailContentToServer(QString content)
    {

        QString mimeString = content;
        //首先构造正文报文
        mimeString.append("--").append(cBoundary).append("\r\n");
        mimeString.append("Content-Type: text/html;charset=utf-8;\r\n");
        mimeString.append("Content-Transfer-Encoding:").append("8bit\r\n");
        mimeString.append(m_mailContent);
        mimeString.append("\r\n");
        mimeString.append("Content-Type: text/html;charset=utf-8;\r\n");
        mimeString.append("Content-Transfer-Encoding:").append("8bit\r\n");
        mimeString.append(m_mailContent);
        mimeString.append("\r\n");
        mimeString.append("Content-Type: multipart/related;");
        mimeString.append(QString(" boundary=%1").arg(cBoundary));
        mimeString.append("Content-Transfer-Encoding:").append("8bit\r\n");
        mimeString.append("--").append(cBoundary).append("\r\n");
        mimeString.append("Content-Type: text/html;charset=utf-8;\r\n");
        mimeString.append("Content-Transfer-Encoding:").append("8bit\r\n");
        mimeString.append(m_mailContent);
        mimeString.append("--").append(cBoundary).append("--").append("\r\n");
        sendMessage(mimeString);
        sendMessage(".");

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

foxgod 2014-04-30 14:07
为啥发送附件图片失败呢?

liudianwu 2014-05-14 09:07
自从发布这个测试工具以来,陆续收到一些不明同学的邮件,请看
[attachment=12066]

crazy 2014-10-27 10:54
mark

lxgsbqylbk 2014-11-11 16:53
下载看看

molujiayou 2015-01-27 14:39
可以用 邮件发送成功  最近正要做右键发送的功能 很有价值呢

foxgod 2016-06-08 18:01
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 2016-06-09 11:58
我在arm上面用3G网络无法连接服务器,不清楚怎么回事你们有遇到的吗?

fzeric 2017-03-02 09:18
非常感谢大牛的分享。

pangwei 2017-09-22 09:34
QQ邮箱无法正常使用


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

缺少ssl相关库文件,已上传[attachment=17940]

lsyzsl 2017-10-30 15:28
pangwei:QQ邮箱无法正常使用
------------------------------------------------------------------------------------
....... (2017-09-22 09:34) 

这个ssl怎么用?

lirus1234 2018-12-13 16:17
可以使用    这个代码应该是Qt4版本下面写的  所以如果用5的版本的话会有一些小的修改   感谢楼主

825772667 2020-07-01 09:51
下载的zip只有4k,解压不了

982575065 2022-02-14 14:23
pangwei:QQ邮箱无法正常使用
------------------------------------------------------------------------------------
....... (2017-09-22 09:34) 

您好,请教一下这个怎么用呢


查看完整版本: [-- QT编写的邮件发送工具 --] [-- top --]



Powered by phpwind v8.7 Code ©2003-2011 phpwind
Gzip disabled