当前位置: 首页 > article >正文

Java快速实现安全可靠的 SMTP 邮件推送功能

本文将通过代码示例和详细说明,全面介绍如何使用 Java 实现 SMTP 邮件推送功能,涵盖以下内容:

  1. 不加密的 SMTP 邮件发送
  2. 使用 TLS 或 SSL 加密的邮件发送
  3. Session 对象的作用
  4. Transport.send(message) 的实现原理
  5. 邮件内容格式(纯文本、HTML)和附件添加
  6. SMTP 协议与 TLS/SSL 加密的关系

一、准备工作

1. 添加依赖

在 Maven 项目中添加 javax.mail 依赖:

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

二、发送 SMTP 邮件

1. 不加密的 SMTP 邮件

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

public class SimpleMailSender {
    public static void main(String[] args) {
        String host = "smtp.example.com";
        String username = "your-email@example.com";
        String password = "your-password";

        Properties props = new Properties();
        props.put("mail.smtp.host", host);
        props.put("mail.smtp.auth", "true");

        Session session = Session.getInstance(props, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(username, password);
            }
        });

        try {
            Message message = new MimeMessage(session);
            message.setFrom(new InternetAddress("from@example.com"));
            message.setRecipients(Message.RecipientType.TO, InternetAddress.parse("to@example.com"));
            message.setSubject("Plain Text Email");
            message.setText("This is a test email.");

            Transport.send(message);
            System.out.println("Email sent.");
        } catch (MessagingException e) {
            e.printStackTrace();
        }
    }
}

2. 使用 TLS 加密的 SMTP 邮件

// 配置 TLS
Properties props = new Properties();
props.put("mail.smtp.host", "smtp.example.com");
props.put("mail.smtp.port", "587");
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.starttls.enable", "true"); // 启用 TLS

3. 使用 SSL 加密的 SMTP 邮件

// 配置 SSL
Properties props = new Properties();
props.put("mail.smtp.host", "smtp.example.com");
props.put("mail.smtp.port", "465");
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.ssl.enable", "true"); // 启用 SSL
props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");

三、Session 对象详解

1. 作用

  • 配置管理:存储 SMTP 服务器地址、端口、认证方式等。
  • 上下文管理:维护邮件发送过程中的会话状态。
  • 创建邮件消息:通过 session 创建 MimeMessage 对象。

2. 创建方式

Session session = Session.getInstance(properties, authenticator);

四、Transport.send(message) 的实现原理

  1. 建立连接:根据 Session 配置与 SMTP 服务器建立 TCP 连接。
  2. 加密协商(若启用 TLS/SSL):
    • TLS:通过 STARTTLS 命令升级明文连接为加密连接。
    • SSL:直接建立 SSL 加密通道。
  3. 身份认证:使用 Authenticator 提供的用户名和密码登录。
  4. 发送数据:将 MimeMessage 转换为 SMTP 协议格式并传输。
  5. 关闭连接:发送完成后关闭连接。

五、邮件内容格式与附件

1. 纯文本与 HTML 格式

纯文本
message.setText("Plain text content");
HTML 格式
String html = "<h1>HTML Email</h1><p>This is <b>bold</b> text.</p>";
message.setContent(html, "text/html");

2. 添加附件

// 创建 Multipart 容器
Multipart multipart = new MimeMultipart();

// 正文部分
MimeBodyPart textPart = new MimeBodyPart();
textPart.setContent("Email body", "text/plain");

// 附件部分
MimeBodyPart attachmentPart = new MimeBodyPart();
DataSource source = new FileDataSource("file.pdf");
attachmentPart.setDataHandler(new DataHandler(source));
attachmentPart.setFileName("document.pdf");

// 组合内容
multipart.addBodyPart(textPart);
multipart.addBodyPart(attachmentPart);
message.setContent(multipart);

六、SMTP 与 TLS/SSL 的关系

1. 协议对比

特性SMTPSMTP + TLS (STARTTLS)SMTP + SSL (SMTPS)
加密方式先明文,后加密全程加密
默认端口25587465
安全性
现代系统推荐❌ 不推荐✔️ 推荐❌ 旧系统使用

2. 如何选择?

  • 生产环境:始终使用 TLS(端口 587)。
  • 旧系统兼容:可临时使用 SSL(端口 465)。
  • 测试环境:可使用不加密 SMTP(端口 25)。

七、总结

  1. 核心类与步骤

    • 使用 Session 配置邮件服务器参数。
    • 通过 MimeMessage 构建邮件内容。
    • 通过 Transport.send() 发送邮件。
  2. 安全建议

    • 始终优先使用 TLS 加密。
    • 避免在不安全网络中发送未加密邮件。

http://www.kler.cn/a/581723.html

相关文章:

  • 批量给 Excel 添加页眉页脚以及页码信息
  • Ubuntu 下 nginx-1.24.0 源码分析 - cycle->modules[i]->type
  • JavaWeb-Servlet6 入门
  • AWS容器化部署指南
  • HTML 表单详解
  • EB-Cable许可管理在云计算环境中的应用
  • 虚函数和虚表的原理是什么?
  • Python之pyqt5生成计算机前端页面并运行
  • Android :实现登录功能的思路
  • selenium的鼠标操作
  • SpringBoot 统一异常处理
  • JavaScript(Web APIs)
  • springboot433-基于SpringBoot的流浪猫爱心救助系统(源码+数据库+纯前后端分离+部署讲解等)
  • 消防行业如何借助 TDengine 打造高效的数据监控与分析系统
  • Spring(七)AOP-代理模式
  • 【群晖 NAS】把微软bing的背景图自动更换为群晖DSM7.X登录界面和DSM欢迎信息的教程
  • 「 DelegateUI 」Ant-d 风格的 Qt Qml UI 套件
  • VMware虚拟机迁移失败的故障排查方法
  • 文献阅读 | Nature Methods | SCENIC: 单细胞调控网络推断和聚类
  • warning: remote HEAD refers to nonexistent ref, unable to checkout.