java代码怎么发送邮件
- 后端开发
- 2025-08-24
- 5
javax.mail
库发送邮件,先配置SMTP服务器参数、创建会话对象,再构建邮件内容(含收件人等),最后通过Transport类发送。
环境准备与依赖配置
-
添加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
简化操作。 -
选择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生态中可通过自动化配置大幅提升开发效率:
- 配置文件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
- 注入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); // 快速发送纯文本邮件 }
- 支持模板引擎渲染(如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);