C#使用SMTP腾讯企业邮箱发送邮件465端口总是提示超时(号外!号外!587、587、587)
现象
C# SmtpClient发送邮件主要代码
C# 全选
using (SmtpClient mSmtpClient = new SmtpClient())
{
mSmtpClient.Host = mailinfo.ServerHost;
mSmtpClient.Port = mailinfo.ServerPort;
mSmtpClient.UseDefaultCredentials = false;
mSmtpClient.EnableSsl = mailinfo.mEnableSsl;
if (mailinfo.mEnablePwdAuthentication)
{
System.Net.NetworkCredential nc = new System.Net.NetworkCredential(mailinfo.UserName, mailinfo.Password);
//mSmtpClient.Credentials = new System.Net.NetworkCredential(this.mSenderUsername, this.mSenderPassword);
//NTLM: Secure Password Authentication in Microsoft Outlook Express
mSmtpClient.Credentials = nc;
//mSmtpClient.Credentials = nc.GetCredfEnableSslential(mSmtpClient.Host, mSmtpClient.Port, "NTLM");
}
else
{
mSmtpClient.Credentials = new System.Net.NetworkCredential(mailinfo.UserName, mailinfo.Password);
}
mSmtpClient.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network;
mSmtpClient.Send(mMailMessage);
}邮箱参数:
| Server | smtp.exmail.qq.com |
| Port | 465 |
| Is_ssl | Y |
| userName | *** |
| Password | *** |
mSmtpClient.Send总是提示超时。
相同的参数在其他项目中(JAVA),就可以正常发送邮件
原因:
email - What is the difference between ports 465 and 587? - Stack Overflow
解决方案
不要用465端口,改用587端口。587端口。587端口.。什么IPV6啦,加大超时时间啦,统统不好使
| Server | smtp.exmail.qq.com |
| Port | 587 |
| Is_ssl | Y |
| userName | *** |
| Password | *** |
那为什么java项目中用465就可以发送邮件?
C# 和 Java 对 SMTP 端口/SSL 的处理方式不同,我给你详细分析一下原理:
1️⃣ SMTP 端口和加密模式
SMTP 常用端口:
| 端口 | 加密方式 | 说明 |
|---|---|---|
| 25 | 明文 / STARTTLS | 标准 SMTP,一般用于服务器间转发,客户端可能被封 |
| 465 | SSL/TLS | SMTPS,连接时就加密(隐式 SSL) |
| 587 | STARTTLS | SMTP 提交端口,客户端先明文连接,然后升级到 TLS(显式 TLS) |
2️⃣ Java 与 C# 默认行为差异
Java (javax.mail):
Java 邮件库在连接 465/587 时会自动检测和升级:
mail.smtp.ssl.enable=true→ 使用 SSL/TLS(465)mail.smtp.starttls.enable=true→ 使用 STARTTLS(587)
如果你用 465 但没启用
ssl.enable,Java 可能依然能自动切换或容错。Java 的 SMTP 库在失败时会自动尝试 STARTTLS 升级,所以你用原来的端口也能成功。
C# (SmtpClient):
C# 的
SmtpClient不会自动升级:EnableSsl = true→ 表示整个连接必须 SSL,适合 465 端口如果你用 465 并且
EnableSsl=false→ 会超时如果你用 587 并且
EnableSsl=true→ C# 会正确使用 STARTTLS
也就是说,C# 不像 Java 会自动“试探”加密模式,你必须明确指定端口 +
EnableSsl配置。
版权声明:本文为YES开发框架网发布内容,转载请附上原文出处连接
post 张国生


