Java案例如何实现邮件发送功能?

wen java案例 247

本文目录导读:

Java案例如何实现邮件发送功能?

  1. 添加 Maven 依赖
  2. 核心代码实现
  3. 常见邮箱 SMTP 配置参考
  4. 使用 SSL 连接(端口 465)
  5. 发送带附件的邮件
  6. 常见问题与排查
  7. 生产环境建议

Java 实现邮件发送功能通常使用 JavaMail 相关 API,虽然 Java 标准版(Java SE)不直接包含 JavaMail,但可以通过添加依赖(如 javax.mail 或 jakarta.mail)来实现。

下面是一个从零开始的完整案例,包含依赖导入、核心代码和常见配置。


添加 Maven 依赖

如果使用 Maven 项目,在 pom.xml 中添加以下依赖(二选一,取决于你的 Java 或 Spring Boot 版本):

方案 A:Java 8 / javax.mail(传统方式)

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

方案 B:Java 11+ / jakarta.mail(新标准,推荐)

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

注意:如果你使用 Spring Boot,它已经内置了 spring-boot-starter-mail,其中自动包含了相关依赖。


核心代码实现

以下是一个可直接运行的纯 Java 邮件发送类(以 javax.mail 为例,jakarta.mail 用法几乎相同,仅包名不同):

import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;
public class EmailSender {
    // 发件人邮箱配置(以 QQ 邮箱为例)
    private static final String SENDER_EMAIL = "your_email@qq.com";
    // 授权码(不是登录密码!)
    private static final String SENDER_PASSWORD = "your_authorization_code";
    // SMTP 服务器地址
    private static final String SMTP_HOST = "smtp.qq.com";
    private static final int SMTP_PORT = 587;  // 或 465(SSL)
    public static void main(String[] args) {
        // 收件人
        String recipient = "recipient@example.com";
        String subject = "Java 邮件发送测试";
        String content = "<h1>Hello!</h1><p>这是来自 Java 程序的测试邮件。</p>";
        sendEmail(recipient, subject, content);
    }
    public static void sendEmail(String recipient, String subject, String content) {
        // 1. 设置连接属性
        Properties props = new Properties();
        props.put("mail.smtp.host", SMTP_HOST);
        props.put("mail.smtp.port", SMTP_PORT);
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.starttls.enable", "true"); // 启用 TLS
        // 2. 创建 Session(身份验证)
        Session session = Session.getInstance(props, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(SENDER_EMAIL, SENDER_PASSWORD);
            }
        });
        // 可选:开启调试模式,打印与 SMTP 的交互日志
        session.setDebug(true);
        try {
            // 3. 创建邮件对象
            Message message = new MimeMessage(session);
            message.setFrom(new InternetAddress(SENDER_EMAIL));
            message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(recipient));
            message.setSubject(subject);
            // 设置内容为 HTML 格式(也可设为纯文本:message.setText(content))
            message.setContent(content, "text/html; charset=utf-8");
            // 4. 发送邮件
            Transport.send(message);
            System.out.println("邮件发送成功!");
        } catch (MessagingException e) {
            e.printStackTrace();
            System.err.println("邮件发送失败:" + e.getMessage());
        }
    }
}

常见邮箱 SMTP 配置参考

邮箱服务 SMTP服务器 端口(TLS/SSL) 特殊说明
QQ邮箱 smtp.qq.com 587 (TLS) / 465 (SSL) 需开启 SMTP服务 并获取 授权码
163邮箱 smtp.163.com 25 / 465 (SSL) 同样需要授权码
Gmail smtp.gmail.com 587 (TLS) / 465 (SSL) 需开启“允许不够安全的应用”或使用应用专用密码
Outlook smtp.office365.com 587 (TLS) 使用邮箱密码即可(部分需应用密码)

关于授权码:以 QQ 邮箱为例,登录网页版 → 设置 → 账户 → 开启“POP3/SMTP服务”,系统会生成一个 16 位授权码,填入代码中作为密码,不要使用邮箱登录密码。


使用 SSL 连接(端口 465)

如果选择 SSL 方式连接,修改 props 配置如下:

Properties props = new Properties();
props.put("mail.smtp.host", SMTP_HOST);
props.put("mail.smtp.port", "465");
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.socketFactory.port", "465");
props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");

其余代码不变。


发送带附件的邮件

如果需要添加附件,使用 MimeBodyPart 和 Multipart 组合:

import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMultipart;
import java.io.File;
// 在创建 Message 后添加以下逻辑:
MimeBodyPart textPart = new MimeBodyPart();
textPart.setContent(content, "text/html; charset=utf-8");
MimeBodyPart attachmentPart = new MimeBodyPart();
attachmentPart.attachFile(new File("文件路径/example.pdf"));
Multipart multipart = new MimeMultipart();
multipart.addBodyPart(textPart);
multipart.addBodyPart(attachmentPart);
message.setContent(multipart);

常见问题与排查

问题 检查方向
AuthenticationFailedException 检查邮箱账号和授权码是否正确
Could not connect to SMTP host 检查 SMTP 地址、端口、防火墙是否开放
com.sun.mail.util.MailConnectException 检查网络能否访问外网,某些公司内网会屏蔽 SMTP
国内邮箱发送被拒 尝试启用 SSL 或更换端口
发送超时 适当增加超时设置:props.put("mail.smtp.connectiontimeout", "5000")

生产环境建议

  • 不要硬编码密码:使用配置文件(application.yml / 环境变量)读取敏感信息。
  • 使用 Spring Boot 的 MailSender:可以更优雅地实现,只需配置 spring.mail.* 属性即可。
  • 异步发送:如果邮件发送较慢,建议使用线程池或消息队列处理,避免阻塞业务主流程。

抱歉,评论功能暂时关闭!

友情链接攻略窝 · 礼包窝 · 配置窝 · 换算窝 · 算法窝 · 查文窝 · 手册窝 · 问答窝 · 全文搜 · 手册库
相关站点礼包窝 · 查文窝