99精品久久精品一区二区-亚洲熟妇无码?v在线播放-日本国产精品无码字幕在线观看-久久久亚洲永夜AV-亚洲一级无码一区二区一-免费国产成高清人在线视频-中文字幕乱码免费观看-国产毛片精品妇女久久久

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
返回資訊列表
久碰婷婷视频| 久草大| 色婷五月| 97人人超| 国产乱人偷精品人妻A片| 天天艹天天综合网| 爱99干99| 色婷五月天| 卡视频1区2区| AV性爱在线| 天天综合激情| 任我肏视频精品| 色小说五月婷婷| 久久激情视频| 日韩色情亚洲五月天婷婷| 逼特逼在线免费播放| www五月天激情com| 日本a片网址| 婷婷五月影院| 婷婷五月天国产| 9久久网| 9久久婷婷国产综合精品性色| 色婷婷伊人| 婷婷久久网| 天天色综合综合| 丁香婷婷六月激情文学 | www夜夜操comwww| 婷婷五月激情小说| 99只有精品| 六月丁香婷婷开心综合基地| 久热人妻| 婷婷五月天最新综合你懂的 | 超碰成人av| 久热最新视频| AAA亚洲AV| 成人婷婷色五月天| 五月丁香久| 99久热| 五月婷婷开心六月激情小说| 涩五月丁香| 991国产精选视频在线播放下载| 五月丁香成人网| 免费亚洲婷婷五月| 99.色| 这里只有精品视频视频在线观看| 色欧美影院| 久热大香蕉| 亚洲99热| 色婷婷五月亚洲| 激情小说五月天社区丁香| 欧美日韩国产伦精品日韩人妻一| 97操碰视频| 丁香婷婷天堂| 色伦专区97中文字幕| 久久99热这里只有精品 | 九九热99精品| 五月六月丁香激情| 99爱无码| Www.激情| 99热这里有精力| 丁香五月日本| 丁香五月婷婷丫| 黑人无码一区| 五月天之色情综合网| 热婷婷在线视频| 三男玩一女三A片| 99热这里有精品| 五月天偷拍| 婷婷丁香六月天| 五月丁香婷婷婷激情爱爱| 狠狠人人| 就爱啪啪婷婷| 色婷婷精品视频| 色噜噜97视频在线观看| 91丁香五月| 久久久久婷婷| 五月丁香啪啪网| 天天弄天天操| 精品九九网| 99久99久| 欧美成人日韩| 九色视频91| 五月婷婷六月激情在线| 五月天五月婷五月激情网| 开心五月婷婷在线视频免费观看| 五月天开心网| 中文成人在线| 超碰激情五月| 99热九九这里只有精品10| 91久久久久久| 日韩六六久久电影| 色玖玖爱| 丁香激情五月天| 国产精品一区在线观看你懂的| 2050人人操免费工开爱| 国精产品一区二区三区| 九九成人高清视频| 9久久婷婷国产综合精品性色| 丁香激情五月天| 亚洲AV久久久久久久久久久久久久久久 | 97干在线看| 色九网| 天堂五月婷婷| 色激情五月| 五月婷中文字幕| 狠狠色噜噜狠| 九色无码| 婷婷激情五月天小说| 九九机热| 国产成人精品一区二三区熟女在线| 九九久久色| 天堂在线观看视频| 九九九九九无码| 综合网天天| 99在线精品观看99| 激情亭亭五月| 五月 丁香 欧美| 久久婷婷视频| 天堂网操| 国产三级秋霞| 五月激情久久| 丁香五月丐人妻| 五月天色导航| 97人人做| www.金莲av| 色婷婷99| www天天色天天射| 五月丁香综合啪啪| 99re视频在线播放| 91九色丨国产丨爆乳| 丁香伊人五月色婷婷五十路| 午夜婷婷丁香| 五月天婷婷色色| 国产成人精品亚洲线观看| 国产色网站| 激情另类综合| 色久女| 99免费偷拍视频| 五月天色婷婷基地| 97色五月丁香婷婷| 久久99综合| 操一区| 成人版视频在线观看| 久久综合激情婷婷激情| 婷婷五月综合色中文字幕| 五月婷婷花| 亚洲操操操| 久久97| 青青草轻轻操| 26uuu视频欧美| 久久伊人9| 激情婷婷视频在线| 婷婷五月天综合色| 婷婷天天五月天| 丁香五月停停av| 江苏少妇性BBB搡BBB爽爽爽| 性99网站| 亚洲午夜电影| 色婷婷丁香| 婷婷五月天精品| 色综合99| a色色色色色| 97天堂| 色情综合| 99热66| 久热这里只有国产| 欧美情色一区| 色婷婷a v| 97AV在线视频| 91超碰人人操| 欧美猛片| 色色97丁香婷婷五月天| 日本99在线视频| 成人欧美日韩| 日韩av手机在线观看| 毛片新网地| 羞羞嫩草视频| 久婷婷| 久热这里只有精品3| 女人天堂AV| 色天天狠狠干| 影音先锋毛片网站| 91久久精品国产91性色TV| 激情婷婷五月基地| 激情五月天久久丁香| 精品一二三区久久AAA片| 人人天堂操| 免费黄色片子| 激情五月六月婷婷| 婷婷综合偷拍| 99精品在线播放| 大陆肏屄视频| ss五月天激情| 丁香五月天.com| 狠狠狠狠狠狠| 九九热99精品| 黄色aaaaa| 欧洲电影在线观看免费版英语版 | 玖玖五月| 色婷婷久久综合| 国产精品久久久久久久久久免费| 五月开心深深爱激情综合| 国产精品成人网站| 久久性爱网| 国产精品色婷婷久久久精品| 国产精品久久久丁香五月八戒视频| 欧美毛卡| 色欲久久99精品久久久久久| 久色激情| 香蕉AV777XXX色综合一区| 久久久人妻人伦| 精品综合网在线| 99在线精品观看99| 天天日天天插| 久久99最新| 在线观看欧美| 久久婷婷电影| 五月丁香色停停啪啪啪| 综合激情五月天| 五月婷婷香| 久热这里这里有精品| 操操熟女| 丁香婷婷五月天成人| 五月丁香六月激情欧美综合| 丁香五月丁香伊人| 天天操婷婷| 亚洲激情四射色| 婷婷丁香97| 日本熟女内射| 婷婷激情网五月天| 色色色色色色97| 亚洲欧美成人在线| 影音先锋四区| 九九色色网| 亚洲丁香花色| 婷婷久久五月天| 五月天婷婷成人网| 五月丁香六月婷婷色日| 99无吗| 九九草热在线观看| 丁香六月天婷婷色| 99ri在线观看视频| 精品在线网站| 婷婷五月激情网站| 婷婷五月天成人动漫 | 99婷婷| 99网99热| 射区导航| 亚洲色网络| 久久精品9| 色婷婷丁香| 综合五月激情网| www.婷婷,com| 五月草影视| www.五月天。com| 99久久国产成人精品| 99热99ai| 岛国av电影网站| 九九热短视频在线观看 | 国产午夜一区二区三区| 九九热免费| 久99综合婷婷| 五月丁香综合| 停停色综合伊人| 五月婷婷激情日本| 欧美精品999| 99热这里只有精品1025| 丁香五月综合婷婷| 婷婷激情丁香五月天综合| 五月综合色| 丁香五月天啪啪| 婷婷五月天色| www.五月丁香av| 91精品综合久久久久久五月丁香| 啪色综合| 婷婷五月天成人网| 国产欧美大香蕉一区| 99热色综合| 冬月かえでAV无码播放| 大香蕉啪啪啪| 亚洲婷婷婷| 五月天激情视频五月天| 激情久久肏屄视频| 久久AAAA片一区二区| 五月天开心色色网| 大香蕉操操| 99九九久久| 色婷婷AⅤ| 激情丁香六月| 热热久久久久久久久| 夜夜做夜夜愛| 久热婷婷| 91九色 熟| 91精品婷婷国产综合| 成人短视频在线免费观看| 婷婷六月天天| 国产欧美精品AAAAAA片| 日本久久视频| 激情五月天小说视频| 色五月AV| 婷婷综合视频| 国产日韩av片| 婷婷射图五月天| 久久久五月五丁香| 五月婷婷综合激情小说| 开心五月激情网| 婷婷五月综合在线视频| 丁香五月天堂网| 色伊人91在线视频| 五月激情视频| 99视频在线精品| 九九久久精品| 97在线精品视频| 久久九九99亚洲国产久精综合| 婷婷的色色五月天| 青青色com久久| 天天搽天天射| 六月五月婷婷| 99久久久99久久91熟女| 91精品91久久久中77777久久玖玖九九 | 婷婷五月丁香综合瑟瑟| 高潮毛片遮挡费高一百度| 99re热视频这里只精品5| 欧洲亚洲精品| 黄网网站在线播放| 狠狠色丁香婷婷久久综合| 99国产精品白浆在线观看免费| 九九热精品视频| 久久精品99| 九九综合网色全集 | 日日爱激情| 开心激情婷婷| 久久ab| 97人人操人人拍| 五月丁香va| 99综合久久| 99性爱视频| 久久在线大香蕉| www.热99热| 五月婷六月| 九九色大香蕉| 9久国产| 97丁香视频| 五月丁香久久激情网| 婷婷五月激情小说| 色狠狠五月天| 99热综合| 91精品熟女| 天天干狠狠| 情色婷婷五月天| 婷婷五月天堂| 97碰碰电影| 五月婷婷六月丁香综合| 久热爱大香蕉在线蜜臀悦色 | 综合久久五月| 婷婷五月天激情文学| 中文字幕不卡网站| 婷婷深爱五月丁香| 99人人操人人爱久久久| 日本九九视频| 99热国产精品| 日本久久99| 99色区| 五月天啪啪啪| 婷婷深爱色五月| 欧美激情性做爰免费视频| 色久播播| 大香蕉久久视频久久视频 | 成人av免费观看| 九九热这里只有精品5| 亚洲中文乱字字幕在线永久| 五月天婷婷色色| 俺也去在线久久精品23欧美综合视频网站,丰满人妻一区二区三区在线视频53,丰满 | 亚洲婷婷六月天| 亚洲国产无线乱码在线观看| 五月天色视频| 香蕉97碰碰碰超视精品| 色中色综合| 五月婷婷新网站| 色一情一乱一乱一区91Av| 五月丁香五月激情综合色综合| 成人综合网站| 性爱视频99| 超碰99热精品| 狠狠做深爱婷婷久久综合一区| 97人人干。| 日本狠狠干| 色综合久久99色| www.99热| 激情五月天伊人av| 91操熟女| 69热91天堂| 五月婷婷开心网| 欧日韩成人| 男女啪啪做爰高潮无遮挡| 色五月六月婷婷| 97五月综合网| 欧美日本日韩| 国产97色在线| 五月天激情久色| 久久最新色| www.99在线| 怡红院视频| 日韩欧美一级大黄网站| 91女人18毛片水多国产| 五月天婷婷色色| 久久久人人人妻丝丝丝| 九九九九国产| 色99超碰| 五月天久久色| 久久99久久99久久99人受| 激情小说五月天中文字幕| 九九Y精品热播| 婷婷金品综合视频| 天天操人人干| 六月丁香深深爱| 亚洲乱码w在线观看| 91操人| 久久久人妻| 色亚洲婷婷| 久99久精品视频| 一区二区三区四日本| 五月综合激情| 色XX综合网| 色婷婷色五月另类综合| 色婷婷激情四射视频| 伊人综合网站| 六月丁香激情网| 九九热这里只有精品31| 五月天天丁香婷婷在线中| 男人天堂 久久| 国外亚洲成AV人片在线观看| 久久免片| 亚洲成人一区| 丁香五月激情五月| 99九九精品| va婷婷在线| 婷婷五月电影院| 亚洲日本三级片| 综合五月婷婷| 天天操天天操天天操天天操天天操| 激情丁香五月天| 六月丁香五月激情网| 色五月激情网| 日本三级中国三级99| 激情婷婷黄色五月| 在线一起草av| 97超碰色| 加勒比久热| 91在线操逼视频| 色情婷婷| 国产AV一区二区三区最新精品| 久久久久人妻网址| 超碰在线91| www.婷婷六月天| 婷婷五月天激情诱惑| 久久在线人妻| 婷婷综合爱| 97资源碰碰| 97干婷婷| 成人网址在线观看| 丁香五月天无码AV| 久久九九免费大视频| 丁香五月天无码AV| tingtingjiqingwuyue| 激情综合五月激情XXXX| 亚州欧美国产久精国产99综合视频| 伊人干综合| 九色91国产| 在线观看的av| 亚洲九九免费| 久色网五月| 日本va视频| 丁香五月精品| 久色大| 中文字幕,综合,91| 五月色丁香| 五月丁香综合激情| 丁香五月天堂网| 内射干少妇亚洲69XXX| 久在线88综合| 综合爱久久| 97色97干| 婷婷深爱色五月| AV天堂婷婷五月天| 久久女人九九| 曰曰久久| 天天日夜夜夜操操操操| 免费观看的婷婷五月视频在线| 国产亚洲色婷婷久久99精品91| 91色逼| 97热这里只有精品| 黄急一级视频| 大香蕉99| 五月婷婷色情| 五月婷婷激情网| 综合色久| 亚洲成人av在线观看| 九九人人自拍| 午夜美女人啪最红院| 天天 青草 丝袜制服 在线| 99无吗| 久久九色| www91色网站| 婷婷五月天黄色网址| 91欧美| 天天综合图片| 91九色精品女同系列| 激情五月婷| 人人97操| 成人网站免费sxj| 色五月婷婷在线| 97综合在线| 九九热99在线视频| 亚洲第一色色色| 日本五月天婷婷丁香| 日本五月婷婷| 密视AV综合在线| 激情5月舔| 婷婷五月天电影区小说区| 天天日天天摸| 91精品综合久久婷婷九色| 十月丁香婷婷| 久久激情视频| 亚洲综合另类| 丁香六月无码播放| 五月婷婷激情综合| 久久综合干| 六月丁香婷婷六月激情综合| 爱射综合| 亚洲av成人在线| 日日操天天| 五月香婷婷| 大香蕉五月天婷婷丁香91| 六月丁香五月激情网| 色欲久久综合| 97干在线观看| 天天综合在线网| 白人荫道BBWBBB大荫道| 99色色热热| 久色| 婷婷五月激情五月丁香五月| 婷婷五月天天aV| 五月天婷婷基地| 九九这里是免费的视频5| 婷婷五月天日本无码| 久久久GOGO无码啪啪艺术| 久久久久9| 免费观看大片视频 丁香婷婷 六月欧美| 成人在线观看精品| 欧美毛片www| 色播五月天激情| 日本精品99| 久久久人妻| 人人干人人操外国| 色欲一二三| 开心五月婷婷伊人| 五月天亚洲图片婷婷| 久热99热| 激情久久五月天| 五月天综合激情网| 97香蕉久久超级碰碰高清版 | 综合网啪啪| www.99热在线| 97在线精品视频| 99综合自拍| 婷婷五月在线视频| 久草五月婷婷| 亚洲av骚货| 久久五月天色婷婷| 久久思思热| 亚洲色情免费网| 五月天伊人| 激情婷婷亚洲五月| 丁香婷婷欧美综合| 天天色一道本综合婷婷| 嫩草AV久久伊人妇女超级A| 日本五月婷婷久久久六月丁香| 激情第四色| 99视频精品视频| 无码少妇高潮喷水A片免费| 久久久97| 久草热8精品视频在线观看| 天天干天天 亚洲| 丁香婷婷浪潮AV久久综合| 五月丁香龟婷婷| 国产小网站| 毛片新网地| 开心六月婷| 成人无码髙潮喷水A片| 天天综合亚洲综合| 日本色色影院| av九九| 精品视频99看在线视频| 日韩五月婷婷久久| 天天综合网91| 啄木鸟黑丝一区二区| 久久婷婷五月天丁香| 成人va视频| YJLZZJLZZ亚洲乱熟无码| 色99视频| 草逼大片| 天天爱天天做天天日| 色五月激情五月| 开心激情网五月天| 五月婷婷丁香成人网| 激情综合网激情五月俺也去| 亚洲免费99| 色狠狠伊人久久五月丁香| www99xxxx五月丁| 97干在线| 开心激情播播五月天| 亚洲av成人在线| www免费在线视频| 91久久色| 亚州日本欧州韩美高青高潮一| 操人精品| 天堂成人A片永久免费网站| www,99热| 欧美久久五月婷婷| 99久在线观看| 婷婷色资源| 99无码视频| 五月丁香激情六月| 天天人人综合| 99丁香五月婷婷在线| 超碰人人在线| 九色PORNY自拍成人精彩视频| 天天干夜夜b| 日本高清久| 97成人操| AA片在线观看视频在线播放| 婷婷激情在线| 五月丁香六月激情综合欧美| 99热这只有| 伊久久婷婷| 丁香花综合永久入口| 五月天狠狠| 婷婷五月天社区| 色久免费| 色婷五月天亚洲| 大香蕉99热| 欧美碰碰| 日本97在线观看| 无码人妻少妇色欲AV一区二区 | 激情五月丁香综合网站| 亚洲综合丁香五月| 激情综合网之激情五月| www.99在线| 日韩精品成人在线| 天天网曰日曰夜夜综合永久免费| 亚洲操女| 99爱操| 国产精品人成A片一区二区| 欧美在线视频99| 丁香久久五月婷综合| 丁香五月六月婷婷怡红院| WWW、日本色丁香、co m| www.激情.com.| 五月婷婷色色色| 中文字幕精品在线观看| 激情啪啪五月天| 色综啪啪| 婷婷五月天大香蕉在线视频观看| av免费在线观看0| 成人精品视频99在线观看免费| 久久激情五月| 另类图片五月天| 婷婷久久大香蕉| 色色色99| 亚洲国产精品SUV| 天天日天天色| 亚洲亚洲人成综合网络| 99久久99综合| 国内精品99| 久久综合图片| 超碰色女| 超碰在线人人| 新99思思视频| 天天操天天日天天爽| 亚洲久久婷婷| 五月丁香免费看| 成人在线99| 99热在线观看精品| 91丨九色丨43老版熟女| 精品国产一区二区三区四区阿崩| 99干日日干| 久热A片| 99色免费| 六月丁香久久| 色插综合网| 日本操逼九九九九58日本操逼| 九九这里都是精品| 日韩成人AV在线| 六月激情网| 色呦精品| 日韩黄色电影| 天天综合色丁香| 久久人妻系列| 丁香五月开心亚洲| 狠狠五月天| 99热黄| 五月天婷婷网站888| 狠狠色噜噜狠狠色噜噜噜999| 伊人六月丁香婷婷| 人人摸人人干| 91超级碰在线| 米奇影视五月天| 婷婷午夜天| 亚洲精品V天堂中文字幕| 激情婷婷22月间| 久久久大香蕉| 色丁香久综合在线久综合在线观看| 日日夜夜狠狠操| 激情五月综合网| 亚洲三A| 狠狠99| 久久午夜理论| 丁香伊人网| 日韩综合成人| 婷婷激情九月| 婷婷丁香五月噜噜噜| www.婷婷五月天| 国产性爱在线| 超碰免费成人| 久久婷婷五月综合色丁香| 香蕉综合在线| 91碰操| 五月亭亭六月色| 婷婷五月丁香在线视频| 丁香六月婷婷| 色综合久久99色| 丁香激激情网| 亚洲AV免费在线| A级毛片高清免费不卡播放谢谢谢谢| 久久婷婷六月| 玖玖爱综合网| 91精品久| 热99只有精品| 综合色99| 67194成I人在线观看线路1| 色99欧洲色19| 国产国产乱老熟女视频网站97| 91打屁股视频网站| 九九精品视频在线观看| 国产精品A成V人在线播放 | 天天做天天爱天天摸| www.天天干| 免费色婷婷| 婷婷五月天,影院| 久久伊人五月天| 精品九九网| 丁香六月天之亚州热女| 成人午夜天| 色色五月婷婷| 99ri精品| 久久婷.com| www.婷婷五月天| 久热精彩视频98| 欧美综合激情五月| 少妇性BBB搡BBB爽爽爽视頻| 久久精品爱爱| 99热精品免费| 思思热天天看| 五月激情六月综合| 婷色五月| 色色五月天激情| 婷婷激情在线| 另类激情综合| 亚洲六月婷婷| 五月丁香 啪啪| 香蕉操亚洲| 超碰男人色| 婷婷五月天丁香社区| 婷婷五月综合体验看| 免费操超碰| 五月天天爽| 强奸幻女毛片| 日日爽日日| 熟美女麻豆| www.激情五月| 91综合色| 伊人五月天在线| 五月天无码| 五月婷婷综合激情| 六月婷伊人| 亚洲偷| 丁香五月无码| 亚洲狠狠婷婷| 99碰超| 激情五月天婷婷激情| 亚洲色五月| 五月丁香成人| 婷婷五月丁香国产| 婷婷激情综合| 超碰av在线| 丁香五月婷婷色| 五月婷婷六月激情网| 丁香五月婷婷香| 草综合14| 婷婷九月丁香| 全部老头和老太XXXXX| 66精品成人免费网站在线观看| 禁片二区| 九九色人| 婷婷丁香五月精品| 91a片爽| 亚洲顶级VA在线观看-高清完整版在线影院观看-S022AV | 97热精品| 五月天大香蕉| 俺也去在线视频| 超碰93在线观看| 中文字幕在线日亚州9| 婷婷九月丁香久久| 久久久久久久久久91| 六月激情网| 丁香婷婷视频一区二区| 插逼综合网| 双性美人被调教到喷水A片| 亭亭五月色男人| 日本色色图| 610018岁成人视频| 久久精品系列| 丁香六月天婷婷在线| 百度一下国产精品A| 99九九精品视频| 九九在线免费观看| 欧美性久| 色爽干| 久久婷婷网站| 亚洲色综久久五月| 91九色精品女同系列| 牛色色碰| 99操碰| 五月婷婷丁香狠狠撸久久| 91精品久久久久久77777| 欧美午夜乱妇午夜福利| 久大香蕉| 伊人色欲五月天| 欧美日综合| 97涩婷婷婷婷基地| 99自拍视频| 亚洲人成色A777777在线观看| 99这里只有免费的小视频在线观看| 国产三级在线播放| 日本狠狠干| 色婷婷免费观看| 久久精品亚洲热| 日本本土色网第一区| 97超级碰碰碰| AV网在线| 婷婷伊人綜合中文字幕小说| 久9免费视频| 成 人 色 色| 99热视| 久操热| 91人碰| 9热超碰| 99久久久99久久91熟女| 香蕉操亚洲| 激情婷婷五月社区| 99在线国| 丁香五月婷婷动漫| 亚洲激情在线| 久久久久久久久久91| 五月婷婷激情在线| 国产片XXXXA片国语对白| 在线99热| 日韩 中文 欧美| 亚洲国产99| 99操逼| 五月天欧美激情| 天天激情夜夜干| 久久草人妻| 五月丁香激情综合| 97碰久久| 五月丁香亭亭操逼| 狠狠色色综合| 特级操b片| 99热资源在线| 五月激情综合性爱| 九九久久污| 久操大屁股女人av| 婷婷色基地在线看 | 激情又色又爽又黄的A片 | a网站免费观看| 91九色在线| 成人av中文字幕| 丁香五月色色| 色婷久久| 丁香五月天偷拍| 天天噜天天插| 99re这里只有精品国产99| 成人五月天在线观看| 欧美激情综合| 六月丁香啪| 99re思思在线视频| 精品无码人妻一区| 久久机只有这里精品| 天天日天天操天天干| 婷婷五月天亚洲精品| 色丁香五月综合网| 天天爽免费视频| 99re思思热久久| 夜夜躁爽日日| 玖玖无码中文| 丁香六月啪| 精品国产一区二区三区四区阿崩 | 久久婷婷东京热大香樵| 九九色院| 丁香五月天AV在线| 五月婷婷天天色| 色欲资源网| 深爱婷婷丁香五月激情| 亭亭玉月丁香| 精品久久99码| 日本欧美成人片AAAA| 激情五月婷婷综合秋霞| 婷婷五月激情视频网| 青青草色在线视频观看| 九九视频免费| 婷婷五月激情欧美大胆视频| 五月丁香中文| 中文av网站| 久久婷婷五月天激情新地址| 丁香伊人五月色婷婷五十路| 久久刺激网| 天天做天天爰天天爽天天无遮挡| 色婷婷五月天不卡| 中文字幕AV在线播放| 久久五月综合| 一片AV片免费播放| 综合激情在线| 色必久悠悠影院| 欧美VA在线| 99久热这里只有精品| 91打屁股免费看| 久久久久久久久久久44| 99热乎| 天天色激情| 五月天社区| 色香蕉婷婷| 六月婷欧美| 国产日日夜夜操| 天天干天天做| 国产69精品久久久久999小说| www.精品久9| 亚洲色色图片| 性色五月天| 亚洲V国产V欧美V久久久久久| 人妻在线网站| 干婷婷五月天| 五月丁香六月成人| 我淫我色婷婷五月天激情四射| 玖玖99免费视频| 婷婷射图五月天| 91久操| 日日噜噜久久婷婷五月天| 色五月xxx| 五月丁香色婷婷| 六月婷婷综合| 欧美大香蕉视频| 国产精品成人av在线观看春天| 99热国产这里只有精品| 日本少妇AA一级特黄大片| 五月丁香婷婷激情在线视频| 色色色在线观看| 另类婷婷五月天啪帕帕| 丁香激情五月综合网| 婷婷午夜精品久久久| 狼人伊人干| a v色婷婷| 婷婷六月久久综合导航| 丁香六月色| 少妇人妻凹凸视频| 婷婷久久综合久| 午夜激情综合| 99激情视频| 久久精品熟女亚洲AV麻豆| 狠狠干天天内射| 亚洲国产成人在线| 日韩xx在线| 狠狠插狠狠| 国产精品a无线| 色婷婷丁香网| 九九综合九九| 色色九九五月天 | 人人视频人人干人人做| 激情五月成年| 五月婷婷久久爱| 国产激情久久| 五月天日日操夜夜操| 五月天丁香网站| 色狠狠综合入口| 青草五月天| 综合一啪| 99精品小视频| 91 久热| 夜夜骑天天玩天天日| 色五月丁香com| 五月激情偷拍婷婷| 欧美性色A片免费免费观看的 | 开心五月深爱激情| 亚洲三A| 婷婷成人综合五月| 老美AA片| 久久九精品| 五月丁香本色在线观看| 5月婷婷性视频| 久久五月婷6 9| 天天成人综合视频| 婷婷丁香五月综合久久| 99久久九九| 丁香五月婷婷激情蜜桃| 第四色首页| 婷婷色基地在线看| nvrentiantang av| 97极品在线| 超碰在线视屏| 久久五月婷| 色婷婷狠狠| 天天日夜夜夜操操操操| 99热超碰人| 色五月丁香五月天| www.久久久久久| 日本色婷婷| 丁香五月婷婷婷婷欧美综合| 国自产拍偷拍精品啪啪一区二区| 欧美五月丁香在线观看| 内射 无码 伊人| 青青草成人网| 亚洲综合婷婷五月| 婷婷五月天色色| 九九爱看亚洲| 亚洲免费电影2| 婷婷久久99| 五月激情四射婷婷丁香| 无码少妇高潮喷水A片免费| 99视频网| 大香蕉伊人99| 超碰99热| 综合激情深爱| www.97碰碰com| 丁香五月天综合| 亚洲五月天狠狠| 丁香五月大香蕉AV| 久草婷婷| 婷婷五月天成人影片| 免费看片在线观看| 99re思思久久| 九九热在这里只有精品| 超色欲天天| 天天弄天天操| 五月婷在线视频免费播放| 夜夜躁婷婷AV| 伊人久久婷婷| 五月婷婷真爱激情网| 五月丁香啪啪网| 影音先锋高清无码资源网| 亚洲五月天另类小说图片| 久久激情视频99| 欧美久久九九| 亚洲无码播放| 99热精品一| 97干网站| 91午夜婷婷狠狠久久综合9色| 开心激情站| 激情五月无码| 91porn一起草| 欧美成人AAA片一区国产精品| 夜夜爱网站| 久久成人性爱| 色色色区| 丁香五月-激情综合| 九月丁香亭亭| 五月丁香婷婷潮喷中文字幕| 丁香久久| 亚洲操B视频| 婷婷中文字幕版| 性色婷婷| Caoub青青超碰 | 婷激情五月天视频导航| 婷婷五月天你懂的| 亚洲乱码日产精品BD| 91黄操| 色久五月天| 婷婷激情五月天激情在线| 久久婷综合网| 97碰碰免费.视频| 色爱综合网| 日本天堂免费99| 色婷婷九月| 色婷婷五月天激情在线播放| 大香蕉久久草| 色五月色五天色情网址| 校花娇喘呻吟校长陈若雪视频| 天天摸天天肏| 九九这里有精品| 六月丁香好婷婷| 综合激情五月丁香9999久久精| 色色婷婷丁香五月天| 色婷婷色综合久久精品V| 91Chinese在线| 激情五月天色色网| 99这里只有精品| 亚洲色模骚货| 襙逼网| 激情网 五月天| 国产VA播放| 91viP在线看| 激情四射婷婷色色色| 丁香五月激情啪啪啪| www,黄色在线,con| 超碰v| 啊v视频在线观看| 伊人久久婷婷| 色噜噜狠狠色综合成人网| 五月婷婷啪啪| 婷婷五月天在线一区| 色婷婷a三区麻| 97色伦另类图片小说视频| WWW.五月天9999| 丁香五月电影| 日本三级中国三级99| 人妻视频在线| 色婷婷天堂| 日本三久久| 黄色成人网站在线播放| 开心五月婷婷婷美女| 百度4399有码精品V在线观看| 婷婷久久天堂网| 噜噜五月天综合| 色综合9| 激情丁香五月天图片| 国产精品成人网站| 99精品偷拍视频| 嫩草视频观看| 人妻九九九九| 五月天婷婷xxx| 丁香五月网络网络| 九九视频这里是精品五月| 二人电影免费版在线观看| 日本人妻丁香婷婷久久寝取熟女五月| 五月婷六月综合在线观看| 激情99热| 五月丁香六月情婷婷久久| 婷婷五月噜噜| 五月婷婷丁香社区| 久久超视频| 91日本在线观看| 久热大香蕉| 日韩欧美不卡| 丁香社92视频| 热久69| 伊九九三级区| 国产夫妻操逼内射视频| 狠狠狠狠狠草| 这里只有精品在线视频在线观看| 99re热在线视频观看| 天天色播| 少妇AB又爽又紧无码网站| 91蝌蚪窝视频在线| 婷婷中文字暮| 99视频久久| 337p午夜影院| 深爱婷婷网| 另类视频在线| 免费在线观看AV网站| 精品操逼一区二区| 激情伊人| 亚洲无码成人性爰网| 桔色成人在线| 婷婷久月| 亚洲精品a成人在线播放| 欧美激情久| 中文网AV| 这里只有免费精品| 婷婷激情四射| 不卡在线视频| 永久免费视频| 极品 少妇 内射| 狠狠干综合| 婷婷五月天基地| 五月丁香天堂| 激情五月天色| 日韩AV大全| 亚洲综合婷婷| 婷婷黄色五月| 热热久久精品视频| xx人人xx| 久/久精品99看9| 91综合在线观看首页| 色婷婷五月天激情| 久久综合人妻| 日日夜夜干| 97欧美在线| 婷婷深爱五月亚洲综合| 五月天伊人久久久久| 国产精品美女久久久久AV超清| 久草a片| 色欲资源网| 色色色图| se色综合网| 日韩按摩二区| 色婷婷欧美| 碰久久精品w| 色五月丁香五月五月婷婷| 5五月综合网亚洲| 性按摩玩人妻HD中文字幕| 日本在线视频播放91| 色婷婷综合网站| 人人操av| 色欲色天天香综合| 综合色五月| 欧美激情综合五月色丁香| 91人人网| 婷婷婷婷婷婷婷婷| av在线播放网站| 五月亭亭六月色| 97干视频在线| 五他月天啪啪啪| 五月花婷婷最新| 五月婷婷影院| www婷婷| 精品99视频| 影院久久久| 99亚洲欧洲| www.激情| 丁香五月天啪啪| 97碰碰在线看视频免费| 亚洲av综合网| 欧美精品狠狠色丁香婷婷| 五月天激情综合在线| 亚洲免费观看高清完整版AV线| 丁香五月伊人| 26UUU在线观看| 丁香六月婷婷久久综合| 中文字幕成人| 亚洲旡码| 日本99在线| 五月天四色房丁香亭亭| 国模狼狼| 天天摸天天高潮天天爽| 国产精品美女久久久久AV超清| 激情综合啪啪啪| 丁香婷婷色五月| 婷婷色播婷婷| 操操人人| 超碰com| 欧美大香蕉视频| 五月丁香激| 99色精品| 黄色激情久久| 国产成人av在线播放| 超碰二区| 99视频自拍| 91久久| 亚洲色久| www99热| 91久操| 蜘蛛女免费观看完整版高清电影| 久久久性爱视频| 婷婷五月大| 婷婷久久综合| 五月天婷婷影院影院| 182.t午在线观看|