热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

QT5使用163邮箱发送邮件

最近在用QT写一点东西,想发送个邮件。查了一些资料,发现没有官方的库,好多前辈都是推荐使用sendemailapi,但是这个

最近在用QT写一点东西,想发送个邮件。查了一些资料,发现没有官方的库,好多前辈都是推荐使用sendemailapi,但是这个网站现在已经不提供下载了,在网上也没有找到可以免费下载的这个库的地方。
借鉴的几篇文章如下
Qt5.5 使用smtp发邮件的各种坑
所以研究了一下smtp的原理,自己写了一个简单的smtp类,跟大家分享一下。
先说一下实现的功能:QT5.5(MSVC_x64) 使用163邮箱 向 qq邮箱 和 163邮箱 发送邮件(其余邮箱我没有测试,也没有写接收邮件的功能)
先说一下前期的实验工作,后面我会贴源码,只关注程序的童鞋可以直接向后翻。

1.在OSI协议中,SMTP属于应用层,所使用的传输层协议是TCP。

2.登录163邮箱,设置开启SMTP。
进入POP3设置

开启SMTP服务

开启客户端授权

忘记授权码的童鞋可以重置一下,记住这个授权码,后面要用。
假设邮箱是AAAAAA@163.com ,授权码是BBBBBB,收件人的邮箱是CCCCCC@163.com

3.使用windows自带的Telnet来进行数据测试:(这一部分主要借鉴于 Qt5.5 使用smtp发邮件的各种坑)
telnet不是内部或外部命令的解决方案

首先打开cmd.

  1. 输入 telnet smtp.163.com 25 回车
    会返回220 163.com Anti-spam GT for Coremail System (163com[20141201])
  2. 输入 HELO smtp.163.com 回车
    如果返回250 OK 表示服务器准备就绪,可以进行下一步了.
  3. 输入 AUTH LOGIN 回车
    这是指定登录的模式,这句应该是一般模式.
    返回334 dXNlcm5hbWU6就可以进行下一步了.
    注:登录这部分采用 base64加密 ,dXNlcm5hbWU6 解码之后为username:
    base64 在线解码编码
  4. 输入 经过base64加密的你的账户名,比如你的邮箱是AAAAAA@163.com,然后进入base64 在线解码编码,将AAAAAA@163.com加密 ,将加密后的用户名输入到到命令行回车
    返回334 UGFzc3dvcmQ6,UGFzc3dvcmQ6解码之后为Password:
  5. 输入 你的base64加密过的密码,方法同上.
    返回235 Authentication successful,表示验证通过,可以进行下一步了.
  6. 输入 mail from:AAAAAA@163.com 这里写你的邮箱
    返回250 Mail OK.
  7. 输入 rcpt to:CCCCCC@163.com 这里写收件人的邮箱
    返回250 Mail OK.
  8. 输入 data,表示开始传送数据
    返回354 End data with . (要以英文的 . 截止数据)
  9. 输入 from:AAAAAA@163.com
    服务器无返回.
  10. 输入 to:CCCCCC@163.com
    服务器无返回.
  11. 输入 subject:test 回车 (“test”为邮件主题)
    服务器无返回.
  12. 输入 此处什么也不用写,直接回车换行,作为主题与正文的分界
    服务器无返回.
  13. 输入 This is a test mail. 回车 (“This is a test mail.” 为邮件正文)
    服务器无返回.
  14. 输入 . 一个英文句号,表示数据传送完毕
    返回 250 Mail OK queued as smtp14 即为发送成功.(现在就可以去查收一下邮件了)
  15. 输入 quit
    返回 221 Bye
    测试结果如图

这里写图片描述
但是CMD中输入中文会乱码, 这个问题不用担心,程序中是可以发送中文的。(可能是编码方式的问题)

好了,到这里准备工作已经结束了,程序分为以下几个部分。
1. TCP客户端与smtp.163.com:25 进行连接和数据通信
2. 数据加密问题,将用户名和密码使用base64加密,使用 QByteArray.toBase64()
3. 解决汉字乱码问题,借鉴了这篇文章中的方法2 str.toLocal8Bit()
QT使用QTcpSocket和QTcpServer通信是出现乱码的问题
建立mailtest的QT工程
mailtest.pro

SOURCES += \main.cpp \smtp.cppHEADERS += \smtp.h
QT += network

添加Smtp class
smtp.h

#ifndef SMTP_H
#define SMTP_H
#include
#include
#includeclass Smtp
{
public:Smtp(QByteArray username,QByteArray password);~Smtp();void send(QByteArray recvaddr,QString subject,QString content);
private:QTcpSocket * clientsocket;QByteArray username;QByteArray password;QByteArray recvaddr;QByteArray mailfrom &#61; "mail from:<";QByteArray rcptto &#61; "rcpt to:<";QByteArray prefrom &#61; "from:";QByteArray preto &#61; "to:";QByteArray presubject &#61;"subject:";QString subject; //主题QString content; //发送内容QByteArray recvdata; //接收到的数据
};#endif // SMTP_H

smtp.cpp

