免费国产精品自在自线-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
返回資訊列表
99综合久久| 日韩啊啊啊| 91婷婷五月天嫩女| AV在线免费播放| 一本到不卡高清DVD| 韩国婷婷丁香五月| 五月丁香综合网| 婷婷激情综合无月| 久久探花91swag| 久草五月天| 色色五月丁香婷婷综合| 激情久久五月天| 亚洲在线操| 玖玖综合网| 六月丁香激情综合网| 思思热在线视频精品| 激情综合综合综合| 亚洲av成人一区二区电影在线| 天天操电影院色狼性av| 成人婷99最新| 97亚洲视频在线| 久热精品视频| 99re免费精品视频| 色噜噜丁香| 亚洲激情.com| 五月婷婷六月丁香综合| 午夜成人片400| 欧美性爱5月天天天看| 国产激情一区| 久久丁香| 丁香五月婷中字幕| 婷婷日欧美在线观看| 婷婷五月天Av| 久久黄色片| 色婷婷五月天在线| 狠狠爱综合| 青青青在线视频国产| 精品99在线看| 免费无码毛片一区二区A片| 婷婷丁香五月天狠狠| www.1024久久| 天天综合色| 色综合综合网| 五月天色狠狠| 91热在线观看视频| 丁香六月综合| 激情五月综合| 五月婷婷和六月| 夜色爱爱亚洲| 亚洲色综合| 日日干五月天婷婷| 亚洲色综久久五月| 天天日天天久久青青| 丁香五月伊人| 91一起操| 99热最新网址| 91啦丨九色丨刺激中文| 亚洲色在线观看| 精品成人在线观看| 婷婷五月天成人网站| 丁香五月激情网| 国产婷婷色综合AV蜜臀AV| 99re这里只有精品在线观看| 久久女婷| 久久影视婷婷五月| 五月天激情色色| 色情一区二区播放| 亚州激情网站无码| 丁香五月欧美激情| 日笨久久网| 中文AV网站| 丁香五月天欧美在线| 国产操肏网站| 91 久热| 大香蕉综合网| 精品99在线| 五月人人丁香婷婷五月人人丁香| 亚洲在线操| 岛国在线观看91| se影音资源在线观看| 入口五月婷婷六月香| 伊人激情综合| 国产精产国品一二三在观看| 狠狠综合网| 操骚货在线| 五月天婷婷在线啪啪视频| 好大好粗嗯啊-一级黄色大片免费观看-成人AV | 99在线精品免费视频| 我去色色网五雨天| 九九五月天| 色欲天天综合| 无码橾| 俺去啦综合网| www久热com| 开心久久xxx色| 狠狠爱五月婷婷| AA片在线观看视频在线播放| 久久国产高潮白浆免费观看99| 97人人做| 丁香婷婷色五月天| 婷婷五月天激情网| 五月天小说激情| 99爱精品| 色九月欧美| 六月婷婷无码| 免费视频99| 色婷另类| 婷婷六月丁综合| 182TV亚洲| 色色永久| aa久久| 久久思思热| 婷婷深爱五月| 久久婷婷五月综合色丁香| 五月香婷婷| 丁香五月天av| 色婷六月| 97色 五月天丁香| 97干综合网| 国产精品在线视频| 成人综合伍月天| 九九这里有精品视频| 丁香五月婷婷激情蜜桃| 五月天精品| 久久久噜噜噜www成人| 五月婷婷深深爱| 婷婷五月天777| 79色色色色| 97干网站| 婷婷射丁香| 91ncm视频| 婷婷刺激综合| 久操操| 免费观看亚洲AV片| 99色视频| 亚洲妇女熟BBW| 色五月婷婷在线| 99热66| 亚洲精品一区无码A片| 九九亚洲| 丁香六月婷婷色XXXX| 婷婷的99视频网站| 在线色五月婷婷| 五月婷婷在线免费观看 | 五月婷婷香蕉| 婷婷色影音天| 五月天狠狠网站| 婷婷综合色五月天| 欧美A级成人婬片免费看理论| 精品久久9| 激情综合色五月六月婷婷| 五月天天久久香| 国产美女无遮挡裸体毛片A片| 久久婷婷大香蕉| 激情伊人六| 女婷久久| 亚洲黄色影视| 婷婷亚洲综合| 九九久久五月天| 日本熟女二区| 冬月かえでAV无码播放| 草婷婷在线| 五月婷婷激情| 婷婷五月永远18免费久久久| 一起草性爱不卡视频| 亚洲乱码w在线观看| 久久成人天| 久久这里只有精品16| 深爱婷婷色| 五月天色婷婷伊人网| 亚洲色99| 五月天激情小说| 色三级色三级| 影音先锋一区二区三区| 99在线小视频| 啪啪五月综合| 综合狠狠五月婷婷| 丁香五月六月激情| 色999亚洲人成色| 亚洲成人婷婷| 99婷婷国产最新视频| 看久久性爱视频| 婷婷五月丁香图片人人操| 99热20| 天天综合精品| 激情校园 亚洲| 亚洲精品成人| 亚洲中文丁香| 深爱网深爱综合网| 色亭亭影园| 99热九九在线| 任你操精品免费| 在线观看免费狠狠色丁香香综合| 丁香狠狠色婷婷| 97涩涩丁香五月天| 99久久婷婷五月| 日本在线观看aaa 99| 久久精品9| 79色色免费| 婷婷九月在线| 丁香五月婷中字在线| 99re热在线观看| 五月天婷婷色播综合在线| 538在线精品| 国产日韩欧美性爱| 九八Av| 九九re精品视频在线观看| 26UUU成人网| 五月丁香免费看| 极品人妻VIDEOSSS人妻| 激情五月天www| 五月天婷婷丁香成人网| 开心五月深爱五月| AV在线中文| 色色色色色色综合网| 激情五月丁香社区| 能看的av网站| 玖玖九九9999在线观看视频精品| 五月天综合图片| 色婷婷在线视频观看| 丁香五月大片| 久久综合婷婷五月| 丁香五月av| 五月激情丁香久久综合网| 《亚洲操B久久免费在线观看,亚洲操B久久在线播放》在线播放 - 高清资源 - 97 | 91九色视频在线观看| 亚洲经典三级| 高清激情av在线观看| 成人电影一区| 久9热在线视频| 色狠狠色噜噜AV天堂五区| 久久草中文日韩欧美| 亚洲人人操BD| 玖玖色综合色| 影音先锋 91工厂| 免费黄色片子| 碰超亚洲| 亚洲丁香五月| 伊人99久久| 天天草天天爱| AA丁香综合激情| 久久精品99久久久久久久久| 婷婷五月天在线综合| 夜夜骑夜夜撸| 色玖玖综合| 丁香婷婷深情五月亚洲| 丁香色五月婷婷| 高清无码.com| 综合99久久| 91|疯狂丨高潮丨对白| 婷婷丁香五月婷婷| 色爱终和网| 久久色婷婷| chaopeng在线人人| 第九色区av天堂| 婷婷五月天激情小说| 亚洲色婷婷婷婷人人爽| 99热国产| 噢美99| 91性高潮久久久久久久久| 婷婷丁香人妻| 五月婷婷偷| 91超级碰在线| 第五婷婷伊人丁香| 无码免费人妻A片AAA毛片西瓜| 丁香狠狠色婷婷久久无码视频| 五月丁香美女| 久99| 色综合偷拍| 日日夜夜天天| 五月丁香在线看| 三男玩一女三A片| 激情婷婷五月亚洲| 国色天香成人网| 精品网站99| 婷婷五月色播| 色婷婷丁香AV综合| 国外亚洲成AV人片在线观看| 日本三级大片| 99re在线视频| 久99久视频| 国内裸舞二区| 五月婷A V在线| 日韩无码成人电影| 日本99视频| 日本va欧美va欧美va精品| 五月婷婷之综合激情| 丁香五月天偷拍| 五月色综合| 五月天色综合服务平台| 日韩有码一区| 五月天堂婷婷| 九九热a| 丁香婷婷色| 婷婷终合色图| av线电影| 久久 婷婷 五月天| 高清国产AV| 久久婷婷五月综合啪| 91热久| 99ri视频在线播放| 亚洲婷婷丁香五月在线| 婷婷丁香红五月91C| 夜夜夜夜夜骑撸| 婷婷久久综| 色婷婷免费观看| 操操操操操操婷婷五月天| 国产亚洲色婷婷久久99精品91| 日本综合久久| 亚洲狠狠终合停停终合| 香蕉人在线香蕉人在线 | 九九色video| 亚洲综合五月天婷婷丁香| 激情伊人五月天| 亭亭色天香| 亚洲男人的天堂婷婷色五月| 毛片毛片毛片毛片| 激情综合99| 亚洲综合色棒| www.色婷婷.com| 99人人干| 欧美三级巜人妻互换| 丁香五月天操B| 六月婷婷天堂| 9热视频在线观看| 91丨九色丨国产打屁股| 婷婷五月综合激情| 色婷婷五月综合在线| 色婷婷丁香五月综合| 噜噜色噜噜网| 五月天激情四射| 日本人妻A片成人免费看片| 99视频在线| 中国操逼99| 97碰91| 铁牛TV人妻| 99,色| 我要色综合五月婷婷| 色色永久| 天天爽天天摸天天爱| 激情深爱综合网| 91大神操美女| 中文字幕乱码亚洲精品一区| 91艹人| 一起草av在线观看| 五月综合激情啪啪啪啪啪| 丁香五月网址| www,婷婷五月天,com| 99色.com| 欧美狠狠色| 五月丁香啪啪啪| 97精品综合久久内射| 大香蕉五月婷婷| 婷婷丁香五月天在线| 久久精品4| 国产精品电影网| 综合激情五月丁香| 婷婷基地成人五月天| 婷婷久月| 亚洲无码成人网| 婷婷中文字幕版| 久久久无码精品成人A片小说| 99久久99热| 开心婷婷中文字幕| 婷婷五月色天| 第1影院之五月婷婷| 亚洲激情五月婷婷日日| 9 9热这里有精品| 国产色色网址网站| 婷婷五月天色| 91久久精品无码一区二区三区| 日日干日日| 26uuu丁香婷婷五月| 久久婷婷国产| 99色免费观看全部| 香蕉乱插| 久久久精品色色色| 五月天成人小说| 色色亚洲| AV堂狠狠干| 成年人看Va免费视频| 天天综合在线网| 玖玖玖婷婷婷| 久久婷婷五月综合色和| 亚洲乱码日产精品BD| 国产avapp 网| 九九99精品视频在线观看| 激情 五月 婷婷 丁香| 久热这里只有精品视频免费观看| 婷婷五月天综合在线 | 婷婷丁香综合| 在线视频区| 婷婷九月丁香| 日韩操人| www,天天干| 欧美97色| 99精品自拍| 激情无码网| 狠狠插狠狠插| 99久久综合| 秋霞三及片| 丁香社区婷婷五月| 婷婷五月激情在线视频| 丰满熟女人妻一区二区三| 色婷婷五月天不卡| 久久视频这里有精品99| 夜夜干天天操| 日日操天堂| 99热欧美精品| 丁香五月天堂网| 操逼视频网址| 婷婷丁香色无五月| 久久日曰| 特级西西4444www无码| 精品二区| 99这里是精品| 丁香五月婷婷少妇| 手机激情网| 噜噜色五月| 久久久久久久8| 日婷婷久久开心| 天天视频精品9| 亚洲色综久久五月| 婷婷五月18永久免费视频| 丁香网站| 丁香五月 六月婷婷首页| 婷婷丁香色五月| 丁香婷婷五月人体| 99视频在线精品免费观看2| 97碰精品| 欧美黄色AA片哗啦啦啦| 久久的爱大香蕉| 久色视频| 午夜激情综合| 欧美精品999| 六月丁香基地| 狠狠干五月| 天天干天天叉| 丁香五月婷婷社区| 婷婷五月天狠狠色| 永久无码色| 日韩aaaaa| 丁香香五月激情免费视频| 99精品在线观看| 婷婷爱在线观看| 激情婷婷五月天| 婷婷五月天xxx| 夜夜躁爽日日| 无码人妻少妇色欲AV一区二区| 亚洲另类在线观看| 亚洲视频另类| 97人人干| 色婷婷五月天激情综合| 亚洲综合五月天婷婷丁香| 久久大香蕉| 日本不卡一区二区三区| AVV黄| 日本久久婷| 久久狠狠高潮亚洲精品 天天摸夜夜摸夜夜狠狠摸 | 天堂网色色| 激情五月婷| 91色涩| 日本久久天堂| 六月婷婷综合| 久久精品99国产精品日本 | 丁香五月天堂网| 婷婷五月欧美综合| 久久婷婷网| 五月激情视频网| 久久国产性爱A V| 丁香五月五婷| 五月丁香大香蕉| 99热综合| www.婷婷.com| 五月天大香蕉AV| 天堂婷婷五月在线| http://www.lingjunshare.com/ | 久久性刺激| 丁香五月日啪| 亚洲另类婷婷综合| 欧美精品中文字幕亚洲专区| 91jiuseshunv| 色五月在线| 狼人婷婷综合| 热99色| 女人天堂AV| 色99免费视频中文| 精品一二三区久久AAA片| 丁香五月激情无码视频| 天天人人综合| 九九無妻| 久久丁香婷| 丁香五月香蕉| 天天爱综合网| 99综合97| 日韩黄黄| 人妻性爱av网站| 性欧美大战久久久久久久83| 亚洲高清在线| 激情丁香五月| 玖玖99福利| 激情爱爱网站超大免费| 中文字幕精品无码一区二区| 大香蕉婷婷色| 婷婷另类开心| 日韩操逼大片| 久激情| 天天综合情| 丁香五月先锋| 国产婷婷久久| 免费国产VA国产免费| 99久久综合网| 狠狠操综合| www.久9| 99超超碰| 日日夜夜干| 五月天开心色情网| www.五月丁香| 青青草原福利在线| 色偷偷狠狠| 99久久a线观| 男女99免费视频| 久久 无毛。| 丁香色情五月综合激情| 激情五月婷婷色综合| 欧美成人精品A片免费一区99| 99啪啪视频| 久久五月婷婷丁香| 五月婷婷成人| 五月丁香激情婷婷| 色热久| 丁香五月婷婷影视先锋| 婷婷五月天xxx| 五月婷婷综合在线| 九九热欧美| 五月丁香啪啪综合| 狠狠色狠狠| 婷婷射图| 伊人五月网| 综合色图区| 亚洲成人在线免费| 激情綜合網址| 99日在线视频| 99偷拍视频在线日本| 久久机热探花| 日本色久| 亚洲综合99| 久草大| 9 9 9色色| 精品九九婷婷| 天天肏天天肏天天肏| 国内精品99| 九九视频在线观看视频6 | 国产99久久久国产精品免费看 | 久久久激情视频| 成人片黄网站色大片免费毛片| 毛v一区二区视频| 久久久久9999| 秋霞电影理论| 色五月,com| 艹色18p| 99er久久| 色天堂97| 亚洲色五月| 9 1超碰九色| 婷婷狠狠操| 九九热视频首页/这里只有精品| 天天日天天爽| 亚洲永久免费| 啪啪丁香五月| 婷婷涩五月天综合| 午夜色婷婷| 美女天天爽| 99热精品在这里| 人人草成人视频| 国产毛片欧美毛片久久久| 久久小视频免费| 欧美 色婷婷| 欧美色色色色色| 五月丁香欧美综合| 丁香色五月 97干| 亚洲国产色婷婷| 国产偷人爽久久久久久老妇APP| 五月天婷婷导航| 大香蕉九操| 97成人视频| 久久女人天堂| 婷婷五月天六月丁香| 国产成人+综合亚洲+天堂| 极品人妻VideOssS人妻| 激情网婷婷五月天| 99久热| 99丁香五月| 久婷婷久草| 午夜亚洲AV日韩无码| 久久色情| 超碰日韩人妻在线| 深爱激情婷| 亚洲成人综合在线| 美女久久婷婷| 婷婷六月综合| 国产精品99久久久久久久女警| 婷婷五月天综合中文| 91网站黄| 51精品国自产在线| 狠狠色噜噜狠狠狠狠综合| 99re在线观看| 五月丁香六月婷婷国产视频| 99自拍视频在线| 五月天天丁香婷婷| 异能之下短剧免费观看全集| 青青草伊人婷婷| 996er热| 天天爱天天做天天爽| www激情网| 久久色五月天| 《亚洲操B久久免费在线观看,亚洲操B久久在线播放》在线播放 - 高清资源 - 97 | 亚洲免费99| 婷婷五月天综合久久| 91狠狠色丁香婷婷综合久久精品| WWW·色色色·COM| 99热精品中文字幕| 色区域网站视频| 中文人妻主播久久| 99热手机在线精品| 国产性爱大片久久| 人妻videos人妻高清| 五月天婷婷综合| 精品一二三区久久AAA片 | 婷婷五月大香蕉| 激情丁香五月天图片| 色色色色色色色综合| 丁香六月毛片| se99在线| 9福利性视频欧美| 可以看的av| 激情五月天啪啪视频| 狠狠色噜噜狠狠狠狠综合| 久久久久9| 丁香激情网| 丁香五月天资源网| 久久久婷丁香五月天激情综合| 日本婷婷| 色丁香久综合在线久综合在线观看| 三级片AAA久久久AAA久久久AAA | 99热国内| 男人的天堂五月丁香| 五月天成人免费视频| 97luluse| 色噜噜狠噜噜视频| 五月天婷婷影院| 五月天精品| 婷婷成人视频| 婷婷丁香五月激情综合站_久久五月丁香激情综合_开心五月综合激情综合五月_婷 | 天天干天天干天天干天天干天天干| 90色免费视频| 综合婷婷久久| 99色精品视频| 婷婷亚洲综合| av最新在线| 99re在线播放| 六月婷婷色综合| 97操碰碰无码视频| 久久人人妻| 性色欲情 网站| 9191avse| 狼人伊人天堂| 丁香五月婷婷社区| 大香蕉视频99| 六月 丁香 视频| 五月天激情网图片| 99热 在线播放| 开心婷婷中文字幕| 五月婷婷狠狠干| 国产亚洲精品久久久久久郑州| 无码 色| 久久黄A片| 91精品久久久久久| 九九综合色| 99色在线视频| 91xxxx九色| 丁香久月| 丁香花婷婷五月天| 五月天久久激情| 亚洲色图81p| 九九超日本| 婷婷狠狠18禁久久| 亚洲情欲久久| 亚洲天堂爱爱| 天天爱天天天射AV| 天天色播| 操碰97| 99亚洲天堂| 色婷婷色综合激情91| 婷婷五月天少妇| 4399无码视频| 国产精产国品一二三在观看| 色播婷婷大香蕉| 日韩人妻在线观看| 九九久久网| 99ri在线观看视频| 天天摸日日舔狠狠添婷婷婷| 99re最新地址视频| 色五月婷婷激情综合网| 九九爱这里只有精品| 综合久久丁香婷婷,五月婷婷六月丁香,开心激情综合网,六月丁香在线观看,婷婷丁 | 超碰资源在线| 欧美激情-区二区三区| 91热er| 夜夜爽日日躁| 色欲五月天| 五月开心婷婷极品激情| 婷婷五月天日日日干干干| 久久 视频这里只有精总| 啪啪综合| 亚洲热视频| 人人操91色| 久99热在线观看| 99热精这里只有精品| 97欧美在线| 激情亚洲五月| 99色区| 激情五月婷黄版| 九九99精品| 色婷婷女优有码五月亭| 99re热在线视频| 成人丁香五月天| 99在线精品观看99| 九九色院| 五月婷婷啪啪啪| 九九成人高清视频| 男女99免费视频| 天天插天天插| 国产AV熟妇人震精品一品二区| 天堂美国久久| 国产成人av在线| 6080av| 99热精品在线| 综合色网站| 婷婷五月天激情综合| 九九日本视频| 久久与婷婷| 国产真实乱了老女人视频| 亚洲小视频免费播放| 色婷婷久久综合中文久久一本| chaopengdaxiangjiao| 丁香五月综合激情久久潮喷| 另类小说五月天| 开心久久网婷婷| 丁香五月婷久久| 啪啪综合网| 综合99视频| 可以免费观看的AV| 色婷婷五月天av在线| 91啪啪网| 色五月婷婷小说亚洲中文字幕组| 99久久久久| 伊人丁香五月| 亚洲成人网址在线观看| 亚洲视色| 一本色道久久综合狠狠躁一二三| 亚洲婷婷激情综合激情999精品| 亚洲婷婷欧美婷婷| 国产av第一专区| 强伦轩人妻一区二区电影| 超碰超碰在线| 成人免费超碰| 天堂五月婷婷| 伊人网啪啪| 思思w99| 激情亚洲网| 久久婷婷网| 激情五月综合网| 天天草人人摸| 中文字幕日产A片在线看| 六月亚洲婷婷6月中文字幕| 99乱视频| 狠狠第四色| 日韩在线视频网站| 五月激激网w'w'w| 久久er99热精品一区二区| 久久A区B区| 九97免费视频| 99这里只有精品| 婷婷色五月噜噜| 乱精品一区字幕二区| 亚洲色爱综合| 啪啪操操| 二色av| 直接看的AV网站| 人人操大| 五月天狠狠色| 丁香婷婷五月天校园春色| 九九热在线精品视频| 五月天开心网| 青青草原99热| 99这里只有精品国产| 夜夜爽天天爽| 夜夜爽日日躁| 色99在线| 五月丁香婷婷婷激情爱爱| 自拍偷窥99热| 日日操日日撸| 综合狠狠伊人| 91操在线视频| 无码激情AAAAA片-区区| 丁香婷婷成人网站| 久久综合热17c| 久久98| 变天就操逼婷婷五月| 九月激情网| 亚洲小电影在线观看黄999| av中文网站| 亚洲成av人影院| 色五月无码| 午夜爱爱网站| 久久五月视频| 婷婷九月激情| 日逼影音先锋AV男人资源站| www.激情| 婷婷伊人五月天| 九九久久99| 久婷婷| 色色五月婷| www.国产色| 思思热在线视频精品| 亚洲日日操| 丁香五月在线观看| 日本婷婷| 人妻丰满精品一区二区A片| 91日韩在线| 1024国产在线| www91色网站| 色色影院黄大片| 噜噜色五月| 久久xx| 久久婷婷五月草视频在线播放| 国内婷婷丁香社区在线播放| 色欲五月天| 亚洲激情精品| 丁香激情五月| 人妻人人操| 97操碰人免费| 五月婷婷日本| 九九这里只有精品在线视频| 婷婷丁香水多多视频| av五月天婷婷丁香| 五月婷婷啪啪啪| 久艹久| 99性视频| 婷婷丁香五月天激情| 丁香五月婷婷动漫视频| 97香蕉久久超级碰碰高清版| 婷婷五月综合中文字幕| 99热6这里只有精品| 亚亚州久久高潮| 91婷婷五月天综合视频| 99精品视频免费观看| 婷婷婷久久| 97成人丁香婷婷| 五月婷婷综合精品| 色婷婷影院| 五月丁香 狠狠爱| WWW,激情五月天,COM| 秋霞电影理论| 99热综合网| av操B网站| 开心 五月 综合| 亚洲婷婷欧美婷婷| 97操操| 欧美婷婷九月| 色婷婷欧美在线| 99热新网址| 啪啪视频99| 这里只有精品99视频| 日本五月天婷婷丁香| 国产偷人爽久久久久久老妇APP| 182TV大香蕉| 欧美性爱5月天天天看| 日韩1区2区| 天天肏高清在线| 一本综合丁香日日狠狠色| 六月丁香五月婷婷| 伊人超碰| 超碰高清在线| 一起草日本| 很很干五月天| 国产婷婷色综合AV蜜臀AV| 另类视频综合| a网站免费观看| 色噜噜狠狠色综合无码久久欧美| 夜夜干夜夜操| 91午夜激情| 亚洲精品另类| 淫视馆aV二区一区| 99热资源在线| 91精品婷婷国产综合| 五月天婷婷小说| 久99久视频免费观看| 最新va在线播放| 久久九九中文字幕| 99热这里| 亚洲五月天婷婷| 九九色影院| 久久永久网址| h在线看免费版在线看| 久久婷婷五月草视频在线播放| 亚洲欧美婷婷五月色综合| 怕怕視頻| 人妻熟女一区二区AV| 开心五月激情五月丁香五月婷婷| 婷婷在线中文字幕| 激情五月婷婷丁香综合网| 五月婷婷黄色毛片| 另类综合激情| 99热这里只有精品在线免费| 久久久亚洲精品一区二区三区浴池 | 婷婷综合在线观看视频| 玖玖婷婷综合| 色婷婷五月综合| 婷婷五月天成人基地| 丁香五月电影| 91久久精品国产91性色TV| 天天日天天做天天操| 激情五月丁香色色去久久| 色情五月婷婷| 婷婷综合激情五月综合| 久草五月丁香婷婷综合| www.婷婷.com| 婷婷五月天亚洲精品| 国产精品国产| 婷婷五月花| 丰满人妻一区二区三区| Av狠狠色丁香婷| 91精品视频男人的天堂| 超碰99热| 这里只有精品久久| 日日操夜夜爽天天天| 182.t午在线观看| 久久伊人婷婷| 丁香婷婷久久老熟女综合网| 九九偷拍网| 少妇被下春药玩弄A片| 情趣视频66| 再次出发二| 另类综合国产| 色五月婷婷自拍| 性爱五月丁香| 级人人91| 99精彩视频| 五月色情婷婷| 色五月婷婷五月天激情综合| 伊人久久婷婷| 超碰97干| 色五月在线视频观看| 色狠狠五月天| 五月综合丁| 99年操人人爽| 久久性爱视频网站| 五月婷婷导航| 久久色这里只有精品| 五月天婷婷久久日| 日韩操逼大片| 欧美、日韩、中文、制服、人妻| 激情婷婷五月天| 五月婷婷六月色| 九月av| 97碰碰免费.视频| 全部老头和老太XXXXX| 亚洲乱码日产精品BD| 99无码免费视频| 五月天激情小说| 久爱综合| 色婷婷五月基地在线| 婷婷六月色开 | 99在线观看精品| 狼友视频在线观看18| 免费看欧美成人A片无码| 综合激情五月丁香| 神马欧美精| 五月丁香在线偷拍视频| 97操碰视频| 久久欧洲久久| 国产暴力强伦轩1区二区小说| 婷婷六月激情啪啪| 天天综合网在线| 99九九在线精品热动漫| 亚州色婷婷| 91九九| 色婷婷五月天成人网| 色婷婷yy久| 成人av免费观看| 天天舔天天摸天天射| 思思热再线视频| 99热8| 99视频91| 日韩色色小视频| 欧美成人精品A片免费一区99| 欧美激情五月| 五月丁香啪啪综合| 五月丁香六月婷婷综合网站 | 播四月婷婷六月丁香| 五月激情丁香| 激情五月天 婷婷| 色色色色av色色色色| 色播五月综合网| 久久久精品免费啪啪国| 丁香婷婷六月激情文学| 丁香九月色| 色婷婷五月综合在线| 色婷丨日丨天丨综合久久| 天天综合 99久久婷婷| 成人超碰网| 五月丁香| XX久久| 综合六月激情婷婷| 亚洲国产精品五月天| 怡春院久操| 婷婷亚洲在线| 国产成人精品一区二三区熟女在线 | 久久视频这里99| 乱女乱妇熟女熟妇综合网站| 97久人人| 色婷婷啪啪| 欧美叉叉叉BBB网站| 操一区| 色情丁香五月婷婷精品| 五月丁香六月婷婷视频| 色婷婷五月天成人网| 婷婷伊人綜合中文字幕| 久久婷婷夜| 99色免费在线观看| 大香蕉综合视频在线| 婷婷色色五月天| 啪啪一区| 日韩在线视频中文字幕| 激情久久丁香| 婷婷五月综合视频免费播放| 婷婷五月天亚洲图片| 六月丁香基地| 日本久久网| 午夜丁香| 色伊人啪| 九九热大香蕉| 日日操夜夜操无码免费| 亚洲成人AV在线| 97操碰在线97| 五月激情综合婷婷| 婷婷亚洲在线| 成人在线二区| 丁香六月婷婷色XXXX| 免费看欧美成人A片无码| 色色色五月婷婷| 亚洲综合五月天婷婷丁香| 色色com| 在线只有精品| 无码区婷婷五月花开| 狠狠狠狠狠狠| 久久五月丁香| 色综合色| 9久久婷婷国产综合精品性色| 操骚货在线| 色爱综合网| 激情中文在线| 久操人妻| 79精品视频在线观看,| 五月婷激情影院| 久大香蕉| 琪琪色五月天| 婷婷丁香18| 任你搞网站| 欧美大香蕉视频| www.婷婷六月天| 久热一本| 亚洲激情在线| 日韩aaaaa| 国产精品99久久久久久久女警| 久久精品99国产精品日本| 久爱综合| 在线不卡的视频| 91精品又长又大又粗又爽又猛| 五月丁香激情综合| 婷婷成人AV| 色99视频| CHINESE熟女老女人HD视频| 久久久宗合| 久久婷婷亚洲无码一起| 五月丁香AV、伊人业余、性色熟妇| 天天人人综合| 色狠狠综合| 色狠狠五月天| 婷婷五月丁香狠狠| 婷婷五月天另类网站| 天天舔天天操| 五月天婷婷成人资源站| 五月丁香免费看| 在线看黄色| 就爱射中文字幕资源网| 九九这里只有精品| 色五月婷婷天堂| 西瓜美女a片| www.婷婷五月| 91打屁股视频网站| 天天干天天射色综合| 国产午夜精品AV一区二区麻豆| 射琪琪| 久狠日av| AV成人在线网站| 五月花成人网| 亚洲天堂色色| 久99久视频| 99综合网| www:99热视频| 深爱激情网综合| 婷婷色色综合| 久久狠色噜噜狠狠狠狠97| www婷婷| 天天色播| 激情久久久久久| 97资源碰碰在线| 丁香五月在线播放| 丁香九色不卡aaa| 九九爱激情| 久久久久久久,99精品视频| 亚洲色vA| 91|疯狂丨高潮丨对白| 丁香五月大片| 久久丁香五月| 色10月婷婷视频| www.99色| 天天性视频| 色停停香蕉视频| 天天噜日日噜综合无码| 激情五月婷| 五月婷婷色播| 狠狠爱激情网| 人人人操| 超碰97干| 日本久久婷婷| 亚洲AV综合网| 在线看片av| 九九色影视| 五月婷婷免费在线| 天天婷婷综合亚洲亚洲| 狠狠色婷婷7| 国产激情视频在线观看| 亚洲色激婷| 婷婷五月天在线观看| 婷婷久久免费看| 夜精品无码A片一区二区蜜桃| 婷婷色系婷色| 91久久久久久久久久18| av免费人人| 亚洲天堂青草| 五月欧美丁香在线观看| 色五月婷婷五月天激情综合| 狠狠爱婷婷| 91精品无码| 五月婷婷啪啪| 日韩黄黄| 丁香色婷婷色手机免费在线| 色婷五月| 激情婷婷99| 99re这里只有| 99re视频在线播放| 久久视频这里有精品99| 欧美色骚婷婷五月天| 风流少妇A片一区二区蜜桃| www五月天激情com| 操逼综合网| 91大神操美女| 五月婷婷丁香啪啪| 精品人妻午夜一区二区三区四区| 亚洲色欲AAAAAA| 五月天婷婷涩涩| 亚洲啪啪网| 九玖视频这里只有精品| 欧美激情综合色综合啪啪五月| 婷婷五月天另类网站| 狠狠综合色网| 夜夜夜夜夜操| 狠狠色性| 日韩AV在线免费| 亚洲99热| 97久久久久| 97综合在线| 久久久区区一久久久久久| 色婷婷最新域名| 激情五月综合色| 婷婷五月激情黄色| 婷婷六月丁| 日本片日本片祼观看网站在线看中文版网页在线看| 婷婷五月天色播| 另类视频丁香五月| 色www.con| 91操操| 人妻久久久久久久久妻久久久久| 99re久热| 日本欧美在线| 久久五月丁香激情综合| 97香蕉人人在线观看| 五月大香蕉| 久久婷婷在线| 另类激情五| 麻豆WWWCOM内射软件| 天天成人丁香美女AV| 99精品一二三四视频| 九九精品视频免费在线| 4399无码视频| 久久99热这里只频精品6学生| 色视频2025| 玖玖婷婷五月天毛片| 色爱综合网| 五月欧美色色五月| 久久免费操| 亚洲九N| 激情99热| 五月天婷婷开心| 色婷婷狠| 极品人妻VIDEOSSS人妻| 亚洲操b| 激情5月舔| 五月婷久久综合| 丁香五月综合| 色婷婷六月丁香综合欲精品| 99热情这里只有精品在线播放| www.婷婷激情网.com| 99在线小视频| 中文字幕色色| 天天色天天色天天色天天色天天色天天色| 国产操逼视频网站| 久久久免费精彩视频| 激情综合网五月激情网| 最新日本A片| 色综合香蕉| 精品无码久久久久久久久| 一月婷婷色色| 伊人婷婷五月| 天天曰夜夜爽| 激情六月婷婷啪啪| 26uuu国产| 久久玖玖综合| 99亚洲大片精品永久在线观看| 热久久91| 激情性爱婷婷| 国产欧美日韩综合精品一区二区| 婷婷激情社区| 色亚洲婷婷| 激情婷婷| 91亚洲免费片| 亚洲av| 久久性爱视频网站| 噜噜噜久久| 亚洲国产精品综合色区| 激情五月图| 色婷婷久久综合| 午夜av网| 99在线视频操999| 五月婷婷色播| 久久五月激情综合| 99热精品9| 夜夜骑日日操| 超碰碰碰碰| 182TV大香蕉| 狠爱婷色| 99五月香婷婷丁香在线视频|