免费国产精品自在自线-91精品国产色综合久久久浪潮-99热久久免费频精品-国产精品国模在线观看-久久亚洲国产精品成人?V秋霞-久久国产一级A片免费播放-亚洲国产欧洲综合97久久-久久国产白嫩美女呻吟高潮

ARTICLE DETAIL

資訊詳情

深耕商務建站與企業(yè)官網(wǎng)運營的一線實戰(zhàn)洞察。

基于Qt的跨平臺SMTP郵件發(fā)送工具封裝實戰(zhàn)

基于Qt的跨平臺SMTP郵件發(fā)送工具封裝實戰(zhàn) 簡介基于Qt與C開發(fā)的郵件發(fā)送工具面向需要跨平臺實現(xiàn)SMTP郵件收發(fā)功能的開發(fā)者尤其適合在Windows與Linux環(huán)境下構(gòu)建帶附件的郵件客戶端。資源包共59個文件包含25個cpp源文件、15個頭文件以及dll動態(tài)庫、UI設計文件、工程配置與資源圖片等完整覆蓋從界面構(gòu)建到SMTP通信的各個環(huán)節(jié)整體約16.32MB。代碼通過socket編程與郵件服務器交互利用QMimeData及MIME標準處理附件封裝實現(xiàn)身份驗證、主題設置、正文發(fā)送等功能工程包含Qt Creator項目文件、ui界面及qrc資源可直接編譯運行便于二次開發(fā)。目前已有312人學習下載適合具備C基礎、希望掌握Qt網(wǎng)絡編程與郵件協(xié)議細節(jié)的開發(fā)者參考。1. 為什么我要自己用 Qt 封裝一個跨平臺的郵件發(fā)送工具做桌面客戶端的人遲早會撞上一個需求把設備狀態(tài)、統(tǒng)計報表或錯誤日志自動發(fā)到指定郵箱。我在一個跨平臺數(shù)據(jù)采集項目里就被安排了這個活目標平臺既有 Linux 工控機又有 Windows 上位機。當時第一反應是找現(xiàn)成庫試了一圈發(fā)現(xiàn)要么只支持單平臺要么對 SMTP 的 TLS 處理得像黑匣子出了問題根本沒法查。最后決定基于 Qt 的 QAbstractSocket 和 QSslSocket 自己實現(xiàn)一個輕量 SMTP 客戶端代碼量不大但把協(xié)議狀態(tài)機、認證流程、MIME 編碼這些細節(jié)吃透了。這篇筆記就把這個工具的實現(xiàn)思路、關(guān)鍵代碼和我在 Linux/Windows 雙平臺踩過的坑完整拆出來適合需要在 Qt 項目里快速集成郵件通知功能的開發(fā)者參考。2. SMTP 協(xié)議邊界Qt 里 TCP、SSL 與認證方式這么選2.1 SMTP 是個純文本協(xié)議先搞懂命令-應答模型SMTP 和 HTTP 一樣是請求-響應模型但它的文本協(xié)議特性更純粹客戶端發(fā)一條命令服務器回一個三數(shù)字狀態(tài)碼加一段說明文本。發(fā)郵件整個過程就是一組命令的有序序列從 EHLO 開始經(jīng)過 MAIL FROM、RCPT TO、DATA最后以 QUIT 結(jié)束。這個有序性決定了 Qt 側(cè)必須有一個狀態(tài)機來驅(qū)動不能像普通 socket 編程那樣收到什么就處理什么。我第一版實現(xiàn)就是沒有狀態(tài)機收到服務器響應后直接調(diào)用下一步發(fā)送函數(shù)結(jié)果在慢網(wǎng)絡下偶發(fā)錯亂——服務器回 250 還在路上客戶端就把下一步命令丟出去了。后來改成顯式的狀態(tài)枚舉每次應答回來先校驗狀態(tài)碼與當前狀態(tài)的匹配關(guān)系再推進到下一個狀態(tài)問題才徹底消失。狀態(tài)碼分幾類2xx 表示成功、3xx 表示需要更多輸入、4xx 是臨時錯誤、5xx 是永久錯誤。郵件發(fā)送里最常見的幾個220 是服務器就緒250 是命令執(zhí)行成功334 是服務器要求提供認證數(shù)據(jù)354 是告訴客戶端 DATA 階段開始、可以輸入郵件內(nèi)容了。Qt 側(cè)處理的關(guān)鍵是不要把狀態(tài)碼當普通數(shù)字解析要做成枚舉和識別函數(shù)代碼維護性會好很多。2.2 端口與加密選型25、465、587 區(qū)別在哪里端口選型直接決定底層 socket 類的選擇。25 端口是傳統(tǒng) SMTP明文傳輸公網(wǎng)環(huán)境基本被運營商封鎖只適合內(nèi)網(wǎng)自己搭的郵件中繼。465 端口是 SMTPSsocket 建立后立即進入 SSL/TLS 加密對應 Qt 的 QSslSocket。587 端口是 submission先建立明文會話再通過 STARTTLS 命令升級為加密通道對應先 QAbstractSocket 后切換 QSslSocket 的模式。我在這個工具里對三種端口都做了支持因為不同郵件服務商偏好不一樣。實現(xiàn)上的差異集中在連接階段465 直接用 QSslSocket 連接connectToHostEncrypted 一發(fā)就完事587 需要先普通連接EHLO 之后發(fā) STARTTLS成功后再重新 EHLO 并走認證流程。這里有個常見翻車點587 端口升級加密后服務器要求重新發(fā)送 EHLO很多人在 TLS 握手后直接發(fā) AUTH 命令服務器會回 503 錯誤這是免費教學資源里反復出現(xiàn)的經(jīng)典坑。2.3 認證機制LOGIN 和 PLAIN 是最通用的組合SMTP 認證常見的有 PLAIN、LOGIN、CRAM-MD5 三種。PLAIN 是把用戶名密碼用客戶端和服務器的共同憑據(jù)一次性發(fā)給服務器LOGIN 是分成兩步服務器先問用戶名再問密碼。CRAM-MD5 是挑戰(zhàn)-響應機制服務器先發(fā)一個隨機挑戰(zhàn)字符串客戶端用密碼和挑戰(zhàn)做 MD5 摘要后返回密碼不直接暴露在網(wǎng)絡上。從 Qt 實現(xiàn)角度LOGIN 和 PLAIN 處理起來最直接。LOGIN 的交互邏輯比較自然客戶端發(fā) AUTH LOGIN服務器回 334 加提示字符串客戶端把用戶名做 Base64 編碼發(fā)過去服務器再回 334客戶端再發(fā)密碼的 Base64最后收到 235 表示認證成功。PLAIN 就一條命令AUTH PLAIN 后面直接跟一個 Base64 編碼的字符串這個字符串的格式是 \0username\0password即空字符包夾用戶名和密碼。考慮到兼容性我默認先發(fā) EHLO 看服務器通告的 AUTH 能力列表優(yōu)先嘗試 CRAM-MD5如果服務器沒通告就退到 LOGIN。實際測試中發(fā)現(xiàn)部分內(nèi)網(wǎng)郵件服務器只實現(xiàn)了 LOGIN所以我在工具里把 LOGIN 作為默認、PLAIN 作為備選遇到服務器通告里兩種都不支持時才報錯。// 根據(jù) EHLO 響應解析服務器支持的認證方式 QStringList AuthMechs; foreach (const QString line, ehloReply) { if (line.startsWith(AUTH)) { AuthMechs line.mid(5).split( , Qt::SkipEmptyParts); break; } } // 常見輸出示例: AUTH LOGIN PLAIN CRAM-MD5這段邏輯值得注意的細節(jié)是服務器返回多行擴展狀態(tài)碼時AUTH 能力的行可能不是第一行。SMTP 的 EHLO 響應是多行的每行前面有狀態(tài)碼只有最后一行帶空格前綴表示續(xù)行。Qt 里如果一次性 readAll 讀取要把響應按行拆分后逐行檢查而不是直接 startsWith(AUTH)否則遇到前面有多行狀態(tài)碼時會漏掉。2.4 QSslSocket 的同步與異步邊界要拎清Qt 的 QSslSocket 是異步接口connectToHostEncrypted 觸發(fā)連接后程序不會阻塞等待結(jié)果而是通過信號通知調(diào)用方。在郵件發(fā)送這種邏輯里同步改異步是天然的——發(fā)郵件本身就應該放到后臺線程不阻塞主界面。但要注意 QSslSocket 的信號連接時機我在第一版里犯過錯誤在 connectToHostEncrypted 之后才連接 encrypted 信號結(jié)果握手極快的情況下信號丟失程序卡死在等待狀態(tài)。正確做法是先連接所有需要的信號再觸發(fā)連接動作。sslErrors 信號尤其重要默認情況下 QSslSocket 遇到自簽名證書或證書過期會直接中止連接必須手動調(diào)用 ignoreSslErrors 或彈出確認對話框。在工具內(nèi)部我實現(xiàn)了一個策略配置接口讓調(diào)用方?jīng)Q定是忽略還是中止默認對自簽名證書直接給出告警日志后忽略因為內(nèi)網(wǎng)郵件服務器用自簽證書太常見了。3. 核心實現(xiàn)SMTP 客戶端類的四個模塊與關(guān)鍵代碼3.1 類設計與接口定義讓調(diào)用方只看一個 send 函數(shù)整個工具對外只暴露一個簡潔的接口調(diào)用方不需要關(guān)心 SMTP 細節(jié)。設計上分為四層Socket 封裝層、命令層、認證層、MIME 構(gòu)造層。Socket 封裝層負責 TCP/SSL 連接生命周期管理命令層實現(xiàn) SMTP 狀態(tài)機和命令發(fā)送認證層處理 LOGIN/PLAIN/CRAM-MD5 交互MIME 構(gòu)造層生成符合 RFC 5322 的郵件數(shù)據(jù)。類的核心接口設計如下class SmtpClient : public QObject { Q_OBJECT public: enum AuthMethod { AuthNone, AuthLogin, AuthPlain, AuthCramMd5 }; SmtpClient(const QString host, quint16 port, QObject *parent nullptr); void setAuth(const QString username, const QString password, AuthMethod method AuthLogin); void setSslMode(SslMode mode); // SslMode::Tls / SslMode::StartTls / SslMode::None public slots: void sendMail(const MailMessage msg); signals: void mailSent(); void mailFailed(const QString errorMessage); void statusChanged(const QString status); private: QAbstractSocket *m_socket; // ... };這個接口設計的核心思路是同步語義封進異步信號調(diào)用方調(diào)用 sendMail 后通過 mailSent 和 mailFailed 拿到結(jié)果statusChanged 實時回傳當前階段方便界面顯示發(fā)送進度。端口和加密模式在構(gòu)造時確定認證方式通過 setAuth 配置。關(guān)于參數(shù)SslMode 枚舉是很多實現(xiàn)里容易混淆的地方Tls 對應 465 端口直連加密StartTls 對應 587 端口先明文后升級。3.2 連接與狀態(tài)機基于 QStateMachine 不如手寫枚舉網(wǎng)上很多 Qt 郵件示例用 QStateMachine 框架來實現(xiàn)連接狀態(tài)轉(zhuǎn)換但我在實際項目里發(fā)現(xiàn)這個框架用在 SMTP 這種有極少狀態(tài)、嚴格線性的流程上顯得笨重——狀態(tài)轉(zhuǎn)換的觸發(fā)條件本來就是一個 socket 信號的 lambda直接手寫枚舉加 switch 反而更清晰可控。enum SmtpState { StateIdle, StateConnecting, StateEhlo, StateStartTls, StateEhloAfterTls, StateAuth, StateAuthUsername, StateAuthPassword, StateMailFrom, StateRcptTo, StateData, StateDataContent, StateQuit };每個狀態(tài)對應一個待發(fā)送的命令收到服務器響應后根據(jù)當前狀態(tài)決定推進方向。比如收到 220 就緒響應后如果配置了 StartTls 就發(fā) STARTTLS否則直接發(fā) EHLO。收到 250 響應后如果處于 StateEhlo 且還沒認證就發(fā)起 AUTH順序不能亂。我選了手寫枚舉的核心原因是這套流程邏輯雖然線性但有分支端口類型影響連接方式、認證方式影響交互步驟、發(fā)送內(nèi)容決定是否有 DATA 過程。手寫狀態(tài)機可以清晰表達這些分支條件后續(xù)調(diào)試時把當前狀態(tài)直接輸出到日志看狀態(tài)序列就能定位問題比 QStateMachine 調(diào)試起來直觀得多。void SmtpClient::handleReply(const QString reply) { int code reply.left(3).toInt(); switch (m_state) { case StateEhlo: if (code 250) { m_state StateAuth; sendAuth(); } else { emit mailFailed(QStringLiteral(EHLO failed: %1).arg(reply)); } break; case StateAuth: if (code 334) { m_state StateAuthUsername; sendBase64(m_username); } else { emit mailFailed(QStringLiteral(AUTH failed: %1).arg(reply)); } break; // ... } }邏輯說明handleReply 是 socket 的 readyRead 信號觸發(fā)后對緩沖數(shù)據(jù)的統(tǒng)一解析入口。每次解析出完整響應行才交付給狀態(tài)機然后是逐個狀態(tài)的分支處理。參數(shù)說明code 只取前三位數(shù)字response 的剩余部分僅在日志中使用不做流程控制依據(jù)。3.3 base64 認證細節(jié)Qt 的 Base64 編碼默認不帶換行SASL 認證里用戶名密碼都要做 Base64。這里有個 Qt 特有的坑QByteArray::toBase64() 默認每 76 個字符插入一個換行符這符合 MIME 的規(guī)范但 SMTP AUTH 里不允許出現(xiàn)換行服務器解析會出錯。解決方案是用 QByteArray::fromBase64 的反向函數(shù)編碼時指定 Base64Encoding | Base64UrlEncoding 標志組合起來可以關(guān)閉換行插入。實際測試中大部分 Linux 郵件服務器對換行寬容但 Windows 自帶的 SMTP 服務對格式要求嚴格一個 \r\n 混進 Base64 就整個包解析失敗。QByteArray SmtpClient::encodeAuth(const QString text) const { QByteArray raw text.toUtf8(); return raw.toBase64(QByteArray::Base64Encoding | QByteArray::OmitTrailingEquals); }OmitTrailingEquals 會去掉 Base64 末尾的 填充字符部分服務器對缺失 也能接受但為了兼容性我保留了 只用 Base64Encoding 純編碼去掉默認換行就夠。參數(shù)說明這里有個細節(jié)如果調(diào)用方傳給 setAuth 的用戶名密碼含非 ASCII 字符必須轉(zhuǎn) UTF-8 再做 Base64用 QString::toLatin1 會導致中文郵箱用戶名全部亂碼。3.4 超時與重傳QTimer 單次觸發(fā)做看門狗網(wǎng)絡環(huán)境不穩(wěn)定時SMTP 會話可能卡在某個中間態(tài)服務器連上了但遲遲不回 250認證發(fā)出去沒有響應DATA 階段服務器也斷了連接。如果沒有超時機制線程會一直掛著內(nèi)存和連接資源越積越多。我實現(xiàn)了一個統(tǒng)一的超時看門狗每次發(fā)送命令前啟動一個 QTimer::singleShot超時時間按階段區(qū)分——連接階段 30 秒認證階段 10 秒DATA 階段 60 秒。超時后強制斷開 socket 并發(fā)出 mailFailed 信號。void SmtpClient::startWatchdog(int timeoutMs) { if (m_watchdogId ! -1) killTimer(m_watchdogId); m_watchdogId startTimer(timeoutMs); } void SmtpClient::timerEvent(QTimerEvent *event) { if (event-timerId() m_watchdogId) { killTimer(m_watchdogId); m_watchdogId -1; abort(); emit mailFailed(QStringLiteral(SMTP timeout)); } }這段代碼的邏輯是每次發(fā)出命令的時候重設看門狗任何一次服務器響應到達都先 killTimer 再 startTimer相當于重新計時。參數(shù)設置上我推薦連接階段寬松、命令階段緊湊的方式原因是通過 EHLO 響應可以確認服務器活著后續(xù)每步響應都應該很快如果超過 10 秒基本是網(wǎng)絡問題或服務器死鎖再等也沒意義。4. MIME 構(gòu)造文本、HTML、內(nèi)嵌圖片與多附件的編碼細節(jié)4.1 普通文本郵件也要設置字符集和編碼很多人以為發(fā)純文本郵件只要拼好字符串 socket 寫出去就行實際上郵件傳輸是 7-bit 干凈的通道非 ASCII 字符必須編碼。最簡單的策略是 UTF-8 加 Base64 編碼整個郵件體作為一個 Base64 塊嵌進 Content-Transfer-Encoding 頭里。QByteArray MailMessage::buildTextBody(const QString text) { QByteArray out; out Content-Type: text/plain; charsetutf-8\r\n; out Content-Transfer-Encoding: base64\r\n; out \r\n; out text.toUtf8().toBase64(QByteArray::Base64Encoding); return out; }邏輯說明QByteArray::Base64Encoding 這個標志位會自動處理 76 字符換行這對 MIME 的 Base64 段是符合規(guī)范的——解碼端會忽略換行符。但這里有個細節(jié)Base64 編碼后的數(shù)據(jù)行與行之間以 \r\n 分隔而不是 \n網(wǎng)絡傳輸協(xié)議里標準明確要求用 CRLF。參數(shù)說明如果調(diào)用方傳入的 text 本身包含 \r\n編碼后的 Base64 塊里這些換行已經(jīng)被編碼成數(shù)據(jù)不會干擾郵件結(jié)構(gòu)可以放心。4.2 Quoted-Printable 與 Base64 的應用場景邊界Base64 適合編碼整體就是二進制或大量非 ASCII 字符的內(nèi)容Quoted-Printable 適合以 ASCII 為主體、偶爾有少量非 ASCII 字符的內(nèi)容。Q-P 編碼把非 ASCII 字節(jié)寫成 XX 形式可讀性好體積膨脹小。在郵件場景里 Base64 用于附件和純文本郵件體QP 用于 HTML 郵件體中穿插少量中文標題或關(guān)鍵詞的場景。兩者可以混合出現(xiàn)在同一個 MIME 多部分消息的不同部分里互不沖突。QByteArray MailMessage::encodeQuotedPrintable(const QString text) { QByteArray utf8 text.toUtf8(); QByteArray out; for (char c : utf8) { unsigned char uc static_castunsigned char(c); if (uc \n) { out \r\n; } else if (uc || uc 127 || uc 32 || uc ?) { out ; out QByteArray::number(uc, 16).rightJustified(2, 0).toUpper(); } else { out c; } } return out; }邏輯說明手動實現(xiàn) Q-P 編碼比用庫函數(shù)更可控因為需要精確處理軟換行和硬換行邏輯。注意代碼里的細節(jié)等號、非 ASCII 字符、控制字符都要轉(zhuǎn)義而空格在 Q-P 編碼里可以保持原樣但在行尾必須編碼成 20否則解碼端會吃掉它。4.3 multipart/mixed 與 multipart/related 的嵌套結(jié)構(gòu)一封帶附件的郵件頂層必須是 multipart/mixed里面第一個子部分是郵件正文后面是附件。如果正文里要嵌圖片正文本身要轉(zhuǎn)成 multipart/related內(nèi)嵌圖片用 CID 引用。QByteArray MailMessage::buildMultipart(const QByteArray body, const QListAttachment attachments) { QByteArray boundary ----_Part_ QByteArray::number(QRandomGenerator::global()-generate()); QByteArray out; out Content-Type: multipart/mixed; boundary\ boundary \\r\n; out \r\n; out -- boundary \r\n; out body; for (const Attachment att : attachments) { out \r\n-- boundary \r\n; out att.buildPart(); } out \r\n-- boundary --\r\n; return out; }邊界字符串用隨機數(shù)生成避免出現(xiàn)在郵件內(nèi)容里造成解析歧義。隨機數(shù)的來源我選 QRandomGenerator::global()它線程安全跨平臺表現(xiàn)一致。邊界字符串的格式要求是開頭不能是空格或換行長度不超過 70 字符這里隨機數(shù)生成的長格式完全符合規(guī)范。4.4 附件的 Content-Disposition 與文件名編碼附件的文件名如果是中文必須做 RFC 2231 編碼也就是 filename*UTF-8%E4%B8%AD%E6%96%87.txt 這種格式。不加這個頭的話多數(shù)客戶端顯示附件名為亂碼或直接丟失擴展名。QByteArray Attachment::buildPart() const { QByteArray out; QString encodedName QUrl::toPercentEncoding(m_fileName); out Content-Type: application/octet-stream; name*UTF-8 encodedName.toUtf8() \r\n; out Content-Transfer-Encoding: base64\r\n; out Content-Disposition: attachment; filename*UTF-8 encodedName.toUtf8() \r\n; out \r\n; out m_data.toBase64(QByteArray::Base64Encoding); return out; }邏輯說明RFC 2231 的格式是對文件名做 percent-encoding 后追加到 filename* 字段注意不要用 QUrl::toPercentEncoding 的默認參數(shù)它會編碼空格和標點需要確認不把斜杠也編碼掉。參數(shù)說明里有個細節(jié)m_data 是從文件讀取的原始字節(jié)不要在讀取時做任何轉(zhuǎn)換直接 Base64否則大文件會有雙重轉(zhuǎn)換的性能開銷和內(nèi)存膨脹。4.5 CRLF 與點填充DATA 階段的兩個硬性規(guī)范DATA 階段是 SMTP 協(xié)議里唯一的多行數(shù)據(jù)階段客戶端發(fā) DATA 命令收到 354 響應后逐行發(fā)送郵件內(nèi)容以單獨一行英文句點 . 結(jié)束。這個過程中有兩個規(guī)范必須遵守所有行必須以 CRLF 結(jié)尾內(nèi)容中凡是以 . 開頭的行都必須額外在行首增加一個點即發(fā)送 .. 服務器端會還原為單點。如果不在客戶端處理孤立行點郵件正文里某個以 . 開頭的段落會導致服務器提前結(jié)束 DATA 階段后續(xù)內(nèi)容全部丟失。我專門實現(xiàn)了一個 dotUnstuffing 函數(shù)在發(fā)送前對郵件體按行處理QByteArray MailMessage::dotUnstuff(const QByteArray content) const { QByteArray out; QListQByteArray lines content.split(\n); for (int i 0; i lines.size(); i) { QByteArray line lines.at(i); if (line.endsWith(\r)) line.chop(1); if (line.startsWith(.)) out .; out line; if (i lines.size() - 1) out \r\n; } return out; }邏輯說明這里手動處理行尾是因為不同系統(tǒng)上傳入的文本可能混有 \n、\r\n 或 \r統(tǒng)一在函數(shù)入口轉(zhuǎn)成規(guī)范格式再處理。注意這個函數(shù)只處理行首點轉(zhuǎn)義不負責把 \n 替換成 \r\n——這個邏輯應該在構(gòu)建消息體時已經(jīng)完成在 dotUnstuff 中重復處理反而會破壞已編碼的 Base64 塊。5. 六個避坑狀態(tài)機、Base64 換行與 Windows 證書鏈5.1 現(xiàn)象465 端口連接后立即收到 220但 AUTH 后一無所獲這是我在某公司內(nèi)網(wǎng)郵件服務器上遇到的第一個玄學問題。連接正常EHLO 正常AUTH LOGIN 發(fā)出后服務器不回任何響應直到超時。原因排查后發(fā)現(xiàn)服務器的 SMTP 服務的 TLS 層握手使用了 465 端口特有的立即加密模式而 QSslSocket 連接時默認的 sslMode 配置成了 SslMode::None導致明文 AUTH 被服務器丟棄或視為協(xié)議錯誤。解決方案是為每種端口指定獨立的默認 SslMode端口 465 默認 Tls端口 587 默認 StartTls端口 25 默認 None。同時保留 setSslMode 接口供調(diào)用方覆蓋。從那以后凡是端口和加密模式不一致的報錯我第一件事先查配置組合。5.2 現(xiàn)象驗證碼郵件發(fā)送成功后收件人看不到正文開發(fā)階段自己測試一切正常但收件人收到的郵件正文是空的只有附件。這是典型的 Windows 換行符混入導致的解析歧義。Windows 上 QFile 讀取文本或 QString 拼接時默認保留 \r\n而 Linux 下默認只有 \n。郵件體里部分行以 \n 結(jié)尾、部分行以 \r\n 結(jié)尾部分客戶端解析 MIME 邊界時按 \r\n 逐行找 boundary 字符串遇到裸 \n 就誤判后續(xù)結(jié)構(gòu)全亂。解決方案是在構(gòu)建郵件體的入口強制做換行規(guī)范化MIME 頭、正文、附件部分的每一行都以 \r\n 結(jié)尾不做例外處理。這個函數(shù)我放在 MailMessage 構(gòu)造函數(shù)里在 fill 階段統(tǒng)一處理。5.3 現(xiàn)象附件大小超過 10MB 后發(fā)送失敗日志顯示 socket 寫入明顯變慢偶爾還報 connection reset by peer。原因有兩個一是我用 QByteArray 一次性持有整個 Base64 編碼后的內(nèi)容大文件時內(nèi)存翻倍二是 socket 寫入緩沖區(qū)滿后Qt 的 write 函數(shù)返回 -1或只寫入部分字節(jié)我沒有處理partial write 情況。解決方案附件讀取改用分塊讀取Base64 編碼按 3KB 原始數(shù)據(jù)一塊編碼后立即寫入 socket寫入邏輯改為檢查 write 返回值如果只寫入部分則緩存剩余數(shù)據(jù)等 bytesWritten 信號繼續(xù)寫。這個改動后內(nèi)存占用降低發(fā)送穩(wěn)定性明顯提升。5.4 現(xiàn)象Windows 上發(fā)給某大型郵箱服務商的郵件被判定為垃圾郵件Linux 上發(fā)送同樣的郵件沒問題Windows 上卻進了垃圾箱。深入排查后發(fā)現(xiàn)是 Windows 的 QSslSocket 默認不帶系統(tǒng)的 CA 證書鏈路徑導致 TLS 握手的證書鏈驗證結(jié)果與 Linux 不同。某些郵件服務商看到 TLS 握手異常會提高垃圾郵件評分。解決方案是在 Windows 上顯式加載系統(tǒng)證書QSslConfiguration::setCaCertificates 從系統(tǒng)證書存儲讀取或者調(diào)用 setDefaultConfiguration 把 Windows 根證書庫的證書 load 進 QSslSocket。注意這個操作要在連接之前完成不是 connectToHostEncrypted 之后。5.5 現(xiàn)象定時發(fā)送任務在 Linux 服務器后臺運行時偶發(fā)段錯誤用 QTimer 定時觸發(fā) sendMail運行幾天后出現(xiàn) crash。排查發(fā)現(xiàn)是對象生命周期問題sendMail 是異步的SMTP 狀態(tài)機跨多個網(wǎng)絡交互如果調(diào)用方在定時觸發(fā)后立刻銷毀了 SmtpClient 對象socket 信號觸發(fā)時訪問已釋放的內(nèi)存。解決方案是引入 QSharedPointer 或 QPointer 管理客戶端對象生命周期在 mailSent/mailFailed 信號發(fā)出前不釋放?;蛘咴?SmtpClient 內(nèi)部增加一個 m_isDeleting 標志告訴調(diào)用方當前不能銷毀。一般我推薦前者用 shared 指針包裹客戶端放在調(diào)用方的容器里發(fā)送完成信號后再 reset。5.6 現(xiàn)象服務器返回 550 5.7.1 authentication required連接、認證都顯示成功但發(fā)送時被拒日志里出現(xiàn) 550 錯誤。這個坑的根因很隱蔽EHLO 響應里 AUTH 能力列表只有 PLAIN服務器要求必須用 PLAIN 認證但客戶端配置了 LOGIN認證時服務器認為沒有完成有效認證發(fā)送階段才暴露。解決方案是把認證方式選擇做成自動協(xié)商解析服務器通告的 auth list按 CRAM-MD5 LOGIN PLAIN 優(yōu)先級選擇而不是固定調(diào)用方指定。事后我在配置接口里保留了 overrideAuthMethod 方法但默認自動協(xié)商保證內(nèi)網(wǎng)環(huán)境零配置可用。6. 從可用到可靠命令追蹤、自測與超時重傳的三個習慣項目做到能發(fā)郵件只是第一步真正考驗人的是讓這套東西在各種異常環(huán)境下不崩、不丟、不發(fā)重復郵件。所以我在工具正式集成進業(yè)務系統(tǒng)之前養(yǎng)成了三個習慣。第一個習慣是給每次會話做一個命令追蹤文件。SMTP 會話的每一條發(fā)出命令和接收到的響應都帶時間戳追加到日志緩沖區(qū)并提供 dumpSessionLog 方法供外部調(diào)用。排查問題時直接看這個文件就能定位到對話的哪一步出錯——是 TLS 握手沒完成還是認證交互卡在某個 334 響應一目了然。第二個習慣是用 openssl 命令手工模擬一次 SMTP 會話作為對照。通過 openssl s_client -connect host:port -starttls smtp 進入交互模式手工輸 EHLO、AUTH、MAIL、RCPT、DATA能確認服務器行為正常排除工具本身的問題。這個習慣幫我排查過一個非常隱蔽的坑某內(nèi)網(wǎng)服務器要求 HELO 而不是 EHLO只有手工模擬時才會注意到這個細節(jié)代碼里直接跑了六輪 EHLO 全部失敗。第三個習慣是給超時重傳加冪等控制。簡單場景下網(wǎng)絡超時后直接重發(fā)整封郵件可能造成收件人收到兩封相同的信。我在 MailMessage 結(jié)構(gòu)里加了一個 messageId 字段每次重傳使用相同的 Message-ID 頭并對同一邏輯郵件的重傳次數(shù)做上限控制默認最多 3 次間隔 30 秒退避。以重傳擴展為例for (int attempt 1; attempt maxRetries; attempt) { connect(m_job, SmtpJob::mailSent, this, [this]() { notifySuccess(); }); connect(m_job, SmtpJob::mailFailed, this, [this, attempt]() { if (attempt maxRetries) { QTimer::singleShot(30000 * attempt, this, [this]() { sendMail(m_msg); }); } else { notifyFailure(); } }); }邏輯說明重傳間隔按嘗試次數(shù)線性退避30 秒、60 秒、90 秒給服務器恢復留時間而不是無腦重試。參數(shù)說明maxRetries 和 baseInterval 通過構(gòu)造函數(shù)注入方便宿主環(huán)境按業(yè)務場景調(diào)整——實時告警可以縮短間隔日終報表可以放大到 5 分鐘。從那以后我每次接入新郵件服務都要強制走一遍手工 SMTP 會話、日志回放、重傳冪等這三項檢查確實省下不少半夜被叫起來解決問題的麻煩希望幫到你。本文還有配套的精品資源點擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
色婷婷成人网| 日本色色色| 色婷婷电影网| 深爱激情久久| 东京热人妻一区二区三区在线| 色婷婷丁香社综合| www.色婷婷.com| 婷婷五月天Av| 99ri在线| 国产无套精品一区二区| 色情五月天se| 综合大香蕉| 欧美经典片免费观看大全| www.99热视频| 五月花激情网| 五月激情综合婷婷| 成人午夜天| 久久久精品人妻| 五月天激情偷拍| 天天操天天干天天射| 五月婷色丁香| 婷婷色婷婷亚洲成人| 网色99| 五月丁香五月激情综合色综合| 91热在线| 天天插天天干| 五月天亚洲色| 免费视频舔| 五月丁香亚洲婷婷| 夜夜操少妇| bukadeavzaixian| 久久色情| 亚洲无码色色| 丁香婷婷久久 | 色婷婷黄色网络| 骚逼视频一区2区| 九九热10| 97丁香婷婷| 国产成人综合网| 91人无码久久久久久| 丁香五月婷婷六月| 五月丁香激情婷婷| 五月丁香色婷婷综合| 亚洲性爱AV| 99热66| 小视频一区 | 日日操夜夜操狠狠操| www.色色色com| 久久久久久久丁香五月天婷婷| 五月天综合在线观看视频| 亚洲4区国产欧美| 亚州性爱99| 99啪啪| 亚洲午夜Av| 亚洲网综合在线| 饮料下药迷倒漂亮女同事强干| 成人色站,在线视频,看片-SS1AV| 激情宗合 激情宗合| 激情五月天综合| 6月丁香婷婷| 超碰97久久| 久久婷婷的综合色丁香五月| 思思热99热| 丁香婷婷色色| 丁香五月天色婷婷| 狠狠综合网| 色五月激情五月| 日本久久高清| 亚洲色热| 色婷婷色综合久久精品V| 天天日日夜夜爽。| 色五月av| 中文av网| 婷婷中文字幕网站| 九色 在线| 人妖色AV色综合| 性爱七区| 日本www五月婷婷| 亚洲中文字幕在线观看| 五月天婷婷激情在线色图| 色综合婷婷| 青草青草久热这里只有精品| 久久精品日| 丁香五月婷婷操逼| 综激情网| 久久久婷丁香五月| 天天操综合网| 久碰视频| 99热99精品| 91viP在线看| 色婷婷手机在线| 五月丁香激情综合啪| 精品久久婷婷| 色播五月丁香综合| 最新色色五月天| 色偷偷五月天| 色99无码| 天天干天天日日| Caoub青青超碰 | 超碰人人超碰| www.日日日.com| 视频这里只有精品16| 国产婷婷综合| 五月婷婷综合社区| 91免费在线视频6| 麻豆AV一区二区三区| 婷婷综合色图| 五月丁香综合啪啪| 欧美啪啪9| 五月天激情小说网| 婷婷丁香五月精品| 日本va欧美va国产激情| 精品成人无码A片观看香草视频| 婷婷五月天堂| 婷婷五月天成人| 久久婷婷五月天激情新地址| 欧美黄色一级| 开心五月婷婷六月丁香| 99热精品免费在线观看| 色五月天视频| Www.激情| 激情五月成年| 国产五月丁香在线| 五月综合丁香婷婷| 香蕉99网| 综合五月天天天天天五月| 插插干干干色| 五月婷婷色五月| 久久91久久精品久久| 日木WWW视频| www.久9| 五月色婷婷在线观看| 亚洲色五月| 色婷婷玖玖影院| 久久这里只有精品5| 97人人干| 狠狠久久婷五月| 狠狠色丁香乆乆| 欧美色久| 97色在线观看视频| 丁香五月色网| 欧美影院| 婷婷五月丁香91| 国产高清精品色| 五月天亭亭俺也| 五月丁香偷拍| 99综合网| 久久WW| 久色欧美| 五月色情婷婷| 99国产视频网| 亚洲亚洲人成综合网络| 99亚洲精美视频在线观看| 黄色笑话深爱激情网丁香五月婷婷啪啪啪啪啪 | 91/九色黑人| 99热这里只有精品98| 亚洲男人的天堂婷婷色五月| www.精品99| 婷婷丁香五月天大香蕉| 狠狠擼综合| 99精品视频网| 五月婷婷天天色| 五月天婷婷色综合| 激情精品久久| 91色呦哟| 欧美色五月天| 野战J办公桌椅H| 欧美va精品va老师va| 久热播这里只有精品| 色婷婷亚洲六月婷婷中文字幕| 五月婷婷影院| 久久99激情| 99黄色性生活| 婷婷激情综合| 爱草视频在线| 五月天激情日色在线| 五月婷婷黄| 激情五月色综合| 曰本久久女| 色情一区二区播放| 玖玖激情五月天| 成人av在线网址| 97超碰在线免费观看| 开心五月婷| 色综合99无码 | 色色色色色色色色色色色色色五月天| 98永久精品| 天天操五月天| 人妻无码精品一区| 69激情小说| 亚洲9久久精品| 色婷婷色人人射| 六月份天丁香婷婷| 九月婷婷| 日本丰满久久| 开心激情站| 美女要搞搞天天搞搞搞网站| 丁香午夜天| 伊人五月天日日夜夜久久久天天| 色人久久| 色五婷婷| 色婷婷六月性| 久热久操久热久草国产91| 思思热在线精品视频网站| 亚洲第一第二网站| 五月天激情无码专区| 国产67194| 久99热| 丁香五月激情综合久久| 婷婷丁香五月天在线视频| 激情五月五月婷婷| 79精品视频在线观看,| 久久99久久99精品,久国产,久久精品免费,99久在线,久久久久国产精品免费网站,9 | xx人人xx| 丁香五月AV综合| 色五月婷婷777| 丁香五月天色婷婷| 我爱宗和色| 婷婷久久婷婷色五月| 丁香五月婷婷久久综合激情网| 夜夜骑夜夜操| www天天干| 丁香五月综合激情久久潮喷| 久久久久久久人妻| 激情丁香五月婷| 色婷婷亚洲综合网站| WWW、日本色丁香、co m| 人人操av| 亚洲丁香五月在线观看| 991自拍视频| 亚洲性视频| 国产午夜精品一区二区三区嫩草| 色婷亚洲| 天天天天天操| 激情五月伊人婷婷| 婷婷五月在线免费| 五月香蕉婷婷| 九月婷婷综合在线| 色和综合网| 爱射综合| 狠狠操狠狠插| 天天精品视频免费观看| www久久99| 五月丁香亭亭A片| 天天爽天天日| 色五月综合| 这里只有国产精品在线| 色婷婷国产精品综合在线观看| 色五月av| 91精品综合久久久久久五月丁香 | 狠狠狠狠狠草| 精品亚洲国产成AV人片传媒| 久久久五月激| 天天婷婷操| 大香蕉婷婷五月天| 色噜噜夜夜夜综合网| 夜夜爽天天干| 久久这里只有精品热在99| 色综合色欲综合天天免费 | 中文字幕无码人妻少妇免费视频| 婷婷久久色| 五月婷婷很很色| 99热| 精品夜夜澡人妻无码AV| 婷婷五月天无码| 夜夜操天天爽| 丁香五月激情在线| 五月婷婷亚洲色视频| www.激情.com.| 五月丁香啪综合| 9婷婷内射| 久久最新色| 婷婷五月天BBw| 热久久66| 人人爱国产| 丁香久久久| 五月丁香婷婷中文网| 99视频35精品视频在线观看| 九色99视频| 亚洲深喉aV| 草了bav视频在线观看| 久久五月丁香| 成人电影AV在线观看| 五月 丁香 欧美| 另类视在线| 久热99热| 夜夜操夜夜姧| 六月份天丁香婷婷| 在线色五月婷婷| 五月丁香综合精品| 色五月激情五月开心五月| 婷五月天在线草| 狠狠操狠狠做| 欧洲亚洲午夜| 夜夜操加勒比| 骚五月婷婷| 快乐婷婷五月天| 精品国产va久久久久久久| 99久久99九九九99九他书对| 99狠狠操一| 天天日天天舔天天摸| 欧美在线视频免费播放| 九九亚洲综合| 五月丁香直播| 中美日韩成人在线| 亚洲乱码精品久久久久..| 五月婷亚洲精品AV天堂| 五月丁香啪啪网| 国产暴力强伦轩1区二区小说| 久久综合五月天| 欧美顶级少妇做爰HD| av九九| 国产暴力强伦轩1区二区小说| 99这里只有精品|v| www久久99| 香蕉婷婷五月| 婷婷五月天综合网| 色婷婷AV久久久久久久| 丁香色情五月综合网站| 五月婷婷AV| 五月天丁香网| 97五月天婷婷综合激情网| 日本操B视频| 在线综合亚洲欧美65| 日韩免费视频| 狠狠做五月| 亚洲人妻一区二区 | 综合久| 无码人妻少妇色欲AV一区二区| 丁香五月婷久久| 激情五月天情色| 婷婷六月丁香激情| PORNY九色9l自拍视频成人| 五月激情婷婷综合| 婷婷五月色情| 婷婷六月五月天综合| 天天碰夜夜爽| 色五月婷婷7777| 思思久久99热| 久久九九网| 熟美女麻豆| 亚洲中文无码成人| 婷婷久久网| 激情五月色综合网| 激情五月婷黄版| 青草视频在线观看视频| www.com色播五月天| 日本一级| 999婷婷综合| 91狼友视频在线观看| 人人爽欧美婷婷久久久五月丁香| 久久久激情| 国产avapp 网| 五月天综合久久丁香91| 亭亭色天香| 欧美婷婷综合| 婷婷六月丁香在线| 狠狠干狠狠干| 丁香五月综合在线| 精品人妻伦一二三区久久| 97婷婷五月丁香| 激情WWW| 可以免费观看的AV| 五月亚洲激情| 99re欧美精品| 五月婷婷自拍视频| 热婷婷在线视频| 婷婷五月天激情诱惑| 婷婷五月六月| 入口五月婷婷六月香| 久狠日av| 亚洲第二AV| 深爱激情婷| 九九久久9 9在线观看| 国产成人AV在线播放| 久久这有这里精品| 亚洲乱码日产精品BD| 五月天伊人久久久久| 77799热| 禁欲电影完整版在线播放| 成人短视频免费| 狠狠色综合网站久久久久| 色99在线观看| 色五月婷婷成人视频| 五月婷婷综合视频| 亚洲操B视频| 婷婷五月天久久| 婷婷99狠| 噜噜色五月| 高清视频一区| 精品亚洲国产成人A片在线鸭王| 九九精彩久久| 精品久久人妻| 手机免费福利视频| 2017人人操| 热久久99热欧美国产亚洲| 亚洲精品九九| 97在线精品| 丁香五月天在线视频| 天天爽天天日| aaaaa黄色| 日本操B视频| 亚洲国产色色| 五月天丁香网站| 丁香色色网| 五月丁香激情综合欧美| 八戒青柠影视剧在线观看| 大香蕉520| 99精品成人无码A片观看金桔| 九九碰九九爱97超碰| 97亚洲婷婷| 亚洲色婷婷色| 亚洲第二AV| caop在线视频| 久久在线人妻| 99久久精| 9色在线视频精品观看| 婷婷综合五月天亚洲综合| se色婷婷视频| 久久精彩视频| www.minyis.com【JT】实力收量可预付QQ2101460746 | 婷婷丁香五月综合免费视频百花| 亚洲欧洲中文日韩久久AV乱码| 天天日狠狠| 超碰在线免费观看3 9| 综合图区激情| 午夜色色色极品视频| 五月色网| 先锋资源婷婷| 日本VA视频| 久热欧美| 五夜丁香| 97干在线视频精品店| 激情五月,婷婷五月,丁香五月| 五月婷婷婷色| 97夫妻超碰| 激情丁香社区| h亚洲| 色婷綜合网| 成人 在线 日韩| 91久女| 97香蕉碰碰人妻国产欧美| 青青操avbb| 超级碰碰91| 操操综合网婷婷| 五月婷婷激情五月| 日本久久婷婷| 久久伦乱| 欧美人妻一区二区| 五月婷婷丁香五月婷婷| 碰碰碰97免费精彩视频| 另类图片色五月| 五月婷婷久草在线视频综合| 五月婷在线影院| 99综合99| 婷婷五月精品| 99燥99日| 欧美在线视频免费播放| 99r久久这里只有精品| 婷婷久久国产视频| 97婷婷色| 999热这里只有精品| 国产午夜精品AV一区二区麻豆| 99精品无码| 成熟妇人A片免费看网站| 成人国产欧美大片一区| 六月丁香综合| 99热在这里只有精品| 婷婷大美在线| 网站免费一站二站| 丁香婷婷六月在线资源观看| 欧美日本黄色| 91ncm视频| 人人看人人97| 99视频在线观看网址| 天天操天天操天天操天天操天天操| 亚洲激情高潮| 丁香婷婷人妻综合网| 无码人妻一区二区一牛影视| 99久久99久久综合| 五月天最新网| 2025中文在线视频字幕免费观看| 激情 婷婷| 九色地址91视频| 国产婷婷五月| 99免费热视频在线| 精品人人操| 婷婷精品在线| 久久久精品99| 99九九玖玖| 亚洲乱码在线观看| 99精品国产在热久久| 婷丁香五月天| 激情床戏| 九九99在线观看视频| 另类婷婷五月天啪帕帕| 无码AV免费精品一区二区三区| 九九久久五月天综合伊人| YJLZZJLZZ亚洲乱熟无码| 五月丁香六月激情综合网| 激情影院丁香五月| 婷婷刺激综合| 99热久| 久久婷婷五月天激情新地址| 五月丁香人人婷婷在线观看| 成人羞羞啪啪 全 视频| 久久久99视频| 色欲资源网| 六月婷婷在线| 在线播放中文字幕| 国产69精品久久久久999小说| 婷婷五月亚洲综合| 思思99热| 97碰成超视频免费视频| 人人操人人添人人摸97| 99热亚洲只有色| 大香蕉天堂| 五月天日日操夜夜操 | 六月婷婷综合| 色婷婷中文| 日韩欧美老妇性视频91久久久| 国产精品24r| 国产精品视频| 9999热这里只有精品| 久久婷出差欧美色两性综合网| 九九人人操| 婷婷五月天激情综合婷婷五月天激情综合| 99re思思热久久| 婷婷五月天激情电影| 亚洲色图五月丁香| 深夜婷婷 丁香| 日本九九网| 第六色在线| 六月婷婷综合| 99热在线观看| 香蕉影院色| 色播婷婷五月天| 色婷婷在线视频综合| 26UUU欧美激情一区二区| 99热热九九| 野战毛片三一3| 五月婷婷影院| 日韩精品成人在线| 久久久区区一久久久久久| 婷婷六月激情丁香| 五月丁香啪啪网| 伊人婷婷91| 26UUU亚洲欧美| 五月婷婷狠狠干| 国产jd1024基地手机看国产| 影音先锋 一区| 九九热这里只有国产精品| www.五月丁香av| 99啪啪| AV免费在线网站| 婷婷丁香六月激情综合| 成人精品亚洲性爱| 欧美日韩成卜| 丁香五月六月婷婷自拍| 无码人妻一区| a级毛片一区二区免费视频| 五月丁香久久婷| 国产在线另类五月婷婷| 五月丁香成人| 91热网址| 成人在线日韩欧美| 99噜噜噜| 中文久久婷婷| 婷婷丁香六月| 在线看av| 久久总和99| 亚州激情九月| 玖玖精品视频| 超碰在线94| 欧美激情综合色丁香婷婷五月天| 999婷婷综合| 黑人无码一区| 六月丁香中文字幕| 激情婷婷在线中文字幕| 六月婷婷九月丁香亚洲综合| 婷婷国产日本欧美| 色噜噜狠狠色综无码久久合欧美| 色吊丝中文字幕| 五月丁香狠狠| 91seAV| 婷婷五月天视频亚洲| 狠狠插狠狠插| 激情视频综合| 久99| 久久婷婷成人视频| 国产午夜成人AV在线播放| 99久免费视频| 久久看婷婷| 婷婷色综合中心站| 国产精品电影网| 国产老熟妇亲子乱对白| 五月婷婷网久久| 婷婷婷婷午夜| 久久婷婷成人综合色怡春院| 五月天伊人日日噜影片AV| 思思热视频在线观看| 日韩操逼大片| 婷婷丁五月| 爱爱网址9| 79色色| 五月天婷婷久草丁香| 色五月亚洲开心网| 99久热精品在线| 国产精品色| www狠狠| 婷婷丁香六月| 丁香五月婷婷动漫视频| 婷婷久久五月| 欧美日韩国产一区二区| 午夜婷婷六月天| 99热狠狠操| 日韩啪| 色九月激情综合网| 天天色五月婷婷91久久久久久久| 逼逼AV| 五月天久久网站| 天天操天天操天天操天天操天天操 | 疯狂做受XXXX高潮A片动画| 伊人久久大香网| 五月天成人综合| 深爱五月亚洲| 9久久婷婷国产综合精品性色| 激情五月天综合图片小说网站| 五月天婷婷色播| 丁香操逼| 日本三级中国三级99人妇网站| 综合色吧| 亚洲乱码日产精品BD| 中文字幕av在线| 九九日伊人| 五月天成人在线播放| www狠狠爱com| 操一操干一干| 狠狠穞A片一區二區三區| 亚州色综合| 99操逼| 色五月激情五月天| 美女激情婷婷| 婷婷综合精品| 天天操天天插天天射| 99色色色色| 丁香五月天激情婷婷丁香六月| 五月婷婷六月丁香| 99丁香五月婷| 夜夜撸天天操| 久久综合伊人综合在线| 日本成人内射| 欧美精品XXXXBBBB| 亚洲精品影视| 五月丁香六月婷婷网| 婷婷丁香六月天激情四射网| 婷婷五月激情网| 九九这里精品| 婷婷欧美色| 色一情一乱一乱一区91Av| 色综合色色| 97干97色| 欧美视频五区| 色九九一二| 婷婷五月,综合伊人| 26uuu欧美日本| 26uuu.| www.com亚洲网站在线免费| 久99久视频| 久色婷婷200| 久久婷婷一级片| 色婷婷综合网| 色五月婷婷五月天激情综合| 五月天色区| 伊人网大香| 成人丁香| 91精品久久久久、久五月天| 成人操呦av| 99色区| 蜜臀AV在线成人| 大香网伊人久久综合| 99热热热99精品丁香| 另类激情综合| 五月丁香啪啪啪| 激情綜合W W W,激情五月天| 婷婷操逼| 六月五月丁香五月欧美| 丁J香六月首页| 丁香五月社区| 五月婷婷色情| 思思re99视频在线观看| 日日操夜夜撸| 五月丁香啪啪网| 日韩欧洲亚洲| 天天插天天插天天日| 激情五月狠狠喔| www.五月婷婷| 色偷偷五月天| 婷婷激情五月| 99热草草| 中文字幕婷婷在线| 97干综合网| 亚洲一级色电影| 日韩综合天堂| 麻豆科斗777| 丁香五月大片| 丁香六月无码播放| 66成人网| av中文在线| www色色com| 久九男女天堂| 亚洲国产网站| 色色色色五月天| yazhou seshipin| 五月婷婷六月丁香在线视频| 六月丁香五月激情网| 天天日天天舔天天摸| 五月天婷婷涩涩| 久久刺激网| 亚洲AV成人精品日韩在线播放| 色色五月丁香婷婷综合| 中文字幕91,综合| 五月丁香五月丁香五月丁香五月丁香91| 99啪99| 99在线er热| 五月丁香六月婷婷综合| 丁香六月视频免费观看| 男人天堂亚洲综合| 思思热AV| 色色无码| www.婷婷五月天| 中文婷婷狠狠| 久草大| 人妻肉射免费观看| 99ri久久| 久久成人天| www.99热在线| 婷婷五月天av| 婷婷激情啪啪| 人人舔人人色人人高潮| 色色亚洲无码| 亚洲午夜视频| 天天干天天拍| 99自拍视频网站| 国产99视频永久免费| 亚洲丁香婷婷五月天综合色| 无码一区二区日韩| 中文av网| 99在线精品免费视频| 日韩国产在线精品| 在线观看的av| 久久九九免费视频| 在线观看免费人成视频无码| 国产在线激情视频| 99色婷婷视频| 野战毛片三一3| 九九精品在线观看视频6| 五月婷av| 亚洲亚洲人成综合网络| 精品国婬伦V无码久久久| 婷婷99视频在线| 色婷五月天| 婷婷五月丁香六月综合网| 人人摸人人| 婷婷影院A成人| 亚洲色爽| 熟女激情五月天| 激情五月最新网址| 久久五月婷综合网| 99爱在线免费视频| 久操大香蕉| 天天日天天色| 色日本综合| 婷婷丁香人妻天天| av亚洲国产小电影| 亚洲综合色网站| 中美日韩成人在线| 啪啪色区| 综合色播| 色综合色色色色色色综合| 久99热在线观看| 激情五月婷婷丁香| 狠狠色噜噜色狠狠狠综合色 | 狠狠色婷婷7777久综合| 另类综合激情| 色五月综合在线| 九九精品系列| 五月婷婷 激情五月| 97人人干人人操| 日韩 中文 欧美| 五月丁香五月婷婷在线观看| 日本狠狠干| 伊人综合网站| WwW天天干| 中文字幕 中文字幕明步| 91精品国产99久久久久久天美| 99在线精品免费视频| 无码动漫AV| 激情六月色| 九九99热| 激情综合五月婷婷| 99re在线观看视频| AA片在线观看视频在线播放| 久久总和99| 色爱综合网| 婷婷五月中文在线| 狠狠操天天干| 六月天无码网址| 狠狠爱成人综合网| 激情五月五月婷婷| 婷婷射图| 婷婷在线视频| 色性日本| 婷婷五月丁香四射| 久久人人九| 婷婷伊人中文字幕| 777精品久无码人妻蜜桃| 日本97在线视频| 九九热这里只有精品6| 亚洲精品中文字幕成人片| 五月天停停基地| 99在线综合视频| 美欧成人视频| 久久久久久天天日天天爱| 俺去也婷婷| 久久五月情| 色色五月丁香婷婷| 电影蜘蛛女| 91色综合网站在线| 婷婷五月天激情五月天| 亚洲五月天狠狠| 久久蜜臀婷婷| 婷婷香蕉| 激情综合色五月丁香六月亚洲| 无遮挡国产高潮视频免费观看| 精品五月视频婷婷在线观看| 色五月激情| 五月开心啪啪| 婷婷综合影院| 久久久久久久11111111111| 中文字幕婷婷五月天| 婷婷99视频精品| 婷婷色五月亚洲| 丁香五月电影院在线观看| 五月婷婷激情久久| 天天五月香欧美| 日本在线观看aaa 99| 亚洲综合干| 五月婷婷成人| 99热在线播放| 色偷偷色婷婷| 涩涩网五月天| 天天操无码| 中文AV网站| 免费视频无码| 91精品久久久久久久久| 亚洲欧美婷婷五月色综合| 五月婷婷影院| 五月丁香 狠狠爱| 色一情一乱一乱一区91Av| 99re在线视频精品,这里只有精品18,| 91丨九色丨国产| 99re思思热久久| 色婷婷亚洲五月天| 婷婷丁香六月激情综合| 玖玖综合色区在线观看| 欧美性丁香色色五月天干干| 色五月大| 嫩草极品| 五月天婷婷综合网| 黄色三级日本| 超碰二区| 99热一本| 五月婷婷香蕉视频| 五月丁香六月婷婷网| 色色色综合色| 丁香9月婷婷| 大学生高潮无套内谢视频| 美英法精品无码免费视频| 91日本在线免费| 丰满少妇猛烈A片免费看观看 | 欧美亚洲婷婷五月| 97色色色色| 色婷婷亚洲| 激情婷婷网| 丁香久久激情俄| 五月婷婷爽爽爽| 操一区| 1024日韩| 久热免费| 五月天婷婷婷| 人妻操操色| 天天噜天天爱| 六月婷婷激情| 黄色激情久久| 婷婷激情四射网| 99亚洲视频| 婷婷色六月| 99碰碰中文| 久草婷婷视频| 久久综合9| 日韩一级淫乱片一区二区三区| 26uuu最新地址| 婷婷精品在线| 亚洲精品99| 无码区婷婷五月花开| 婷婷六月天亚州| 俺去也在线官网| 天天射夜夜骑| 综合玖玖偷拍| 五月天婷婷丁香花| 国产美女主播vip| 婷婷色在线播放| 婷婷色色欧美| 99热新网址| 美女激情综合| 天花AV无码| 香蕉中文在线| 综合另类视频| 激情综合五月| 久久久久久久久久久久久久人妻视频| 九九视频这里只有精品在线播放| 精品网站:999WWW| 在线中文亚洲| 俺也去在线久久精品23欧美综合视频网站,丰满人妻一区二区三区在线视频53,丰满 | 好激情在线综合网| 激情小说五月欧美亚洲丁香| 久久久久久久久人妻| 大香蕉五月天婷婷丁香91| 91av视频| 美腿丝袜AV天堂网| 色婷婷大香蕉| 日本狠狠爽| 夜夜夜夜夜操| 国产激情av| 激情綜合W W W,激情五月天| 97亚洲婷婷| 91欧美| 亚洲精级| 婷婷五月天综合网| 色色色综合视频| 天天做天天爱天天综合| \\五月天婷婷激情| 色噜噜狠噜噜视频| 中文字幕成人| 国产成人AV| 丁香五月激情月| 97亚洲色 torrent magnet| 国产AV国片偷人妻麻豆| 99热在线中文字幕| 精品视频99看在线视频| 五月天天天操天天爽夜夜操| 99久.| 思思热热久久| 女人被男人吃奶到高潮| 色婷婷丁香AV综合| 激情综合五月开心狠狠| 亚洲五月天婷婷| 丁香五月电影| 国内9l视频自拍老熟女九色| www,setingting| 国产操逼网站| 人妻射精AV| 丁香五月欧美午夜视频| 激情综合网色播五月| 亚洲五月天激情| 91狠狠综合久久久| 免费播放片大片| 色婷婷丁香五月观看| 日日操,夜夜撸| www.五月婷婷.com| 91干网站| 永久思思热在线| 日日干天天| 中文幕无线码中文字蜜桃| 成人免费120分钟啪啪| 亚洲中文字幕在线观看| 五月精品99综合| av在线免费网站 | 丁香五月天日韩无码| 性一交一乱一交A片久| 国产精品91抖高| 久久网婷婷| 天天干狠狠操| 九九热av| 色婷婷五月天在线观看| 99热亚洲精品| 99热10在线高清播放| 夜夜嗨一区二区三区直播内容 | 色综合久网| 天干干夜夜操| 九九aV| 五月丁香六月成人| 五月婷婷婷| 91久久精品国产91性色TV| 日日操夜夜操中国无码| 精品久久婷婷| 色色色色色色网| 五月天色小说| 国产五月丁香在线| 香蕉综合在线| www.射伊蕉婷婷| 可以免费观看的AV| 色色999三级片| 99色热视频| 99久久婷婷国产综合精品草原| 五月婷婷精品视频| 狠狠色激情综合| 久久精品A片777777| 99九九热视频免费| 99热最新网址| 婷婷色在线视频| 久久丁香婷| 26uuu日韩| 丁香八月综合激情| 五月丁香在线婷婷美女| 成人网站免费sxj| 91综合色噜噜| 欧美久久婷婷| 久9热视频| 日本久久性| 大香蕉伊人爱在线| WWW.桔色成人.COM| 五月激情六月综合| 伊人五月综合网| 五月天久久婷婷| 九月av在线| 色丁香五月天婷婷| 久久人操-久草婷婷-成人AV| 91超级碰碰| AV在线大香蕉| 丁香五月性| 激情六月综合| 玖月婷婷爱丁香| 久久性视频| www.十八禁不禁AV.com| 91操片| 强伦轩人妻一区二区电影| 激情小说 五月天| 亚洲AV成人一区二区在线观看| 丁香午月AV中文字幕| 婷婷五月色天| 女同激情久久av久久| 色久综合天天做视频| 91美女被操| 日本色色网| 日本不卡高字幕在线2019| 色播五月综合网| 丁香九月婷婷色| 97碰碰人人视频| 色婷婷导航| 亚洲色色爱| 狠狠五月婷婷| 综合婷婷五月天| 婷婷五月天综合网| 亚洲欧美在线观看| 激情婷婷丁香色五月| 午夜无码熟熟妇丰满人妻| 干亚洲天堂| 婷婷99视频全集高清| 99成人网站| www.第四色99| 久久九区| av九九| 丰满少妇猛烈A片免费看观看| 日日爱678| 在线中文字幕免费视频| 91婷婷色 | 青草青草视频2免费观看| 天天五月丁香五月| 一级黄色片看看| 日韩欧美成人片| 丁香 婷婷五月| 色很久综合| 色综合爱综合| 视频久久9| 大香蕉综合在线| 丁香午夜天| 深爱激情网五月| 99精品综合在线| 深夜男女福利刺激影院一区完整| 玖玖婷婷综合| 久久艹 五月天| 婷五月天| 亚洲色婷婷激情| 任我干视频在线观看| 91精品国产综合久久密臀| 久久六月婷婷| 97碰啪啪| 国产精品人人妻人人爽| 五月丁香婷婷啪啪综合| 午夜天堂啪啪| 五月婷婷网站| 开心五月婷婷激情| 涩丁香| 91狠狠综合久久| 天天干天天做| 欧美久久婷婷| 五月婷婷中字在线| 色五月婷婷五月天激情综合| 色五月天电影| 97深爱伊人综合| 国在线激情网| 91青娱乐青青草| 中文字幕视频色婷婷| 激情五月,激情综合网| 五月婷婷婷| 国内精品99| 成人精品视频99在线观看免费 | 日日艹思思热| 久久精品婷婷| 另类 在线| 99re资源在线视频导航| 天天爱天天狠天天透| 玖玖国产视频一区| 色综合久久88| 伊人激情综合| 9久热精品在线视频| 99热这里只有精品3| 色吧五月| 亚洲无码yw| 另类国产区| 亚洲综合成人网站| 8050一级网| 国产精品美女久久久久AV超清 | 日本一级一级一级一级| 五月丁香龟婷婷| 婷婷伊人激情婷婷| 亚洲成人色五月婷婷综合| 五月婷婷97| 丁香婷婷五月天成人| 久久久久妻| 色五月色图| 婷婷激情视频| 美女久久婷婷| 第四色在线观看| 青草青草视频2免费观看| 五月天婷婷丁香社区| 亚洲中文字幕AV| 日韩超碰在线| 97资源碰碰在线| 亚洲旡码| 丁香无月在线观看| 久久伊人五月天| 色狠狠色| 99r这里只有精品哦| 日韩精品呦呦va| 日本色色影片| 九九99视频精品| 91综合网| 欧美色偷偷大香| 超碰色女| 午夜丁香综合婷婷| 丁香五月婷婷偷拍| 香蕉综合在线| 色99网| 超碰二区| 久久综合丁香五月| 99热福利| 久久久婷丁香五月| 五月丁香狠狠| 丁香六月激情国产| 九热视频在线精品15| 99久久er| 99视频这里有精品| 久草A片| 婷婷丁香色五月| 丰满老熟妇BBBBB搡BBB| 99爱在线免费视频| 亚洲婷婷五月天| 激情人妻蜜夜系列区| 久久久久激情网| 人人看人人摸人人| 激情五月天电影| 五月天综合网| 337p大胆噜噜噜噜噜91Av| 五月丁香六月婷| 桃色五月天| 国产FREESEXVIDEOS性中国| 日本片日本片祼观看网站在线看中文版网页在线看| 六月丁香啪啪| 婷婷五月天国产传媒| 婷婷五月天AV| 99视频在线9| 五月婷婷色综图片| 五月丁香综合啪啪啪啪啪| 中文精品久久久久人妻不| 色丁香五月天| 色六月丁香婷婷狠狠干| 精品网站99| 亚洲狠狠狠| 色五月婷婷色| 精品少妇人妻AV无码专区偷人 | www.婷婷| 91丁香婷婷综合久久欧美| 99亚州综合精品成人网| 人人摸人人操人人爽| 天堂网啪啪| 嫩BBB搡BBBB榛BBBB| 久久婷婷五月天激情新地址| 无码免费人妻A片AAA毛片西瓜| 人人艹艹艹| 9久久婷婷国产综合精品性色| 欧美性爱中文字幕| 婷婷深爱五月天在线| 激情欧美婷五月| www.91在线观看| 色欧美色色色| 丁香五月六月综合激情| 五月天婷婷久久| 天插天啪天啪天啪| 欧美成人va| 亚洲偷| 亚洲午夜精品久久久久久人妖| 轮奸综合网| 日日夜夜久| 国产偷人爽久久久久久老妇APP| 久久久国产精品黄毛片| 激情五月婷婷丁香综合网| 最新日韩久热免费视频看看| 视频久久9| 丁香丝袜五月| 色一情一乱一乱一区91Av| 97色碰| 91热99| www激情婷婷com| 99色在线| 婷婷五月天激情网| 人妻久久久| 亚洲免费综合一区| 99热r| www.99婷婷| 六月色 亚洲| 色婷婷a三区麻| 双性美人被调教到喷水A片| 五月婷婷色在线| 无码色色色色色| 99精品在线观看视频| 婷婷综合五月| 婷婷五月天av| www.黄色片-久久成人国产精品在线播放-999AV | 午夜69成人做爰视频| 91人妻PORNY九色大屁股| 丁香五月影视| 久9热插入| 天天天添天天操| 五月天婷婷基地| 九九九九中文字幕| 丁香六月爱综合| 婷婷精品视频| 久久九九爽| 182TV大香蕉| 久久无意婷婷| 五月婷成人网| 五月丁香综合激情网| 婷婷久久综合| 久久9精品视频| 日本成人噜噜| 色情综合| 99色在线视频观看| 激情久久五月天| 五月婷婷香蕉| www婷婷色情网| 免费黄网不卡AV| 26uuu亚洲欧美另类| 99热成人|