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

使用Java Mail API发送邮件时出现SMTP协议错误求助

Java Mail API SMTP协议错误的排查与解决

嘿,我看你在用Java Mail API发送邮件时碰到了SMTP协议错误,咱们来一步步拆解问题、解决它!

首先看你代码里的核心问题:你把SMTP主机设置成了localhost,这意味着程序会尝试连接本地运行的SMTP服务器,但如果你的电脑上没有启动并配置好本地SMTP服务,肯定会抛出连接失败或者协议错误。

接下来给你两种可行的解决方案:

方案一:改用公共邮箱服务商的SMTP服务器

这是最常用的方式,比如用Gmail、Yahoo的SMTP服务,不过要注意现在主流邮箱都加强了安全验证,得做对应的配置。

以Gmail为例的完整配置代码

首先,Gmail需要你开启两步验证,然后创建一个应用专用密码(不能直接用你的邮箱登录密码),然后修改代码如下:

import javax.mail.*;
import javax.mail.internet.*;
import java.util.Properties;

public class SendEmail {
    public static void main(String[] args) {
        String to = "sugandhnikhil@yahoo.com";
        String from = "sugandh.nikhil@gmail.com";
        // 替换成你的Gmail应用专用密码
        String password = "你的应用专用密码";

        // 配置SMTP属性
        Properties properties = new Properties();
        properties.put("mail.smtp.host", "smtp.gmail.com");
        properties.put("mail.smtp.port", "587");
        properties.put("mail.smtp.auth", "true");
        properties.put("mail.smtp.starttls.enable", "true"); // 启用TLS加密

        // 创建带认证的Session
        Session session = Session.getInstance(properties, new Authenticator() {
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(from, password);
            }
        });

        try {
            // 构建完整的MimeMessage
            MimeMessage message = new MimeMessage(session);
            message.setFrom(new InternetAddress(from));
            message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
            message.setSubject("测试邮件");
            message.setText("这是用Java Mail API发送的测试邮件!");

            // 发送邮件
            Transport.send(message);
            System.out.println("邮件发送成功!");
        } catch (MessagingException mex) {
            mex.printStackTrace();
        }
    }
}

注意事项

  • 如果用Yahoo邮箱,SMTP主机是smtp.mail.yahoo.com,端口587,同样需要开启应用密码(具体看Yahoo的安全设置)
  • 不要忘记添加Java Mail API的依赖,比如Maven的话:
<dependency>
    <groupId>javax.mail</groupId>
    <artifactId>javax.mail-api</artifactId>
    <version>1.6.2</version>
</dependency>
<dependency>
    <groupId>com.sun.mail</groupId>
    <artifactId>javax.mail</artifactId>
    <version>1.6.2</version>
</dependency>

方案二:配置本地SMTP服务器

如果你非要用localhost作为SMTP主机,你需要在本地搭建一个SMTP服务器:

  • Windows系统可以安装hMailServer或者PaperCut SMTP(后者是轻量测试用)
  • Linux系统可以安装Postfix或者Exim
  • 也可以用Java内嵌的SMTP服务器,比如Apache James,不过配置相对复杂

搭建完成后,确保服务器监听localhost的25端口(默认SMTP端口),并且没有被防火墙或杀毒软件拦截,然后再运行你的代码。

常见排查点

  • 检查SMTP端口是否被拦截:可以用telnet smtp.gmail.com 587测试端口是否能连通
  • 确认邮箱服务商的安全设置:比如Gmail是否开启了两步验证、是否允许应用专用密码
  • 你的代码里MimeMessage的构建不完整(你写的是MimeMessage message = new Mime...),要确保完成消息的所有必要设置(发件人、收件人、主题、内容等)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:55:49