You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java使用Gmail SMTP通过代理发送邮件连接失败问题求助

原因分析
  • 你配置的http.proxyHost、http.proxyPort属于JDK通用HTTP代理参数,仅对HTTP/HTTPS协议请求生效,JavaMail的SMTP传输逻辑不读取该类配置,因此代理完全未生效。
  • 你设置了java.net.useSystemProxies为true,该参数会优先加载系统级代理配置,覆盖你手动指定的代理参数,进一步导致自定义代理失效。
  • 额外配置缺失:Gmail SMTP的587端口要求必须开启STARTTLS加密,你当前未配置该参数,即使代理生效也会连接失败。
解决方案

首先确认你的JavaMail版本为1.6.0及以上,该版本开始原生支持SMTP走HTTP代理连接,版本过低请先升级依赖。

正确配置示例

移除原有HTTP代理相关参数,替换为JavaMail专属SMTP代理配置,同时补充TLS加密配置,参考代码如下:

Properties props = new Properties();
// SMTP基础配置
props.put("mail.smtp.host", "smtp.gmail.com");
props.put("mail.smtp.port", "587");
// 启用TLS加密
props.put("mail.smtp.starttls.enable", "true");
// SMTP HTTP代理配置(核心修改)
props.put("mail.smtp.proxy.host", "192.168.20.2");
props.put("mail.smtp.proxy.port", "321");
// 若代理需要身份认证,补充如下配置
// props.put("mail.smtp.proxy.user", "代理用户名");
// props.put("mail.smtp.proxy.password", "代理密码");

Session session = Session.getInstance(props);
MimeMessage message = new MimeMessage(session);
try {
    message.setFrom(new InternetAddress(sender));
    message.addRecipient(Message.RecipientType.TO, new InternetAddress("asdf@gmail.com"));  
    message.setSubject("SUBJECT");
    message.setText("BODY");
    Transport transport = session.getTransport("smtp");
    transport.connect(sender, pass);
    transport.sendMessage(message, message.getAllRecipients());
    transport.close();
} catch (MessagingException me) {
    me.printStackTrace();   
}

特殊场景适配

如果你使用的是SOCKS代理,将上述SMTP代理配置替换为如下参数即可:

props.put("socksProxyHost", "192.168.20.2");
props.put("socksProxyPort", "321");

额外注意

Gmail当前已禁止普通账号密码直接登录SMTP服务,你需要先在Google账号内开启两步验证,之后生成应用专用密码,用该专用密码替换代码中的pass参数,否则会出现认证失败错误。

内容的提问来源于stack exchange,提问作者Andreww

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 15:30:00