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