#include "smtp.h"
#includeSmtp::Smtp(QByteArray username,QByteArray password)
{if(username.contains("&#64;163")){this->username &#61; username;this->password &#61; password;}elseqDebug()<<"NOT 163";
}void Smtp::send(QByteArray recvaddr,QString subject,QString content)
{this->recvaddr &#61; recvaddr;this->subject &#61; subject;this->content &#61; content;QByteArray usernametmp &#61; this->username;QByteArray recvaddrtmp &#61; this->recvaddr;clientsocket&#61;new QTcpSocket();this->clientsocket->connectToHost("smtp.163.com",25,QTcpSocket::ReadWrite);this->clientsocket->waitForConnected(1000);this->clientsocket->waitForReadyRead(1000);recvdata &#61; clientsocket->readAll();qDebug()<clientsocket->write("HELO smtp.163.com\r\n");this->clientsocket->waitForReadyRead(1000);recvdata &#61; clientsocket->readAll();qDebug()<clientsocket->write("AUTH LOGIN\r\n");this->clientsocket->waitForReadyRead(1000);recvdata &#61; clientsocket->readAll();qDebug()<clientsocket->write(username.toBase64().append("\r\n"));this->clientsocket->waitForReadyRead(1000);recvdata &#61; clientsocket->readAll();qDebug()<clientsocket->write(password.toBase64().append("\r\n"));this->clientsocket->waitForReadyRead(1000);recvdata &#61; clientsocket->readAll();qDebug()<clientsocket->write(mailfrom.append(usernametmp.append(">\r\n")));this->clientsocket->waitForReadyRead(1000);recvdata &#61; clientsocket->readAll();qDebug()<clientsocket->write(rcptto.append(recvaddrtmp.append(">\r\n")));this->clientsocket->waitForReadyRead(1000);recvdata &#61; clientsocket->readAll();qDebug()<clientsocket->write("data\r\n");this->clientsocket->waitForReadyRead(1000);recvdata &#61; clientsocket->readAll();qDebug()<username;recvaddrtmp &#61; this->recvaddr;this->clientsocket->write(prefrom.append(usernametmp.append("\r\n")));this->clientsocket->write(preto.append(recvaddrtmp.append("\r\n")));this->clientsocket->write(presubject.append(subject.toLocal8Bit().append("\r\n")));this->clientsocket->write("\r\n");this->clientsocket->write(content.toLocal8Bit().append("\r\n"));this->clientsocket->write(".\r\n");this->clientsocket->waitForReadyRead(1000);recvdata &#61; clientsocket->readAll();qDebug()<clientsocket->write("quit\r\n");this->clientsocket->waitForReadyRead(1000);recvdata &#61; clientsocket->readAll();qDebug()<}Smtp::~Smtp()
{delete this->clientsocket;
}

main.cpp

#includeint main()
{Smtp smtp("AAAAAA&#64;163.com","BBBBBB");smtp.send("CCCCCC&#64;163.com","测试邮件","这是一封测试邮件^_^");return 0;
}


推荐阅读
  • 由于php没有提供现成的smtp函数,却提供了一个功能不甚灵活的mail()函数,这个函数需要服务器配置上的支持,并且不支持smtp验证,在很多场合无法正常的工作,因此不建议使用。 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • 邮件服务在网络里的角色是越来越重要,不管是因特网上还是在局域网内部,用户都习惯使用电子邮件来处理日常的工作。而越来越多的企业和单位,也都急切希望能拥有自己的内部邮件服务器,以加强员 ... [详细]
  • 软测管理工具实践04
    一.今日任务——安装完成QC9.0进过几天的安装,终于把QC9.0成功的安装在了自己win7系统的电脑上。其中遇到的困难很多,首先是QC的版本问题&#x ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
  • Centos下安装memcached+memcached教程
    本文介绍了在Centos下安装memcached和使用memcached的教程,详细解释了memcached的工作原理,包括缓存数据和对象、减少数据库读取次数、提高网站速度等。同时,还对memcached的快速和高效率进行了解释,与传统的文件型数据库相比,memcached作为一个内存型数据库,具有更高的读取速度。 ... [详细]
  • 【基础部分】之SMTP相关配置
    SMTP一、准备工作修改两个主机的主机名1.mailqq.qq.com2.mail163.163.com先配置dns邮件域名在mailqq.qq.com主机上配置dns配置etcn ... [详细]
  • ! Configuration File for keepalivedglobal_defs {   notification_email {     ... [详细]
  • 参考网上搜到的结果,但仍有问题,调试后完整步骤如下配置163邮箱SMTP,需要配置授权码(作为密码使用)&#x ... [详细]
  • 分享西西弗斯自动求职系统【PHP】
    后端开发|php教程后端开发-php教程做这个系统的背景是前段时间帮女朋友找工作,大家也许都有过这样的感受,发出一份份简历都石沉大海,为什么呢?经过测试,我发现是因为邮件的阅读率并 ... [详细]
  • 适合小型网络环境的免费网络管理软件Intermapper
    InterMapper网络管理软件可支持监测5台以内的网络设备,特别适合安装使用在小型网络环境,可以实时了解网络运行状态和网络拓扑,支持多 ... [详细]
author-avatar
风之云织2004
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有