Send email/verification code with QT

Send email section reference blog post

  1. 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
    insert image description here
  2. Open the .pro file in the QT project and add a line
QT+=network
  1. 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;
}

  1. Test in the main function
int main(int argc, char *argv[])
{
    
    
    Smtp s("[发送方邮箱]","[授权码]");
    s.send("[接收方邮箱]","标题:测试smtp","内容:看看成功了没有");
    return 0;
}
  1. 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:
insert image description here

Guess you like

Origin blog.csdn.net/qq_41544842/article/details/118762073