Java发送Gmail邮件遇连接超时及认证失败问题求助
解决Java通过Gmail SMTP发送邮件的问题
一、端口错误的修正
Gmail SMTP的可用端口为:
- 587(TLS加密,推荐)
- 465(SSL加密)
你之前使用的547端口是错误的,改为587是正确的第一步。
二、核心认证问题:AuthenticationFailedException的解决
谷歌已移除「低安全应用访问」选项,目前有两种可行方案:
方案1:应用专用密码(App Password)
前置要求:谷歌账号必须开启两步验证(2FA)
操作步骤:
- 登录谷歌账号,进入「安全」设置界面
- 找到「应用专用密码」选项(仅开启2FA后可见)
- 选择「邮件」应用,设备选「其他」并自定义命名,生成专用密码
- 将代码中的
fromUserPassword替换为该专用密码,而非谷歌账号原密码
方案2:OAuth2认证(适合长期/企业项目)
若无需两步验证,或追求更高安全性,可采用OAuth2:
- 在谷歌云平台创建项目,启用Gmail API
- 创建OAuth客户端ID,获取客户端密钥与ID
- 借助JavaMail内置的OAuth2扩展实现认证(无需额外依赖包)
三、代码中的BUG修复
你的代码存在几处逻辑错误,需同步修正:
- MimeMessage初始化时机错误:
类成员变量中直接初始化MimeMessage时,newSession仍为null,会导致后续异常。需在setupServerProperties()初始化newSession后再创建MimeMessage。 - Content类型格式错误:
bodyPart.setContent(emailBody, "html/text");应改为"text/html",类型顺序颠倒。 - Session获取方式优化:
推荐使用Session.getInstance(properties, null)替代getDefaultInstance,后者会共享全局Session,易引发配置冲突。
修复后的核心代码片段:
public class Mail { Session newSession = null; MimeMultipart multiPart = new MimeMultipart(); MimeMessage mimeMessage; // 先声明,延迟初始化 public static void main(String[] args) throws MessagingException, IOException, AddressException { Mail mail = new Mail(); mail.setupServerProperties(); mail.draftEmail(); mail.sendEmail(); } private void setupServerProperties() { Properties properties = System.getProperties(); properties.put("mail.smtp.port", "587"); properties.put("mail.smtp.auth", "true"); properties.put("mail.smtp.starttls.enable", "true"); newSession = Session.getInstance(properties, null); // 使用getInstance mimeMessage = new MimeMessage(newSession); // 初始化MimeMessage } private MimeMessage draftEmail() throws AddressException, MessagingException, IOException { String[] emailRecipients = {"abcd@gmail.com", "abcde@gmail.com"}; String emailSubject = "Test Mail"; String emailBody = "Test body of email"; for(int i =0; i< emailRecipients.length; i++ ){ mimeMessage.addRecipient(Message.RecipientType.TO, new InternetAddress(emailRecipients[i])); System.out.println("This is i" + i); } MimeBodyPart bodyPart = new MimeBodyPart(); bodyPart.setContent(emailBody, "text/html"); // 修正Content类型 multiPart.addBodyPart(bodyPart); mimeMessage.setContent(multiPart); return mimeMessage; } private void sendEmail() throws MessagingException{ String fromUser = "yourPersonalEmail@gmail.com"; String fromUserPassword = "生成的应用专用密码"; // 替换为专用密码 String emailHost = "smtp.gmail.com"; Transport transport = newSession.getTransport("smtp"); transport.connect(emailHost, fromUser, fromUserPassword); transport.sendMessage(mimeMessage, mimeMessage.getAllRecipients()); transport.close(); System.out.println("Email Successfully sent"); } }
四、测试注意事项
- 确认网络未拦截587端口(防火墙、代理可能影响连接)
- 使用应用专用密码时,务必确保账号已开启两步验证
- 采用OAuth2方案时,需先完成谷歌云平台的配置流程
内容的提问来源于stack exchange,提问作者Cameron Fox
相关产品推荐
相关产品推荐

