当前位置:首页 > 后端开发 > 正文

java代码怎么发送邮件

Java中,可借助 javax.mail库发送邮件,先配置SMTP服务器参数、创建会话对象,再构建邮件内容(含收件人等),最后通过Transport类发送。

环境准备与依赖配置

  1. 添加Maven依赖
    在项目的pom.xml中引入JavaMail API及其相关库:

    <dependency>
        <groupId>com.sun.mail</groupId>
        <artifactId>javax.mail</artifactId>
        <version>2.0.1</version>
    </dependency>

    若使用Spring Boot框架,可进一步添加spring-boot-starter-mail简化操作。

  2. 选择SMTP服务供应商
    常见邮箱服务商的配置参数示例如下表:
    | 提供商 | 主机地址 | 端口号 | 加密协议 |
    |————–|——————|——–|—————-|
    | Gmail | smtp.gmail.com | 465 | SSL/TLS |
    | QQ Mail | smtp.qq.com | 587 | STARTTLS |
    | 163 Mail | smtp.163.com | 465 | SSL |


核心实现步骤(纯JavaMail方式)

步骤1:创建会话Session

通过Properties对象设置SMTP服务器参数,并建立邮件会话:

import java.util.Properties;
import javax.mail.;
import javax.mail.internet.;
// 配置服务器信息
Properties prop = new Properties();
prop.put("mail.smtp.host", "smtp.example.com");      // 替换为实际SMTP地址
prop.put("mail.smtp.port", "465");                   // 根据服务商调整端口
prop.put("mail.smtp.auth", "true");                  // 启用身份验证
prop.put("mail.smtp.ssl.enable", "true");             // 使用SSL加密连接
// 创建认证器(账号+授权码/密码)
Authenticator authenticator = new Authenticator() {
    @Override
    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication("your@email.com", "your_password_or_token");
    }
};
Session session = Session.getInstance(prop, authenticator);
session.setDebug(true); // 开启调试模式便于排查问题

注意:Gmail等邮箱需使用“应用专用密码”而非常规密码,部分服务商要求开启两步验证后生成授权码。

步骤2:构建MIME消息体

支持文本、HTML、附件等多种格式的组合:

// 创建MIME类型的消息对象
MimeMessage message = new MimeMessage(session);
// 设置基本信息
InternetAddress fromAddr = new InternetAddress("sender@example.com");
message.setFrom(fromAddr);          // 发件人
message.setRecipient(Message.RecipientType.TO, new InternetAddress("receiver@test.com")); // 收件人
message.setSubject("测试主题");                                 // 邮件标题
// 构造复杂内容(以HTML为例)
MimeBodyPart textPart = new MimeBodyPart();
textPart.setContent("<h1 style='color:red;'>欢迎使用JavaMail!</h1>", "text/html;charset=UTF-8");
Multipart multipart = new MimeMultipart();
multipart.addBodyPart(textPart);
// 添加附件(可选)
if (needAttachment) {
    MimeBodyPart attachmentPart = new MimeBodyPart();
    FileDataSource fds = new FileDataSource("path/to/file.pdf");
    attachmentPart.setDataHandler(new DataHandler(fds));
    attachmentPart.setFileName("document.pdf");
    multipart.addBodyPart(attachmentPart);
}
message.setContent(multipart);      // 整合全部内容到消息体

步骤3:发送邮件

通过Transport类完成最终投递:

try {
    Transport.send(message);         // 同步发送模式
    System.out.println("邮件已成功发送!");
} catch (MessagingException e) {
    e.printStackTrace();              // 处理异常(如认证失败、网络中断等)
}

对于大量并发场景,建议采用异步发送方式避免阻塞主线程。


Spring Boot集成方案(推荐)

在Spring生态中可通过自动化配置大幅提升开发效率:

java代码怎么发送邮件  第1张

  1. 配置文件application.properties添加参数
    spring.mail.host=smtp.example.com
    spring.mail.port=465
    spring.mail.username=your@email.com
    spring.mail.password=your_token      # 注意安全存储敏感信息!
    spring.mail.properties.mail.smtp.ssl.enable=true
  2. 注入JavaMailSender并封装工具类
    @Autowired private JavaMailSender mailSender;
    public void sendSimpleEmail(String to, String subject, String content) throws MessagingException {
         SimpleMailMessage msg = new SimpleMailMessage();
         msg.setTo(to);
         msg.setSubject(subject);
         msg.setText(content);
         mailSender.send(msg);          // 快速发送纯文本邮件
    }
  3. 支持模板引擎渲染(如Thymeleaf):
    结合模板文件动态生成邮件正文,实现业务解耦。

典型问题排查手册

现象 可能原因 解决方案
Authentication failed 错误的用户名或密码 检查是否使用了授权码代替真实密码
Connection timed out 防火墙阻止出站端口 确保服务器允许通过指定端口通信
Unsupported encoding MIME头未声明字符集 显式指定charset=UTF-8
ClassCastException 依赖冲突导致API版本不兼容 排除重复依赖项并统一版本号

FAQs相关问答

Q1:为什么会出现“Authentication failed”错误?如何修复?
A:该错误通常由以下原因导致:①使用了普通密码而非应用专用密码(如Gmail需单独创建);②SMTP服务的访问权限未开启(例如未启用“允许不够安全的应用”选项),解决方法是生成新的授权码,并在代码中使用该令牌进行认证,确认账号未开启二次验证干扰流程。

Q2:如何实现带嵌入图片的HTML邮件?
A:有两种主流方式:①将图片作为CIDR URL引用(推荐),例如<img src="cid:imageId">,然后通过MimeBodyPart添加对应资源;②直接使用Base64编码后的Data URL,前者更适合外部存储的图片文件,后者适用于小图标内联场景,示例代码片段:

// 创建图片资源节点
MimeBodyPart imagePart = new MimeBodyPart();
imagePart.setHeader("Content-ID", "<imageId>"); // 与HTML中的cid匹配
imagePart.setDataHandler(new DataHandler(new FileDataSource("logo.png")));
multipart.addBodyPart(imagePart);

0