Qt5基於smtp服務發送電子郵件


1、設置郵箱

先登錄163郵箱,然后在郵箱界面找到設置,在里面開通smtp服務。

這一步比較關鍵,要開通smtp服務,在開通的過程中會讓你輸入一個郵箱客戶端授權碼,這個才是你后面要用到的密碼,而不是你登陸郵箱的密碼;

 2. telnet命令發送郵件

打開cmd.

1. 輸入 telnet smtp.163.com 25 回車

我試驗了好幾個郵箱服務器,大都有嚴厲的反垃圾郵件系統,導致郵件發不出去,幸好163的郵箱竟然可以.TX威武呀.smtp的協議端口為25.

2. 輸入 HELO smtp.163.com 回車

我搜集的一些資料中既有使用helo又有使用ehlo的,結果還使我糾結了好久,后來又google才知道,原來都可以.這句應該是與服務器打招呼.如果返回250表示服務器准備就緒,可以進行下一步了.

3. 輸入 AUTH LOGIN 回車

這是指定登錄的模式,這句應該是一般模式.返回334就可以進行下一步了.

4. 輸入 經過base64加密的你的賬戶名,比如你的郵箱賬號號是xxxxxx@163.com,就去百度下 base64加密這個郵箱賬號(是加密整個郵箱賬號),copy到命令行回車返回334

5.輸入對應的授權碼(base64加密這個授權碼),注意是163郵箱的授權碼,不是密碼。回復235 Authentication successful表示驗證通過,可以進行下一步了.

6. 輸入 mail from:<xxxxxx@163.com> 這里寫你的163郵箱,服務器返回250.

7. 輸入 rcpt to:<xxxxxx@qq.com> 這里寫你要發送給的qq郵箱,服務器返回250,下一步

8. 輸入 data,表示開始傳送數據,服務器返回354

9. 輸入 subject:你的主題此處服務器無回顯

10. 輸入 此處什么也不用寫,直接回車換行,作為主題與正文的分界此處服務器無回顯

11. 輸入 在這里寫你的正文就可以了此處服務器也無回顯

12. 輸入 .對,就是一個英文句號,表示數據傳送完畢,服務器返回250

13. 輸入 quit服務器返回221,就安了,完成了,看看郵件收到了沒.

整個過程入下圖所示:

 

 qt代碼如下:

mailtest.pro

#-------------------------------------------------
#
# Project created by QtCreator 2019-07-08T10:30:13
#
#-------------------------------------------------
 
        
QT       += core gui
 
        
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
 
         
         
        
TARGET = mailtest
TEMPLATE = app
 
        
# The following define makes your compiler emit warnings if you use
# any feature of Qt which as been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS
 
        
# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0
 
        
 
        
SOURCES += main.cpp\
        mainwindow.cpp \
    smth.cpp
 
        
HEADERS  += mainwindow.h \
    smth.h
 
        
FORMS    += mainwindow.ui
QT += network

smtp.h
#ifndef SMTH_H
#define SMTH_H
 
        
 
        
#include<QByteArray>
#include<QString>
#include<QTcpSocket>
 
        
class Smtp
{
public:
    Smtp(QByteArray username,QByteArray password);
    ~Smtp();
    void send(QByteArray recvaddr,QString subject,QString content);
private:
    QTcpSocket * clientsocket;
    QByteArray username;
    QByteArray password;
    QByteArray recvaddr;
    QByteArray mailfrom = "mail from:<";
    QByteArray rcptto = "rcpt to:<";
    QByteArray prefrom = "from:";
    QByteArray preto = "to:";
    QByteArray presubject ="subject:";
    QString subject;                //主題
    QString content;                //發送內容
    QByteArray recvdata;            //接收到的數據
};
 
        
#endif // SMTH_H

smtp.cpp
#include "smth.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.cpp
#include "mainwindow.h"
#include <QApplication>
#include "smth.h"
 
        
int main(int argc, char *argv[])
{
 
        
    Smtp smtp("feigenchen@163.com","xxxxxx"); //郵箱和密碼都要用自己的
    smtp.send("774367088@qq.com","測試smpt","這個是我寫的代碼給你發的郵件哈哈哈哈哈哈哈哈哈^_^"); 
    return 0;
}

希望對各位有所幫助
參考網址:https://www.cnblogs.com/chunfeng0060/p/6135089.html
參考網址:https://blog.csdn.net/wangdeyu1994/article/details/78693427



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM