JavaMail怎么使用?

wen python案例 3

本文目录导读:

JavaMail怎么使用?

  1. JavaMail 使用指南
  2. 添加依赖
  3. 发送纯文本邮件
  4. 发送 HTML 邮件
  5. 发送带附件的邮件
  6. 发送带内嵌图片的邮件
  7. 完整示例:可配置的邮件工具类
  8. 常见问题与注意事项

JavaMail 使用指南

JavaMail 是 Java 平台中用于发送和接收电子邮件的标准 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>

Gradle 项目

implementation 'javax.mail:javax.mail-api:1.6.2'
implementation 'com.sun.mail:javax.mail:1.6.2'

发送纯文本邮件

import javax.mail.*;
import javax.mail.internet.*;
import java.util.Properties;
public class EmailSender {
    public static void main(String[] args) {
        // 1. 创建配置属性
        Properties props = new Properties();
        props.put("mail.smtp.host", "smtp.gmail.com");  // SMTP服务器
        props.put("mail.smtp.port", "587");              // 端口
        props.put("mail.smtp.auth", "true");             // 需要认证
        props.put("mail.smtp.starttls.enable", "true");  // 启用TLS
        // 2. 创建认证信息
        Session session = Session.getInstance(props, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication("your-email@gmail.com", "your-password");
            }
        });
        try {
            // 3. 创建邮件消息
            Message message = new MimeMessage(session);
            // 设置发件人
            message.setFrom(new InternetAddress("your-email@gmail.com"));
            // 设置收件人
            message.setRecipients(Message.RecipientType.TO, 
                InternetAddress.parse("recipient@example.com"));
            // 设置邮件主题
            message.setSubject("测试邮件");
            // 设置邮件内容
            message.setText("这是一封测试邮件的内容");
            // 4. 发送邮件
            Transport.send(message);
            System.out.println("邮件发送成功!");
        } catch (MessagingException e) {
            e.printStackTrace();
        }
    }
}

发送 HTML 邮件

// 创建 HTML 格式的邮件内容
String htmlContent = """
    <html>
        <body>
            <h1 style="color: blue;">HTML邮件标题</h1>
            <p>这是一封 <b>HTML</b> 格式的邮件</p>
            <ul>
                <li>项目1</li>
                <li>项目2</li>
            </ul>
        </body>
    </html>
    """;
message.setContent(htmlContent, "text/html; charset=utf-8");

发送带附件的邮件

import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
// 创建多部分邮件
MimeMultipart multipart = new MimeMultipart();
// 创建文本部分
MimeBodyPart textPart = new MimeBodyPart();
textPart.setText("邮件正文", "utf-8");
multipart.addBodyPart(textPart);
// 创建附件部分
MimeBodyPart attachmentPart = new MimeBodyPart();
DataSource source = new FileDataSource("path/to/attachment.pdf");
attachmentPart.setDataHandler(new DataHandler(source));
attachmentPart.setFileName(source.getName());
multipart.addBodyPart(attachmentPart);
// 设置多部分内容
message.setContent(multipart);

发送带内嵌图片的邮件

// 创建多部分邮件
MimeMultipart multipart = new MimeMultipart("related");
// 创建HTML文本部分
MimeBodyPart htmlPart = new MimeBodyPart();
String htmlContent = """
    <html>
        <body>
            <h1>包含图片的邮件</h1>
            <img src="cid:image1" alt="内嵌图片"/>
        </body>
    </html>
    """;
htmlPart.setContent(htmlContent, "text/html; charset=utf-8");
multipart.addBodyPart(htmlPart);
// 创建图片部分
MimeBodyPart imagePart = new MimeBodyPart();
DataSource imageSource = new FileDataSource("path/to/image.jpg");
imagePart.setDataHandler(new DataHandler(imageSource));
imagePart.setContentID("<image1>");  // 设置内容ID,与HTML中的cid对应
imagePart.setDisposition(MimeBodyPart.INLINE);
multipart.addBodyPart(imagePart);
message.setContent(multipart);

完整示例:可配置的邮件工具类

import javax.mail.*;
import javax.mail.internet.*;
import java.util.*;
public class MailUtil {
    // 邮件配置
    private static final String SMTP_HOST = "smtp.gmail.com";
    private static final int SMTP_PORT = 587;
    private static final String USERNAME = "your-email@gmail.com";
    private static final String PASSWORD = "your-app-password";
    /**
     * 发送邮件
     * @param to 收件人
     * @param subject 主题
     * @param content 内容(支持HTML)
     * @param attachments 附件列表
     */
    public static void sendMail(String to, String subject, 
                               String content, List<File> attachments) 
            throws MessagingException {
        Properties props = createProperties();
        Session session = createSession(props);
        MimeMessage message = new MimeMessage(session);
        // 设置基本属性
        message.setFrom(new InternetAddress(USERNAME));
        message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
        message.setSubject(subject);
        message.setSentDate(new Date());
        // 构建内容
        if (attachments != null && !attachments.isEmpty()) {
            // 有附件
            MimeMultipart multipart = new MimeMultipart();
            // 文本部分
            MimeBodyPart textPart = new MimeBodyPart();
            textPart.setContent(content, "text/html; charset=utf-8");
            multipart.addBodyPart(textPart);
            // 附件部分
            for (File file : attachments) {
                MimeBodyPart attachmentPart = new MimeBodyPart();
                attachmentPart.attachFile(file);
                multipart.addBodyPart(attachmentPart);
            }
            message.setContent(multipart);
        } else {
            // 无附件
            message.setContent(content, "text/html; charset=utf-8");
        }
        // 发送邮件
        Transport.send(message);
    }
    private static Properties createProperties() {
        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");
        props.put("mail.debug", "true");  // 调试模式
        return props;
    }
    private static Session createSession(Properties props) {
        return Session.getInstance(props, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(USERNAME, PASSWORD);
            }
        });
    }
    // 使用示例
    public static void main(String[] args) {
        try {
            String to = "recipient@example.com";
            String subject = "测试邮件";
            String content = """
                <html>
                    <body>
                        <h2>测试邮件</h2>
                        <p>这是一封测试邮件,包含 <b>HTML</b> 格式</p>
                    </body>
                </html>
                """;
            List<File> attachments = Arrays.asList(
                new File("/path/to/file1.pdf"),
                new File("/path/to/file2.txt")
            );
            sendMail(to, subject, content, attachments);
            System.out.println("邮件发送成功!");
        } catch (MessagingException e) {
            System.err.println("邮件发送失败:" + e.getMessage());
            e.printStackTrace();
        }
    }
}

常见问题与注意事项

1 Gmail 特殊配置

// Gmail 需要使用 App Password
// 1. 开启两步验证
// 2. 生成应用密码 https://security.google.com/settings/security/apppasswords
// 3. 使用生成的应用密码代替普通密码
// 或者使用 OAuth2 认证(更安全)

2 常见 SMTP 服务器配置

邮箱提供商 SMTP服务器 端口 TLS/SSL
Gmail smtp.gmail.com 587/465 TLS/SSL
Outlook smtp.office365.com 587 TLS
QQ邮箱 smtp.qq.com 465/587 SSL/TLS
163邮箱 smtp.163.com 465/25 SSL

3 错误处理建议

try {
    // 发送邮件代码
} catch (AuthenticationFailedException e) {
    // 认证失败
    System.err.println("邮箱认证失败,请检查用户名密码");
} catch (SendFailedException e) {
    // 发送失败
    System.err.println("发送失败:" + e.getMessage());
} catch (MessagingException e) {
    // 其他邮件异常
    e.printStackTrace();
}

4 性能优化

// 1. 使用连接池(推荐 Jakarta Mail 2.x)
// 2. 关闭调试模式(生产环境)
props.put("mail.debug", "false");
// 3. 设置超时时间
props.put("mail.smtp.connectiontimeout", "10000");  // 连接超时
props.put("mail.smtp.timeout", "10000");             // 读取超时
props.put("mail.smtp.writetimeout", "10000");        // 写入超时

JavaMail 使用步骤:

  1. 配置邮件服务器属性
  2. 创建 Session 对象
  3. 创建 Message 对象
  4. 设置邮件内容(文本/HTML/附件)
  5. 发送邮件

关键点:

  • 需要正确的 SMTP 服务器地址和端口
  • 大多数邮箱需要开启 SMTP 服务并获取授权码
  • 支持文本、HTML、附件、内嵌图片等多种格式
  • 注意异常处理和超时设置

实际开发中,建议将邮件功能封装成工具类,方便复用和维护,对于更高的性能要求,可考虑使用 Spring Boot 的邮件支持模块。

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