使用Mailkit发送Gmail邮件时遇SSL/TLS连接错误(Android端)
解决方案
原因分析
Android设备/模拟器无法连接到证书吊销列表(CRL)服务器,导致Mailkit在验证Gmail SMTP证书时无法确认吊销状态,从而抛出SSL连接错误。Windows环境下通常能正常访问CRL服务器,因此无此问题。
解决办法
1. 自定义证书验证逻辑,忽略吊销检查
在创建SmtpClient后、调用Connect之前,添加证书验证回调,跳过吊销状态相关的错误检查:
SmtpClient smtpClient = new(); // 添加证书验证回调 smtpClient.ServerCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => { // 仅忽略吊销状态未知或离线吊销的错误 if (sslPolicyErrors == SslPolicyErrors.RemoteCertificateChainErrors) { foreach (var status in chain.ChainStatus) { if (status.Status != X509ChainStatusFlags.RevocationStatusUnknown && status.Status != X509ChainStatusFlags.OfflineRevocation) { return false; } } return true; } // 其他类型的SSL错误保持正常验证逻辑 return sslPolicyErrors == SslPolicyErrors.None; }; try { smtpClient.Connect("smtp.gmail.com", 465, SecureSocketOptions.SslOnConnect); smtpClient.Authenticate("gdtmailkit@gmail.com", "**App Password**"); smtpClient.Send(message); messageText.Text = "Message Sent"; } catch (Exception ex) { messageText.Text = ex.Message; } finally { smtpClient.Disconnect(true); smtpClient.Dispose(); }
2. 切换到TLS连接模式
尝试使用端口587和SecureSocketOptions.StartTls替代SSL直连,部分环境下TLS的证书验证逻辑对CRL服务器的依赖更低:
// 替换原Connect调用 smtpClient.Connect("smtp.gmail.com", 587, SecureSocketOptions.StartTls);
3. 检查Android网络配置
- 确认模拟器/设备的网络可正常访问外网,部分模拟器默认网络受限会导致无法连接CRL服务器;
- 确保AndroidManifest.xml中已添加INTERNET权限:
<uses-permission android:name="android.permission.INTERNET" />
内容的提问来源于stack exchange,提问作者Glenn Taylor
相关产品推荐
相关产品推荐

