Send email section reference blog post
- Log in/register a 163 mailbox, open the SMTP service in the settings, the system will generate an authorization code (a messy string) for you, write down the authorization code
- Open the .pro file in the QT project and add a line
QT+=network
- Create a Smtp class as follows:
//smtp.h 头文件
#ifndef SMTP_H
#define SMTP_H
#include<QByteArray>
#include<QString>
#include<QTcpSocket>
class Smtp
{
public:
Smtp(QByteArray username,QByteArray password);
void send(QByteArray recvaddr,QString subject,QString content);
~Smtp();
private:
QTcpSocket * clientsocket;
QByteArray username;//发送方邮箱
QByteArray password;//授权码
QByteArray mailfrom = "mail from:<";
QByteArray rcptto = "rcpt to:<";
QByteArray prefrom = "from:";
QByteArray preto = "to:";
QByteArray presubject ="subject:";
QByteArray recvaddr;//接收方邮箱
QString subject;//邮件标题
QString content; //发送内容
QByteArray recvdata;//接收到的数据
};
#endif // SMTP_H
//smtp.cpp
#include "smtp.h"
#include <QDebug>
Smtp::Smtp(QByteArray username,QByteArray password)
{
if(username.contains("@163"))
{
this->username = username;
this->password = password;
}
else
qDebug()<<"NOT 163";
}
void Smtp::send(QByteArray recvaddr,QString subject,QString content)
{
this->recvaddr = recvaddr;
this->subject = subject;
this->content = content;
QByteArray usernametmp = this->username;
QByteArray recvaddrtmp = this->recvaddr;
clientsocket=new QTcpSocket();
this->clientsocket->connectToHost("smtp.163.com",25,QTcpSocket::ReadWrite);
this->clientsocket->waitForConnected(1000);
this->clientsocket->waitForReadyRead(1000);
recvdata = clientsocket->readAll();
qDebug()<<recvdata;
this->clientsocket->write("HELO smtp.163.com\r\n");
this->clientsocket->waitForReadyRead(1000);
recvdata = clientsocket->readAll();
qDebug()<<recvdata;
this->clientsocket->write("AUTH LOGIN\r\n");
this->clientsocket->waitForReadyRead(1000);
recvdata = clientsocket->readAll();
qDebug()<<recvdata;
qDebug()<<"username:"<<username;
this->clientsocket->write(username.toBase64().append("\r\n"));
this->clientsocket->waitForReadyRead(1000);
recvdata = clientsocket->readAll();
qDebug()<<recvdata;
qDebug()<<"password:"<<password;
this->clientsocket->write(password.toBase64().append("\r\n"));
this->clientsocket->waitForReadyRead(1000);
recvdata = clientsocket->readAll();
qDebug()<<recvdata;
this->clientsocket->write(mailfrom.append(usernametmp.append(">\r\n")));
this->clientsocket->waitForReadyRead(1000);
recvdata = clientsocket->readAll();
qDebug()<<recvdata;
//发送邮箱
//qDebug()<<"mail from:"<<mailfrom.append(usernametmp.append(">\r\n"));
this->clientsocket->write(rcptto.append(recvaddrtmp.append(">\r\n")));
this->clientsocket->waitForReadyRead(1000);
recvdata = clientsocket->readAll();
qDebug()<<recvdata;
//接收邮箱
//qDebug()<<"rcp to:"<<rcptto.append(recvaddrtmp.append(">\r\n"));
//data表示开始传输数据
this->clientsocket->write("data\r\n");
this->clientsocket->waitForReadyRead(1000);
recvdata = clientsocket->readAll();
qDebug()<<recvdata;
usernametmp = this->username;
recvaddrtmp = 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 = clientsocket->readAll();
qDebug()<<recvdata;
this->clientsocket->write("quit\r\n");
this->clientsocket->waitForReadyRead(1000);
recvdata = clientsocket->readAll();
qDebug()<<recvdata;
}
Smtp::~Smtp()
{
delete this->clientsocket;
}
- Test in the main function
int main(int argc, char *argv[])
{
Smtp s("[发送方邮箱]","[授权码]");
s.send("[接收方邮箱]","标题:测试smtp","内容:看看成功了没有");
return 0;
}
- If you want to further implement the function of sending verification codes to users, first add a slot function of the "Send verification code" button (right-click the button to select Add slot function), the content of the slot function is as follows:
//生成验证码
void login::on_verification_clicked()
{
QString recvaddr0=ui->lineEdit->text();
QRegExp re("^[A-Za-z0-9]+([_\\.][A-Za-z0-9]+)*@([A-Za-z0-9\\-]+\\.)+[A-Za-z]{2,6}$");
if(re.exactMatch(recvaddr0)){
//验证邮箱格式
QMessageBox::information(NULL,"提示","验证码将在30s内发送至您的邮箱,请耐心等待。");
QTime time= QTime::currentTime();
qsrand(time.msec()+time.second()*1000);
code = 1000+qrand() % (9999-1000); //产生1000~9999以内的随机数
Smtp smtp("xxx","xxx");//按照刚才的方法实例化一个smtp对象
QByteArray recvaddr=recvaddr0.toUtf8();//QString转QByteArray
QString subject="xx系统登录/注册验证码";
QString content="欢迎登录/注册xx系统,本次操作的验证码为:"+QString::number(code);
smtp.send(recvaddr,subject,content);
}
else{
QMessageBox::warning(NULL,"提示","邮箱格式不正确,请重新输入。");
}
}
The effect is as follows: