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

Java发送Gmail邮件遇连接超时及认证失败问题求助

解决Java通过Gmail SMTP发送邮件的问题

一、端口错误的修正

Gmail SMTP的可用端口为:

  • 587(TLS加密,推荐)
  • 465(SSL加密)
    你之前使用的547端口是错误的,改为587是正确的第一步。

二、核心认证问题:AuthenticationFailedException的解决

谷歌已移除「低安全应用访问」选项,目前有两种可行方案:

方案1:应用专用密码(App Password)

前置要求:谷歌账号必须开启两步验证(2FA)
操作步骤:

  1. 登录谷歌账号,进入「安全」设置界面
  2. 找到「应用专用密码」选项(仅开启2FA后可见)
  3. 选择「邮件」应用,设备选「其他」并自定义命名,生成专用密码
  4. 将代码中的fromUserPassword替换为该专用密码,而非谷歌账号原密码

方案2:OAuth2认证(适合长期/企业项目)

若无需两步验证,或追求更高安全性,可采用OAuth2:

  • 在谷歌云平台创建项目,启用Gmail API
  • 创建OAuth客户端ID,获取客户端密钥与ID
  • 借助JavaMail内置的OAuth2扩展实现认证(无需额外依赖包)

三、代码中的BUG修复

你的代码存在几处逻辑错误,需同步修正:

  1. MimeMessage初始化时机错误:
    类成员变量中直接初始化MimeMessage时,newSession仍为null,会导致后续异常。需在setupServerProperties()初始化newSession后再创建MimeMessage。
  2. Content类型格式错误:
    bodyPart.setContent(emailBody, "html/text"); 应改为 "text/html",类型顺序颠倒。
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 02:55:23