下面是我实现的一个得demo,实现流程如下:
1.首先连接SMTP服务器,并读取服务器响应;
2.发送EHLO localhost\r\n完成握手,并读取服务器响应;
3.发送AUTH LOGIN\r\n,读取响应;
4.发送用户名的Base64格式,读取响应;
5.发送密码的Base64格式,读取响应;
6.发送邮件发送者MAIL FROM:\r\n,读取响应;
7.发送邮件接收者RCPT TO:\r\n,读取响应;
8.发送DATA\r\n,读取响应;
9.发送邮件头部From: \r\n To:\r\n Subject:title\r\n,读取响应;
10.发送邮件正文,读取响应;
11.发送QUIT\r\n,断开连接。
QTcpSocket socket;
const QString host = ui.host->text();
const quint16 port = ui.port->value();
const QString username = ui.sendAddress->text();
const QString password = ui.code->text();
QStringList receive = ui.receviceAddress->text().split(";");
// 连接 SMTP 服务器
socket.connectToHost(host, port);
if (!socket.waitForConnected()) {
qDebug() << tr("Unable to connect to SMTP server");
ui.log->append("Unable to connect to SMTP server");
return;
}
// 读取服务器响应
if (!socket.waitForReadyRead()) {
qDebug() << tr("No response was received from the SMTP server");
ui.log->append("No response was received from the SMTP server");
return;
}
QByteArray data = socket.readAll();
qDebug() << data;
ui.log->append(data);
QThread::msleep(50);
// 握手
socket.write("EHLO localhost\r\n");
if (!socket.waitForBytesWritten()) {
qDebug() << tr("Interaction failure");
ui.log->append("Interaction failure");
return;
}
// 读取服务器响应
if (!socket.waitForReadyRead()) {
qDebug() << tr("No response was received from the SMTP server");
ui.log->append("No response was received from the SMTP server");
return;
}
data = socket.readAll();
qDebug() << data;
ui.log->append(data);
QThread::msleep(50);
// 身份验证
socket.write("AUTH LOGIN\r\n");
if (!socket.waitForBytesWritten()) {
qDebug() << tr("The authentication request failed");
ui.log->append("The authentication request failed");
return;
}
// 读取服务器响应
if (!socket.waitForReadyRead()) {
qDebug() << tr("No response was received from the SMTP server");
ui.log->append("No response was received from the SMTP server");
return;
}
data = socket.readAll();
qDebug() << data;
ui.log->append(data);
QThread::msleep(50);
// 发送用户名
socket.write(username.toUtf8().toBase64() + "\r\n");
if (!socket.waitForBytesWritten()) {
qDebug() << tr("Send username error");
ui.log->append("Send username error");
return;
}
// 读取服务器响应
if (!socket.waitForReadyRead()) {
qDebug() << tr("No response was received from the SMTP server");
ui.log->append("No response was received from the SMTP server");
return;
}
data = socket.readAll();
qDebug() << data;
ui.log->append(data);
QThread::msleep(50);
// 发送密码
socket.write(password.toUtf8().toBase64() + "\r\n");
if (!socket.waitForBytesWritten()) {
qDebug() << tr("Send password error");
ui.log->append("Send password error");
return;
}
// 读取服务器响应
if (!socket.waitForReadyRead()) {
qDebug() << tr("No response was received from the SMTP server");
ui.log->append("No response was received from the SMTP server");
return;
}
data = socket.readAll();
qDebug() << data;
ui.log->append(data);
QThread::msleep(50);
// 发送邮件内容
const QString subject = ui.header->text();
const QString body = ui.text->toPlainText();
socket.write(QString("MAIL FROM:<%1>\r\n").arg(username).toUtf8());
if (!socket.waitForBytesWritten()) {
qDebug() << tr("Send sender failure");
ui.log->append("Send sender failure");
return;
}
QThread::msleep(50);
foreach(const QString & to, receive) {
socket.write(QString("RCPT TO:<%1>\r\n").arg(to).toUtf8());
if (!socket.waitForBytesWritten()) {
qDebug() << tr("Send recipient failed");
ui.log->append("Send recipient failed");
return;
}
}
QThread::msleep(50);
socket.write("DATA\r\n");
if (!socket.waitForBytesWritten()) {
qDebug() << tr("Send request data error");
ui.log->append("Send request data error");
return;
}
// 读取服务器响应
if (!socket.waitForReadyRead()) {
qDebug() << tr("No response was received from the SMTP server");
ui.log->append("No response was received from the SMTP server");
return;
}
data = socket.readAll();
qDebug() << data;
ui.log->append(data);
QThread::msleep(50);
// 发送邮件头部
QString header = QString("From: <%1>\r\n").arg(username);
foreach(const QString & to, receive) {
header += QString("To: <%1>\r\n").arg(to);
}
header += QString("Subject: %1\r\n").arg(subject);
socket.write(header.toUtf8());
socket.write("\r\n");
if (!socket.waitForBytesWritten()) {
qDebug() << tr("Send email sender error");
ui.log->append("Send email sender error");
return;
}
QThread::msleep(50);
// 发送邮件正文
socket.write(body.toUtf8());
socket.write("\r\n.\r\n");
if (!socket.waitForBytesWritten()) {
qDebug() << tr("send email body error");
ui.log->append("send email body error");
return;
}
// 读取服务器响应
if (!socket.waitForReadyRead()) {
qDebug() << tr("No response was received from the SMTP server");
ui.log->append("No response was received from the SMTP server");
return;
}
data = socket.readAll();
qDebug() << data;
ui.log->append(data);
QThread::msleep(50);
// 断开连接
socket.write("QUIT\r\n");
if (!socket.waitForBytesWritten()) {
qDebug() << tr("The disconnect request failed");
ui.log->append("The disconnect request failed");
return;
}
// 关闭套接字
socket.close();