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
相关产品推荐
相关产品推荐

