久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码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)境下構建帶附件的郵件客戶端。資源包共59個文件包含25個cpp源文件、15個頭文件以及dll動態(tài)庫、UI設計文件、工程配置與資源圖片等完整覆蓋從界面構建到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)思路、關鍵代碼和我在 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 結束。這個有序性決定了 Qt 側必須有一個狀態(tài)機來驅(qū)動不能像普通 socket 編程那樣收到什么就處理什么。我第一版實現(xiàn)就是沒有狀態(tài)機收到服務器響應后直接調(diào)用下一步發(fā)送函數(shù)結果在慢網(wǎng)絡下偶發(fā)錯亂——服務器回 250 還在路上客戶端就把下一步命令丟出去了。后來改成顯式的狀態(tài)枚舉每次應答回來先校驗狀態(tài)碼與當前狀態(tài)的匹配關系再推進到下一個狀態(tài)問題才徹底消失。狀態(tài)碼分幾類2xx 表示成功、3xx 表示需要更多輸入、4xx 是臨時錯誤、5xx 是永久錯誤。郵件發(fā)送里最常見的幾個220 是服務器就緒250 是命令執(zhí)行成功334 是服務器要求提供認證數(shù)據(jù)354 是告訴客戶端 DATA 階段開始、可以輸入郵件內(nèi)容了。Qt 側處理的關鍵是不要把狀態(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ā)連接后程序不會阻塞等待結果而是通過信號通知調(diào)用方。在郵件發(fā)送這種邏輯里同步改異步是天然的——發(fā)郵件本身就應該放到后臺線程不阻塞主界面。但要注意 QSslSocket 的信號連接時機我在第一版里犯過錯誤在 connectToHostEncrypted 之后才連接 encrypted 信號結果握手極快的情況下信號丟失程序卡死在等待狀態(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 客戶端類的四個模塊與關鍵代碼3.1 類設計與接口定義讓調(diào)用方只看一個 send 函數(shù)整個工具對外只暴露一個簡潔的接口調(diào)用方不需要關心 SMTP 細節(jié)。設計上分為四層Socket 封裝層、命令層、認證層、MIME 構造層。Socket 封裝層負責 TCP/SSL 連接生命周期管理命令層實現(xiàn) SMTP 狀態(tài)機和命令發(fā)送認證層處理 LOGIN/PLAIN/CRAM-MD5 交互MIME 構造層生成符合 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 拿到結果statusChanged 實時回傳當前階段方便界面顯示發(fā)送進度。端口和加密模式在構造時確定認證方式通過 setAuth 配置。關于參數(shù)SslMode 枚舉是很多實現(xiàn)里容易混淆的地方Tls 對應 465 端口直連加密StartTls 對應 587 端口先明文后升級。3.2 連接與狀態(tài)機基于 QStateMachine 不如手寫枚舉網(wǎng)上很多 Qt 郵件示例用 QStateMachine 框架來實現(xiàn)連接狀態(tài)轉換但我在實際項目里發(fā)現(xiàn)這個框架用在 SMTP 這種有極少狀態(tài)、嚴格線性的流程上顯得笨重——狀態(tài)轉換的觸發(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 標志組合起來可以關閉換行插入。實際測試中大部分 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 字符必須轉 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 構造文本、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ù)不會干擾郵件結構可以放心。4.2 Quoted-Printable 與 Base64 的應用場景邊界Base64 適合編碼整體就是二進制或大量非 ASCII 字符的內(nèi)容Quoted-Printable 適合以 ASCII 為主體、偶爾有少量非 ASCII 字符的內(nèi)容。Q-P 編碼把非 ASCII 字節(jié)寫成 XX 形式可讀性好體積膨脹小。在郵件場景里 Base64 用于附件和純文本郵件體QP 用于 HTML 郵件體中穿插少量中文標題或關鍵詞的場景。兩者可以混合出現(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 字符、控制字符都要轉義而空格在 Q-P 編碼里可以保持原樣但在行尾必須編碼成 20否則解碼端會吃掉它。4.3 multipart/mixed 與 multipart/related 的嵌套結構一封帶附件的郵件頂層必須是 multipart/mixed里面第一個子部分是郵件正文后面是附件。如果正文里要嵌圖片正文本身要轉成 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é)不要在讀取時做任何轉換直接 Base64否則大文件會有雙重轉換的性能開銷和內(nèi)存膨脹。4.5 CRLF 與點填充DATA 階段的兩個硬性規(guī)范DATA 階段是 SMTP 協(xié)議里唯一的多行數(shù)據(jù)階段客戶端發(fā) DATA 命令收到 354 響應后逐行發(fā)送郵件內(nèi)容以單獨一行英文句點 . 結束。這個過程中有兩個規(guī)范必須遵守所有行必須以 CRLF 結尾內(nèi)容中凡是以 . 開頭的行都必須額外在行首增加一個點即發(fā)送 .. 服務器端會還原為單點。如果不在客戶端處理孤立行點郵件正文里某個以 . 開頭的段落會導致服務器提前結束 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ù)入口轉成規(guī)范格式再處理。注意這個函數(shù)只處理行首點轉義不負責把 \n 替換成 \r\n——這個邏輯應該在構建消息體時已經(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 結尾、部分行以 \r\n 結尾部分客戶端解析 MIME 邊界時按 \r\n 逐行找 boundary 字符串遇到裸 \n 就誤判后續(xù)結構全亂。解決方案是在構建郵件體的入口強制做換行規(guī)范化MIME 頭、正文、附件部分的每一行都以 \r\n 結尾不做例外處理。這個函數(shù)我放在 MailMessage 構造函數(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 握手的證書鏈驗證結果與 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 結構里加了一個 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 通過構造函數(shù)注入方便宿主環(huán)境按業(yè)務場景調(diào)整——實時告警可以縮短間隔日終報表可以放大到 5 分鐘。從那以后我每次接入新郵件服務都要強制走一遍手工 SMTP 會話、日志回放、重傳冪等這三項檢查確實省下不少半夜被叫起來解決問題的麻煩希望幫到你。本文還有配套的精品資源點擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
综合啪啪| 超碰久超碰久| 久操大香蕉超碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰 | 欧美精品偷拍| 五月婷婷综合网| 人人操人人uiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii | 久久久久久九九九九九| 殴美色网| 五月天AV资源| 成人熟女区| 男人天堂2012| 五月天色色网站| 日韩欧美大力操| 97超碰9| 人人操人人射人人干| 中文字幕在线观看第二页| 国产精品老师| 欧亚在线视频| 人人插人人搞人人操| 久久精品一区二区一8| 全国男人天堂网| 久久日本熟女精品一区| 国产地址二三| 狠狠夜色午夜久久综合在线| 日本韩国一本产品小视频日本韩国一本产品久久久产品小视频日本韩国一本产品久 | 婷婷激情啪啪| 99国产精品人妻人伦| 久久激情网| 国产亚洲色婷婷久久99精品91葵花宝典 | 久久九九网| 日韩精品1区2区中文字幕| 欧美成人一级麻豆| 大色综合| 蜜臀99久久精品久久久久| 久久精品无码熟妇一区二区三区视频导航 | 国产1727欧美| 青青三级视频| 在线亚洲丝袜视频网站| 精品人妻一区二区蜜桃视频 | 久久久久久久久久久人妻| 一起草AV| 色女女女导航| 日夜啪电影| 99综合网| 丁香五月影院| 91chinese在线| 成人AV在线电影| 亚洲午夜av| 亚卅熟女乱色| 亚洲 中文 女同| 蜜臀久久久久久999| 亚洲综合97中文网| 久久久精品日本一道| 天天日天天插| 青娱乐av在线| 久久精品免视看国产成人﹣蜜臀av一区. 久久精品免视看国产成人,蜜臀av一区 | 骚货 中文字幕 av| 福利五区| 亚洲情色无码一区二区三区| 精品人妻一区二区蜜桃视频| 诱惑网综合| 天天干人人乐| 白丝av| 97香蕉网| 欧美特大AA级黄片| 人人 操人人 操人人| 黄色激情电影在线观看| 日本在线激情一区二区三区| 狠狠干狠狠干| 日本一区二区电影网站| 国产农村妇女精品1区二区| 97人亚洲综合字幕| 蜜桃久久久久久久久久久久| 综合九九| 欧美激情 亚洲色图| 综合色区偷拍| 日日爱99| 欧美精品23| 欧美精品99久久久**| 一级黄色性爱A级片| 国模不卡| 亚洲第一综合| 搡老女人老妇女老妇老熟女怎么读| 欧洲Au麻豆| 鸥美精品一区二区久久婷婷| 欧美在线l亚洲| 欧美综合色综合| 97欧美综合网| 一级做a爰片性色毛片久久| 樱花蜜乳av| 操逼啊啊啊91| 国产精品天美传媒| 超碰中文字幕人妻草一区| 亚洲凸凹超碰成人| 欧美性性性| 神马九九| 五月天婷精品激情| 性色乱AV一区二区| 69久久久久久久久久久久久| 色九九久九九| 国产在线激情视频| 婷婷伊人网| 欧美一区二区日韩传媒搭讪精品| 国产精品电| 国产剧情在线| 日韩av一级黄片| 久久一二三四五六七八九区区区 | 天天色黄色影院天天操| 大香蕉AV在线| 久久鲁夜| 传媒在线观看一区二区三区| 久久这里只精品免费福利| 精品偷拍13p欧美dodk视频| 97久久超碰| 亚熟在线| 麻豆天美一区二区| 岛国黄色短视频| 午夜免费福利视频一区| 六月丁操逼| com 首页 18岁 禁区 女优 免费 精选 同城| 人妻丝袜日本| 国产av又色又爽又黄| 色久综合| 九九九九免费高| 欧色网址| 久久久精品成人国产| 啊啊啊com| 中文字幕诱惑制服人妻丝袜美丝袜美| 国产色图乱伦| 妺妺跟我一起洗澡没忍住| 亚洲天堂另类小说男人| 9.1小视频| 亚洲不卡三级手机播放| 色99视频| 免费97视频| 欧美一级在线观看成人| 日韩黄色成人性爱| 精品九九九九九九九| 久久香蕉国产线看观看亚洲女人 | 日本三级一区二区 在线| 亚洲中文字幕97久久精品少妇| 精品国产国产AV| 啊啊啊啊操死我| 成人美女av| 97干com| 99热在线只有精品| 一本一道波多野毛片中文在线| 日韩一级二级| 成人小电影网站tex| 国产日韩欧美亚洲精品95| 欧美v日韩欧亚洲电影天堂色诱,国产传媒| 亚欧操逼片在线观看| 99久久精品无码一区二区毛片免费| 五月婷婷深深爱| 蜜桃精品一区二区三区久在线| 国产在线能看的你懂的| 色综合一区二区三巨| 天天爽入口| 四虎国产精品永久地址入口| 懂色AV中文| 国产女人视频三四五区| 婷婷色色网| 好爽免费视频,| 肉动漫无遮挡h在线观看| 日本天天色| 久热精品在线| 亚洲色图亚洲无码强奸乱伦| 色www精品视频在线观看| 亚洲精品九九九| 99在线精品观看99| 日韩欧美~中文字| 黄页视频网站野外| 亚洲好色人妻| 欧美日韩操逼嗦吊| 天天干1区2区在线| 男人高清无码一区二区| 97精品97| 国产高清无码一区三区二区| 精品九九淫乱男| 男女猛烈无遮掩视频免费软件| 欧美三级不卡| 少妇久久久久久久久| 色婷五月天| 综合色区偷拍| 九九碰九九爱97超碰| 97se亚洲| 久草五月| 日韩大香蕉AV影片| 99热只有| 久久99国产精品| 97色碰| 桑老女人九区| 国产激情综合| 欧美亚洲首页| 久久99操天天日| 日韩精品 欧美激情| 五月综合色| 深夜国产福利| 青青国产精品在线| 日本1区2区不卡视频| 97超碰亚洲| 波多野结衣被操50分钟免费视频| 日韩少妇无吗| 国产乱人伦AVA麻豆软件.| 锕锕好爽 死我在线观看| 亚欧性爱ab| 久久精品国产97欧美精品亚洲 | 欧洲黄色网| 色爱欲亚洲| www亚洲免费| 一区二区三区色综合| 岛国艾薇凹凸视频天堂| 黄片免费看黄片免费看| 欧美一区二区成人一卡| 一本大道不卡一二三区| 69久久| 亚欧精品久久久久久久久久久| 久久久久921| 国产18精品亚洲精品| 欧美亚洲中文字幕| 啊啊啊com| 无码精品久久| 97一本大道亚洲一区| 日本人人操人人操| 97资源久久| 日韩超碰精品综合| 无码高清专| 91青青在线| 97人妻色| 涩涩涩综合| 嗯嗯啊啊日韩精品| 乱精品一区字幕二区| 日欧操屄| 丰满熟女人妻一区二区三五十一路| 久久香蕉网| 国产精品久久久吖| 亚洲综合情色| 亚洲 日韩 欧美 国产综合体| 国产高清自拍| 午夜精品人妻二区三区| 啊…啊…操我用力操我| 伊人黄色片| 玖玖大干人妻| 欧美天天综| 3D污黄视频在线观看| 无码二级三级| 国产精品欧美激在线| 热99这里只有精品| 久操电影| 自拍第一页| 国产久久久9999| 日韩久久.一级黄色片| 在线看污网站| 亚洲精品国产AV天美传媒| 肉嘟嘟www视频在线观看高清| AV天堂因数| 超硑97精品| 在线视频日韩欧美国产| 成人蜜乳小视频网站| 国产熟女自拍| 久久国产精品,久久国产| 亚洲经典啪啪| 91精品微拍福利| 国产嫩草精品A88AV| 秋霞男人网| 无码自拍SM| 人人看人人插| 国产免费小视频| 亚洲欧美setu| 国产一区96在线| 超97在线精品视频| 国产精品不卡一区二区三区av| 99国产精品自在自在| AV色天香在线| 秋霞一级视频在线观看免费| 色在线亚洲视频www| 大香蕉综合网| 精品无人区麻豆乱码1区2区图片 | 中文字幕青青草| 久久亚洲熟妇在线视频| 中亚av| 国产强奸超碰AV| 免费观看成人www精品视频| 92大香蕉| AV天黑人| 久操大香蕉超碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰 | 国产精品成人久久一区二区三区| 91精品网站| 蜜臀久久精品久久久久视频| www.一本大99| 日韩乱码Av| 99无码视频| 99久久精品无码一区二区| 操国产逼| 亚洲另类天堂| 欧美少妇人妻| 欧美日韩久久精品爱爱| rivers-china.com| 一区超碰一区| 男女香蕉一区二区| 综合欧美日韩在线| 五月天伊人| 91亚洲黑人| 色狠狠色| 99热18| 欧美特大黄一级片片免费| 亚洲色图尤物视频| 中文字幕乱码人妻二区三区| 亚洲黄色视频在线观看视频| 久久久久久久免费A片国产成a人亚洲精∨品无码| 殴美色网| 又黄又硬又粗又长国产视频| 青青操日韩| 丰满人妻一区二区中文| 色眯眯av| 亚州欧美总和| 成人夜夜| 91插B网站| 中国熟女91| 日韩精品一区,二区 九九...老司机| 日韩情色AV| 国产传媒1234区| 亚洲综合码| 亚洲情色五月天 | 国产熟女| 国产1727欧美| 中日韩久久久免费看| 97超级色碰碰| 蜜桃精品视频一区二区三区| avav青青草久久夜| 天天综合网~91| 午夜噜噜噜| 91欧| 91 丝袜在线播放| 淫荡网址| AA级电影三区| 777琪琪午夜免费A片| 为用户提供免费看黄网址在线观看| 手机午夜电影神马久久| 伊人操你| 女人被男人桶爽视频网站| 精品毛片av一区二区| 不卡av在线中文字幕| 国产精品网址| 亚欧Av| 国产亚洲精品自在线亚洲情侣| 日本中文字幕在线电影| 调教熟妇 久久久久久| 日韩97超碰中文字幕| 天天操av懂色| 抽查国产福利主播| 久草在| 人妻熟女一区二区| 东京男人天堂| 久久久精品网站| 亚洲AV麻豆Aⅴ无码电影一| 午夜男女爽爽爽影院视频| 日韩精品色呦呦| 免费伦费视频在线观看| 开心五月深爱五月| 日本一区二区三区欧美日韩中文字幕| 久久视网78| 日韩不卡一二三四| 国产精品乱码久久久久久久久| 欧美姓爱综合网| 日本成人在线不卡一区二区三区| 岛国片在线播放| 亚洲午夜福利在线影院| www.狠狠操| 日本精品88888888| 91色堂| 九九热av| 久久久精品电影| 亚洲成a人片在线观看中文!!!| 国产无套粉嫩白浆在| 97资源制服丝袜| 天天影视激情欧美| 区自美91| 久久精品| 在免费jIzzjIzz在线视频| 操操啪| 欧美久久久15P| 91色s| 亚洲丝袜诱惑| 岛国AB视频| 天天操天天插| 国产中文福利| 午夜啊啊| 欧美伊人久久综合网| 国产免费久久久久| 东北老女人的激情视频| 超碰诱惑| 丰满岳乱妇一区二区三区| 强奸xx国产| 色老汉色| 日本黄色精品| 做爱A级亚欧| 清柠毛片| 91国内外在线| 免费精品无码一级毛片牛牛影视 | 啊灬啊灬啊灬好深灬快高潮了动漫-国产字幕国产在线观看-B049AV | 美女操逼福利视频| www四虎| 国桃视频产巨乳精品一区二区在线| 日本不卡一二区| 综合五月婷婷亚洲一区| 东北夫妻性偷拍| 精品视频久久区| 新亚洲无码| 久操不卡视频| 四虎免费看黄| 亚洲在线欧美| 5月婷婷6月六月丁香| 日韩精品高清资源在线| 欧美日本不卡在线| 天天搞在线综合网| 尤物av网站| 97视频一区| 人人潮人人摸| 开心六月色| 99999久久精| 五月丁香拍拍激情综合三级| 亚熟在线| 啊啊啊啊操死我| 成人性爱高清视频免费看| 欧美 日韩 国产传媒| 五月天婷婷社区| 一区二区三区视频国产免费| 人妻在线中出视频| 九九九精品美女| 日韩av在线免费网站| 一区二区三区四区姦女| 久久久无码视频| 亚洲激情在线一区二区| 天天色怡春院| 久久性爱精品一区| 一及黄久一点| 亚洲 暴爽 AV人人爽日日碰| 色激情五月天| 一本大道久| 亚洲导航深夜福利| 先锋音影AV| 91视频精品| 日本有码影片下载| 超碰在线91| 人人看人人摸人人色| 亚洲电影91| 俄罗斯一区二区视频在线观看| 免费视频在线观看啊啊啊啊啊| 99热婷婷一区二区三| 国产精品免费视频人成| 中文精品少妇天堂| 国产成人www免费人成看片| 999综合色| 国模私拍一区二区三区神乳| 中文字日本乱码| 中文字幕国产在线天堂| 1024亚洲中文字幕久在线看片你懂的| 久久色精品视频在线| a久久| 国产精品丝袜在线| 婷婷尹人大香蕉免费| 夜夜夜夜久久久久| 婷婷丁香六月天| 91 天天综合| 丁香六月激情综合| 999久久久国产精品| 五月天偷拍| 日韩综合97p| 五月婷在线| 亚洲色图A| 天天日日夜夜| 日日骚中文字幕| 亚洲 图片 综合91| AAAA级日本片免费视频| 欧美狠狠弄| 国产精品麻豆免费视频| 无码人妻精品一区二区三区九九| 免费看A片毛毛片在线播| 丰满人妻一区二区中文| 亚洲AV无码久久久国产精品| 久久婷婷一区| 99激情| 亚洲一二三四区| 无码heyzo高清一区| 精品久久久av无码免费| 久久綜合很很很| 999精品国产高清一区二区| 久久久久ab| 亚洲97久久精品亚洲| 久久女女| 大香蕉碰| 久久这里只精品免费福利| 嗯嗯啊啊好疼| 国产午夜激片Av毛片不卡| 欧美小说区视频区| 婷婷啪啪| 日韩免费中文字幕视频| 亚洲色香| 欧美性爱另类综合| 欧美日韩中文字幕人妻| 9999伦理视频| 极品尤物自安慰| 国产一区二区在线看| 大香蕉97久久| 综合伊人激情| 色香91| 99热在线播放| 亚洲精品一区二区精华| 国产后入清纯| 六九九九| 可以在线观看的黄色网址| 国内外毛片在线观看| 啊啊啊不要好疼视频| 欧美高清18A片| 亚洲日韩熟女人妻高清在线| 深爱五月婷婷| 亚洲熟女乱色一区二区三区| 941超碰| 日韩AV电影网站| 中文字幕,人妻,日韩| 麻豆天美AV传媒第一页| 欧亚乱色熟一区二区三四区| 黄色免费网页无码| 欧美组图日韩亚洲中文字幕| 婷婷九月国产| JULIA人妻风俗店中出电影| 日韩一级成人毛片免费观看| 久热一区二区| AV色五月天| 亚洲AV无码天美传媒一区| 国产91乱伦| 熟女人妻一区二区三区| 91伊人久久在线| 九九热免费国产视频婷婷伊人| 操逼www.| 亚洲成a人v欧美综合天堂下载| 91艹| 大香蕉中文aV在线| 国产毛片精品一区二区色欲黄A片| 国产在线视频二区| 91丝袜| 亚州欧美综合| 97超碰色屌| 综合久久99| 午夜男人av| 9999久久久| 天天在线91| 天天舔九色婷婷| 九九热超碰| jizzjizz欧美| a片久久久久久久久久久久 | 无码一区二区精品视频久久久春药| 91欧| 欧洲亚洲综合| 少妇人妻精品| 欧美久久九九| 欧美视频在线视频免费va| 午夜超爽| 成人精品在线免费视频| 综合五月天| 啊啊啊啊啊啊啊啊要喷了| 久久国产视频专区一二三| 99久久久久| 久久久久亚洲?V片无码V| 秋霞怕怕片| 99久草| 久久精品成人一区二区三区蜜臀| 91久久18禁| 国产天美欧美| 狠狠狠狠狠干| 综合久久中文字幕综合日韩精品| 天天干人人干天天日97| 婷婷色色五月天福利| 男人的天堂kva| 亚洲日韩东京热一区| 青青草原狼av| 920日本午夜免费| 日韩欧美俄罗斯A片| 欧美日韩大香蕉| 97色97干| 国产精品在线免费| 国产精品伦理| 91老熟女91老女人| 伊人精品国产| 神马久久网| 青青青国产| 爱爱60秒免费视频| 99碰碰| 伊人久久大香大香线蕉中文 | 久久亚洲AV成人精品无码| 中文字幕五月婷婷免费| 中文字幕蜜乳av| 亚洲影视综合| 久久精品超碰| 欧美在线|亚洲| 9长久久精品| 久久精品免视看国产成人﹣蜜臀av一区. 久久精品免视看国产成人,蜜臀av一区 | 一级一性爱免费视频| 日韩91网站| 久热精品在线| 偷拍导航视频网站| 国产精品大屁股999| 熟女熟妇伦久久影院毛片一区二区| 麻豆一区在线| 啊啊啊啊二区好大| 国产丰满少妇久久久精品影院| 91 丝袜在线| 国产老熟女| 久久伊人网视频一区二区三区 | 伊人991| 日本A级视频| 中文字幕少妇色| 91久久伊人婷婷青青草| 熟女自慰久久久| 国产熟妇一区二区| 久久久久久久久久久999| 欧美久久婷婷| 97超碰精品成| 亚洲人综合| 青青草在线视频美女| 国产精品69久久久久孕妇欧美| 无毛精品| 婷婷10月天青娱乐| 97中文字幕九区| 淫荡网址| 无码一区免费在线不卡| 最新岛国大片| 淫荡熟女乱伦网| 亚洲无码免费看| 91人妻尻屄视频| 久精品无码av一区二免费国产在线观看| 国产尹人在线视频免费| 97久久超碰| 操美女高潮抽搐白浆| 国产精品麻豆成人AV艾秋| 亚州色图第三区| 少妇一区二区三区在线观看| 啊啊啊啊二区好大| 中文字幕二区| 上床啊啊啊| 天天噜| 精品无码一区二区三区| 巨爆乳一区二区爆乳区| 久久婷婷综合国际产色怕| 爱射综合| 色女综合| 狠操91,com| 欧美91久久久久| 91bbbbbb| 91国产操逼视频| 精品亚洲国产成人精品| 国产激情片在线观看| 97超级久久强资源| 麻豆人妻少妇在线免费观看| 日韩有码回春沙龙第一页| 91制服丝袜| 大肥女高潮bbwbbwhd视频| 日韩国产不卡在线视频| 欧美特大黄一级片片免费| 91 手机在线播放 绯色| 好看的91视频| 亚洲天天天| 另类图片综合| 中字幕人妻一区二区三区| JIZZJIZZ国产精品喷水| 女人爽到高潮久久久| 性色av一区二区| 丝袜视频网国产90| 国产在线观看一区二区三区| 思思热er精品视频| 96精品在线| 亚洲第91页| 亚洲中文字幕av| 天天躁日日躁成人字幕aⅴ| 久久一级无码精品毛片6| 亚洲性综合9| 亚州中文字幕超碰97| 国产精品丝袜在线| 亚洲日韩视频二区| 狠狠综合| 91久久久视| 亚洲美女黄色| 家庭乱伦麻豆| 免费黄色A片| 女一区二区| 亚欧美色图| 91一区二区三区蜜桃| 日韩一级片在线看| 人人综合| 久操国产在线| 欧美人妻精品一区二区| 99热色这里只有精品| 亚洲综合影片| 成人性交免费视频| 蜜桃视频成a人v在线| 欧美久久草熟女| 中文字幕免费看| 精品日韩人妻精品一二三区| 中日高清无码操逼视频| 97精品视频网站| 91A欧美电影网站| 激情 欧美 亚洲 小说| 日韩一级片在线看| 伊人久久大香蕉线AV五月天| 91少妇人妻| 丁香六月东京热| 啊啊好多水| 国产一区二区在线播放| 成人av动漫在线观看| 人妻人人澡人人爽人人| 麻豆久久精品亚洲精品88| 99久久精品国产高潮| 日韩美女高潮喷水视频| 欧美在线91| 久碰视频| 欧美黑人91| 精品毛片av一区二区| 久久人妻丝袜一区二区三| 亚州国产成人精品女人久久| 成全在线观看免费观看| 超AV色女| 天天干18禁| 色牛牛AV| 941超碰| 免费一级黄色录像影片| 91日日| 国内伊人久久久久久网站视频| 综合久| 欧美国产操逼| 园内精品自拍视频在线播放| 不卡九肏| 日韩性爱啪啪视频| 96精品在线| 蜜臀99久| 亚洲AV成人在线| 亚洲系列欧美| 欧美视频一区二区在线| 麻豆 亚洲 97| 正在播放国产精品一区| av在线人气| 尤物网站91| 中文字幕在线播放2中文字幕在线观看2| 色网亚洲人| 蜜乳性色无码专日粉嫩骚逼AV| 亚洲综合九| 不卡中文字幕aⅴ在线| 67194无码不卡| 欧美色图色综合| 97久久资源| 久久久久久性爱免费视频| 亚洲午夜免费狠狠干| 欧美少妇高潮| 国产AV超爽| 天天情欲宗合网| 最好看的中文字幕在线2018| 嗯嗯啊好大| 在线视频免费观看午夜| 不卡九肏| 国产粉嫩蜜臀av一区二区三区| 91天天日| 一起草三级AV电影在线观看 | 一区二区三区蜜桃成人撸久久东京热| 国产精品不卡一区二区三区av| WWW4虎| 欧美夜夜草视频| 超碰97资源大奶| 一级人妻性爱视频| 久久偷拍人| 大黄片做爱的大的| 久久久男人的天堂| 人妻精品一区二区在线| 国产超碰97| 丁香五月综合| 97在线免费看视频| 久久久草成人网站久久久草成人久久久草久久久 | 嗯啊抽插大香蕉网页| 亚洲综合射| 不卡啪啪视频| 国产精品丝袜在线| 日本亚洲vr欧美不卡高清专区| 啪啪视频免费在线观看| 99热在线不卡| 日韩性爱毛片操骚逼| 国偷自 一区| 国产成人精品亚洲日本| 美女网站91| 久jiu久神马影院| 欧美日韩黄片精品在线| 青草影院内射高潮| 99色色网| 一区二区高清视频| 91l欧美在线| 韩国午夜理伦三级好看| 国产又粗又长视频| 欧美不卡在线美女| 久久91视频| 天天在线91| 天天欧美色| 久久久久久久久久久免费精品| 国产风韵犹存熟妇三区| 五月天丁香网| 欧美高清无码免费视频高清版| 四虎免费看黄| 亚洲欧美中文日韩视频中国语| 久久欧美激情| 国内操逼视频二区| 成人乱码一区二区三少妇| 久久精品国产亚洲av水密被窝| 天天透伊人| 日韩精品人妻一| 中出91视频| 色哟哟-国产专区| 八戒无码国产午夜福利| 四虎精品永久在线观看| 熟女日韩| 中文字幕123| 超碰在线91| 精品视频专区| 久久久中文| 超碰免费人妻人人| 欧美肥臀在线| 91丝袜在线观看视频在线观看| 亚洲黄色a级片| 五月天伊人网| 久久久禁| 天天日天天舔天天喷天天射| 亚洲精品三区在线观看| 欧美草草高清日韩视频| 黄色十八禁网站| 999岛国大片| 亚洲AV成人无码一二三久久| 久肏视频字幕| 久超超碰| 九九热九九| 国产日韩欧美中文在线播放| 91日韩网站| 亚洲 欧美 另类 日韩 人妻一区| 国产精品秘 福利姬在线观看| 国产精品久久久久久亚洲色欲| 91美女视频在线免费观看| 黑操B| 美女国产一区二区久久| 九九九九精品| 亚洲精品乱码久久久久久蜜桃麻豆 | 超碰久久网| 欧美AB在线观看| 伊人女女资源在线观看| 嫩草美女久久| 久午视频| 久久久精品九| 91最新综合| 91一起操| 黄色小视频日本txt| 欧美组图日韩亚洲中文字幕| 人妻少妇精品久久久久久| 粉嫩AV一区夜夜嗨| 亚洲国产精品久久久久婷婷青年| 久久精品国产72国产精品福利| 久久成人国产精品| 欧美美女视频| 九色 蝌蚪 熟女自 | 大香交| 99re只有精品| 九九热免费国产视频婷婷伊人五月 | 国产午夜在线观看| 加勒比色99999| 国产后入内射| 麻豆福利视频导航| 99啪| 亚洲午夜免费狠狠干| 伊人黄色视频免费观看| 爽极品影院| V A在线| 97超碰香蕉| 天天干夜夜操一区二区| 啊啊啊啊啊啊啊在线| 色爱综合网欧美| 99国内精品| 激情色播| 九九RE视频在线精品| 蜜乳AV网址| 欧美性爱91| 欧美A片中文字幕| 丝袜美腿亚洲| 久久系列| 久久大香蕉97| 伊人性在线视频| 青青操视频在线| 啊啊啊啊啊,啊啊啊啊好舒服,操我舒服啊啊啊 | 色香综合天天影视综合| 日韩中文字幕2020| 高跟伊人julia ann| 欧美AB在线观看| 淫淫总合网| 国产原创自拍| 裸体美女免费看网站青草| 五月丁香啪| 91精品黄在线观看| 亚洲夜夜欢无码一区二区 | 精品人妻免费观看| 色波多| 91久久青青草原精品| 日本欧美中文字幕| 操东北女人| 亚洲成人激情小说视频| 看日韩黄片| 精品无码久久久久久久久果冻糖心| 黄骗免费网站| 啊啊啊啊啊在线| 精品九九九| 亚洲丝袜诱惑| 黄片www视频免费| 久久粉色| 欧美日韩中文视频播放| 日韩97| 91色综合| 天天看天天日天天操| 亚洲欧洲成人在线电影| 日韩成年人性爱视频| 超碰精品国产无码| 日本精品中文字幕视频| 亚洲成人性爱网站在线播放| 欧美综合国产精品久久丁香| 日韩一级性爱无码| 亚洲av综合色区图片亚洲| 亚洲好看强奸乱伦| 欧美日韩国产中文精品字幕自在自线| 一类无码操逼视频| 97人人操人人摸| 岛国片国产成人亚洲播放| www.大香| 免費黃色視頻觀看一| 国产精品视频精品一二| 一起草AV| 色呦呦、国产精品| 免费9 1久久| 中文字幕久久亚州无码| 中文欧丝袜诱惑| 亚洲精品国产拍免费91在线| 色区97| 性无码专区2020| 精品成人动漫一区二区| 1024人妻熟女一区二区三区| 91操碰| 亚洲色人妻综合| 69人妻精品丰满熟女区| 日本天天干天天日一区| 97在线播放| 夜夜骑夜夜操| 天天看精品动漫视频一区| 日逼逼免费看| 玖玖爱免费观看视频| 99精品在线观看| 97亚洲一区| 伊人网在线视频| 四虎在线免费视频| 亚洲情色 自拍| 日韩成人无码| 在线观看无码三级少妇| 精品一区二区成人动漫| 欧美日韩丝袜| 99精品伊人| 东京热91| 欧美第一页| 老司机老司机午夜影院| 成人午夜无码视频| 色婷婷成人综合| 99在线啪| 另类欧美色| 久思思热视频在线观看| 国产精品免费视频人成| 午夜情侣自拍网站| 免费草草草草草视频| 国产搭汕a级片| 人人看人人插| 亚洲中文字母在线播放| 九九热免费国产视频婷婷伊人五月| 日日日骚女人精品| 大香蕉懂9| 免费自拍三级综合| 欧美特大黄一级片片免费| 免费看污网站| 久热网| 老熟女乱伦片| 少妇滛荡视频| 97九色人妻| 欧美在线干| 视频国产成人精品日本亚洲18| 亚洲天堂人妻熟妇视频| 翘臀vidoes| 熟女91网| 思思热在线视频免费| 日韩中文字幕二区| 亚洲欧美色综合| 久久线上视频免费看| 国产日韩区| www.色婷婷| 精品一二三区女同| 熟女人妻一区二区三区| 国产精品无码在线| 蜜伊人色综合97| 欧美 日韩第一性色| 欧美伊人久久综合网| 日本在线不卡v二区| 久久综合精品一区二区三区| 欧美成97爱| αⅴ天堂| 人妻日日夜夜精品| 96超碰网| 国产黄片精品在线| 蜜臀av中字字幕网站| 久久精品一区二区三区蜜桃臀| 超清福利精品视频在线| wwwss在线观看| 久久久国产精品亚洲精品| 国产拍偷精品网站| 色噜噜狠狠色综无码久久合欧美| 蜜臀久久99精品| 国产精品不卡av免费在线观看| 99热这里只有精品地址| 日韩78m视频| 一区二区三区免费视频入口| 99ri精品| 九一国产精品| 天天插夜夜操| 偷窥自拍亚洲色图| 欧美碰碰综合色| 一本一道vs波多野结衣| 久久久久久九九九九-美女久久久久久久-成人AV| 亚洲欧美伦综合| 日韩av在线免费网站| 夜夜综合| 精品久久久久久无码| 欧美天天拍| 国产视频第二页| 日韩国产成人自拍视频| 二对二中文字幕。| 凹凸视频在线一区二区| 伊人99热| 清纯唯美综合亚洲| 伊人五月天激情| 日本 免费 一区二区三区 久久香蕉 | 热热色青青草| 欧美亚洲色图另类国产| 精品十三区| 午夜啪| 狠狠中文字幕| 天天综合网在线观看| 91狠狠色丁香婷婷综合久久| 久久久精品一区二区| 日韩无码黄色片| 欧美色图 人妻| 青青免费在线视频一区 | 偷看洗澡一二三区美女| 男女香蕉一区二区| 中文字幕亚洲永久精品| 国产噜噜噜噜噜久久久久久久久| 九九九九免费| 天无日色综合| 97超碰超碰| 少妇超碰在线| 久久久四区| 天堂蜜桃无码视频一区二区| 91欧| 91无码中出人妻视频| 天天92av| 五月丁香激情综合网| 国语少妇精| 久久久久久久久久久六六| 花花AV导航| 欧美极品女人的天堂| 亚洲超碰97| 亚洲春色激情小说| 国产强奸乱伦无码视频| 超碰午夜在线| 亚洲影院365| 天天α片| 色狠狠 - 百度| 欧美激情久久久久| 人妻aa| 91蜜臀人妻中文字幕在线| 国内精品伊人久久久久影院会| 色噜噜人妻av中文字幕| 欧洲色| 高清孕妇孕交 交| 四虎永久在线精品免费网址| 欧美夜夜草视频| 国产农村妇女精品1区二区| 偷拍三区| 一区二三区四区视频大全套| 人人爱人人操人人性| 欧美日韩97在线| 色色五月丁香| 丝袜亚洲综合| 最新一二三区视频| 99老司机精品视频在线观看| 精品人妻一二三四区视频| 亚洲国产欧美另类自拍| 超碰 国产熟女精品一区| 日韩啪啪视频| 国产乱码久久久| 国产精品老熟女一区二区| 日韩精品字幕| 精品十三区| 中文字幕中文字幕一区二区| 亚洲好色人妻| 国产久久一区二区午夜| 香蕉欧美| 精品一区二区三区四区外站| 中文字幕性感少妇av| 欲香欲色综合天天伊人| 久久综合日韩亚洲欧美| 久久成人午夜精品影院| 在线五区| 激情干在线| 亚洲九九视频| 国产最新小视频在线播放下载 | 99亚洲精品| 26uuu国产成人综合| 精品亚洲国产成人av网站| 中文字幕一品色图| 任你草| 综合伊人激情| 人妻大香蕉| 狼人久草| 东京热一区二区中文字幕| 97频视在线| 涩五月婷婷| 国产91福利小视频在线观看 | 日日黄色三级网站| 国产精品熟女丝袜一区二区| 久久久久久久精| 国模不卡一本二本三电影| 久久久成人国产精品无码| 欧美色宗合| 成人在线永久| 免费视频无码| 中国一级操逼视频| 亚洲欧洲综合| 日韩精品人妻系列无码天堂| 岛园激情| 国产无码精品成人| 国产精品乱码久久久、久久| 国产亚洲 中文欧美久久| 日韩色欲久久一二三四区| 久久久亚洲熟妇资源| 国产91精品久久久久久久网曝门| 91粉嫩萝控精品福利网站_精品影音先锋国| 中文字幕欧美日韩三级| 偷拍在线观看视频| 91久久久久免| 国产AV久久野战精品| 99久草| 91色色综合| 97精品国产97久久久久久户外免费| 久操视频资源站公开| 啊啊啊啊啊啊啊啊视频| 97精品一二区| 亚洲视频精选|