Enviar correo electrónico/código de verificación con QT

Enviar publicación de blog de referencia de la sección de correo electrónico

  1. Inicie sesión/registre un buzón 163, abra el servicio SMTP en la configuración, el sistema generará un código de autorización (una cadena desordenada) para usted, escriba el código de autorización
    inserte la descripción de la imagen aquí
  2. Abra el archivo .pro en el proyecto QT y agregue una línea
QT+=network
  1. Cree una clase Smtp de la siguiente manera:
//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. Prueba en la función principal
int main(int argc, char *argv[])
{
    
    
    Smtp s("[发送方邮箱]","[授权码]");
    s.send("[接收方邮箱]","标题:测试smtp","内容:看看成功了没有");
    return 0;
}
  1. Si desea implementar aún más la función de enviar códigos de verificación a los usuarios, primero agregue una función de ranura del botón "Enviar código de verificación" (haga clic con el botón derecho en el botón para seleccionar Agregar función de ranura), el contenido de la función de ranura es el siguiente :
//生成验证码
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,"提示","邮箱格式不正确,请重新输入。");
    }

}

El efecto es el siguiente:
inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/qq_41544842/article/details/118762073
Recomendado
Clasificación