发送邮件部分
参考博文
-
登录/注册一个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;
}
- 在main函数中测试
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,"提示","邮箱格式不正确,请重新输入。");
}
}
效果如下:
版权声明:本文为qq_41544842原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。