#include <QCoreApplication>
#include <QTcpSocket>
#include <QSslSocket>
#include <QDebug>
void sendEmail()
{
QString email = "接受邮箱账号";
QString subject = "邮件标题";
QString body = "邮件正文";
QString smtpServer = "邮箱服务器";
int smtpPort = 25; //端口号
QString senderEmail = "发送邮箱账号";
QString senderPassword = "发送邮箱密码";
// Connect to the SMTP server
QTcpSocket socket; //连接方式。这里选用TCP方式,也可以选择SSL加密方式
socket.connectToHost(smtpServer, smtpPort);
if (!socket.waitForConnected())
{
qDebug() << "Failed to connect to SMTP server.";
return;
}
else
qDebug() << "Success to connect to SMTP server.";
// Read the welcome message from the server
if (!socket.waitForReadyRead())
{
qDebug() << "Failed to receive welcome message from SMTP server.";
return;
}
QByteArray response = socket.readAll();
qDebug() << response;
// Send the EHLO command
socket.write("EHLO localhost\r\n");
if (!socket.waitForBytesWritten())
{
qDebug() << "Failed to send EHLO command to SMTP server.";
return;
}
if (!socket.waitForReadyRead())
{
qDebug() << "Failed to receive EHLO command response from SMTP server.";
return;
}
response = socket.readAll();
qDebug() << response;
// Send the authentication login command and credentials
socket.write("AUTH LOGIN\r\n");
if (!socket.waitForBytesWritten())
{
qDebug() << "Failed to send AUTH LOGIN command to SMTP server.";
return;
}
if (!socket.waitForReadyRead())
{
qDebug() << "Failed to receive AUTH LOGIN command response from SMTP server.";
return;
}
response = socket.readAll();
qDebug() << response;
QByteArray encodedEmail = senderEmail.toUtf8().toBase64();
QByteArray encodedPassword = senderPassword.toUtf8().toBase64();
socket.write(encodedEmail + "\r\n");
if (!socket.waitForBytesWritten())
{
qDebug() << "Failed to send encoded email to SMTP server.";
return;
}
if (!socket.waitForReadyRead())
{
qDebug() << "Failed to receive email authentication response from SMTP server.";
return;
}
response = socket.readAll();
qDebug() << response;
socket.write(encodedPassword + "\r\n");
if (!socket.waitForBytesWritten())
{
qDebug() << "Failed to send encoded password to SMTP server.";
return;
}
if (!socket.waitForReadyRead())
{
qDebug() << "Failed to receive password authentication response from SMTP server.";
return;
}
response = socket.readAll();
qDebug() << response;
// Send the MAIL FROM command
socket.write(QString("MAIL FROM:<%1>\r\n").arg(senderEmail).toUtf8());
if (!socket.waitForBytesWritten())
{
qDebug() << "Failed to send MAIL FROM command to SMTP server.";
return;
}
if (!socket.waitForReadyRead())
{
qDebug() << "Failed to receive MAIL FROM command response from SMTP server.";
return;
}
response = socket.readAll();
qDebug() << response;
// Send the RCPT TO command
socket.write(QString("RCPT TO:<%1>\r\n").arg(email).toUtf8());
if (!socket.waitForBytesWritten())
{
qDebug() << "Failed to send RCPT TO command to SMTP server.";
return;
}
if (!socket.waitForReadyRead())
{
qDebug() << "Failed to receive RCPT TO command response from SMTP server.";
return;
}
response = socket.readAll();
qDebug() << response;
// Send the DATA command
socket.write("DATA\r\n");
if (!socket.waitForBytesWritten())
{
qDebug() << "Failed to send DATA command to SMTP server.";
return;
}
if (!socket.waitForReadyRead())
{
qDebug() << "Failed to receive DATA command response from SMTP server.";
return;
}
response = socket.readAll();
qDebug() << response;
// Send the message headers and body
QString message = "To: " + email + "\r\n";
message += "From: " + senderEmail + "\r\n";
message += "Subject: " + subject + "\r\n";
message += "Content-Type: text/plain; charset=\"utf-8\"\r\n\r\n";
message += body + "\r\n";
socket.write(message.toUtf8());
socket.write(".\r\n");
if (!socket.waitForBytesWritten())
{
qDebug() << "Failed to send message to SMTP server.";
return;
}
qDebug() << "Message sent successfully.";
// Quit the session
socket.write("QUIT\r\n");
socket.waitForBytesWritten();
// Close the connection
socket.close();
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
sendEmail();
return a.exec();
}
注意,使用网络模块,需要在.pro文件中添加
QT += network
之后简单封装了一下,在以后的项目中可以直接使用:
#ifndef VDLEMAIL_H
#define VDLEMAIL_H
#include <QTcpSocket>
#include <QSslSocket>
#include <QDebug>
class VDLEmail
{
public:
VDLEmail();
void sendEmail(QString SmtpServer,int SmtpPort,QString SenderName,
QString SenderEmail,QString SenderPassword,QString ReceiveName,
QString ReceiveEmail,QString SubjectTitle,QString Content);
};
#endif // VDLEMAIL_H
#include "vdlemail.h"
VDLEmail::VDLEmail()
{
}
void VDLEmail::sendEmail(QString SmtpServer,int SmtpPort,QString SenderName,
QString SenderEmail,QString SenderPassword,QString ReceiveName,
QString ReceiveEmail,QString SubjectTitle,QString Content)
{
QString toName = ReceiveName;
QString email = ReceiveEmail;
QString subject = SubjectTitle;
QString body = Content;
QString smtpServer = SmtpServer;
int smtpPort = SmtpPort;
QString fromName = SenderName;
QString senderEmail = SenderEmail;
QString senderPassword = SenderPassword;
// Connect to the SMTP server
QTcpSocket socket;
socket.connectToHost(smtpServer, smtpPort);
if (!socket.waitForConnected())
{
qDebug() << "Failed to connect to SMTP server.";
return;
}
else
qDebug() << "Success to connect to SMTP server.";
// Read the welcome message from the server
if (!socket.waitForReadyRead())
{
qDebug() << "Failed to receive welcome message from SMTP server.";
return;
}
QByteArray response = socket.readAll();
qDebug() << response;
// Send the EHLO command
socket.write("EHLO localhost\r\n");
if (!socket.waitForBytesWritten())
{
qDebug() << "Failed to send EHLO command to SMTP server.";
return;
}
if (!socket.waitForReadyRead())
{
qDebug() << "Failed to receive EHLO command response from SMTP server.";
return;
}
response = socket.readAll();
qDebug() << response;
// Send the authentication login command and credentials
socket.write("AUTH LOGIN\r\n");
if (!socket.waitForBytesWritten())
{
qDebug() << "Failed to send AUTH LOGIN command to SMTP server.";
return;
}
if (!socket.waitForReadyRead())
{
qDebug() << "Failed to receive AUTH LOGIN command response from SMTP server.";
return;
}
response = socket.readAll();
qDebug() << response;
QByteArray encodedEmail = senderEmail.toUtf8().toBase64();
QByteArray encodedPassword = senderPassword.toUtf8().toBase64();
socket.write(encodedEmail + "\r\n");
if (!socket.waitForBytesWritten())
{
qDebug() << "Failed to send encoded email to SMTP server.";
return;
}
if (!socket.waitForReadyRead())
{
qDebug() << "Failed to receive email authentication response from SMTP server.";
return;
}
response = socket.readAll();
qDebug() << response;
socket.write(encodedPassword + "\r\n");
if (!socket.waitForBytesWritten())
{
qDebug() << "Failed to send encoded password to SMTP server.";
return;
}
if (!socket.waitForReadyRead())
{
qDebug() << "Failed to receive password authentication response from SMTP server.";
return;
}
response = socket.readAll();
qDebug() << response;
// Send the MAIL FROM command
socket.write(QString("MAIL FROM:<%1>\r\n").arg(senderEmail).toUtf8());
if (!socket.waitForBytesWritten())
{
qDebug() << "Failed to send MAIL FROM command to SMTP server.";
return;
}
if (!socket.waitForReadyRead())
{
qDebug() << "Failed to receive MAIL FROM command response from SMTP server.";
return;
}
response = socket.readAll();
qDebug() << response;
// Send the RCPT TO command
socket.write(QString("RCPT TO:<%1>\r\n").arg(email).toUtf8());
if (!socket.waitForBytesWritten())
{
qDebug() << "Failed to send RCPT TO command to SMTP server.";
return;
}
if (!socket.waitForReadyRead())
{
qDebug() << "Failed to receive RCPT TO command response from SMTP server.";
return;
}
response = socket.readAll();
qDebug() << response;
// Send the DATA command
socket.write("DATA\r\n");
if (!socket.waitForBytesWritten())
{
qDebug() << "Failed to send DATA command to SMTP server.";
return;
}
if (!socket.waitForReadyRead())
{
qDebug() << "Failed to receive DATA command response from SMTP server.";
return;
}
response = socket.readAll();
qDebug() << response;
// Send the message headers and body
QString message = "To: \"" + toName + "\"<" + email + ">\r\n";
message += "From: \"" + fromName + "\"<" + senderEmail + ">\r\n";
message += "Subject: " + subject + "\r\n";
message += "Content-Type: text/plain; charset=\"utf-8\"\r\n\r\n";
message += body + "\r\n";
socket.write(message.toUtf8());
socket.write(".\r\n");
if (!socket.waitForBytesWritten())
{
qDebug() << "Failed to send message to SMTP server.";
return;
}
qDebug() << "Message sent successfully.";
// Quit the session
socket.write("QUIT\r\n");
socket.waitForBytesWritten();
// Close the connection
socket.close();
}