QT でメール/認証コードを送信する

「メールを送信」セクションの参照ブログ投稿

  1. 163 メールボックスにログイン/登録し、設定で SMTP サービスを開きます。システムが認証コード (乱雑な文字列) を生成します。認証コードを書き留めます。
    ここに画像の説明を挿入
  2. QT プロジェクトの .pro ファイルを開き、行を追加します
QT+=network
  1. 次のように Smtp クラスを作成します。
//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. メイン関数でテストする
int main(int argc, char *argv[])
{
    
    
    Smtp s("[发送方邮箱]","[授权码]");
    s.send("[接收方邮箱]","标题:测试smtp","内容:看看成功了没有");
    return 0;
}
  1. ユーザーに認証コードを送信する機能をさらに実装したい場合は、まず「認証コードを送信」ボタンのスロット機能を追加します(ボタンを右クリックしてスロット機能の追加を選択します)。スロット機能の内容は次のとおりです。 :
//生成验证码
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,"提示","邮箱格式不正确,请重新输入。");
    }

}

効果は次のとおりです。
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/qq_41544842/article/details/118762073