0

0

如何用Java发送邮件 Java发送邮件的步骤与示例

蓮花仙者

蓮花仙者

发布时间:2025-07-22 18:24:01

|

714人浏览过

|

来源于php中文网

原创

要使用java发送邮件,核心是利用javamail api,步骤如下:1. 引入javamail依赖,如在maven项目中添加对应dependency;2. 配置smtp服务器信息,包括host、port、认证方式等;3. 创建session对象,用于与邮件服务器建立会话;4. 构建mimemessage对象,设置发件人、收件人、主题和内容;5. 使用transport类发送邮件。若需发送html内容或附件,需使用mimemultipart和mimebodypart组合邮件内容。常见问题如认证失败、连接超时、ssl/tls握手失败等,需检查用户名密码、网络配置及证书设置。在spring boot项目中,可通过引入spring-boot-starter-mail模块并配置邮件属性,结合javamailsender和mimemessagehelper简化邮件发送流程,实现更优雅的集成。

如何用Java发送邮件 Java发送邮件的步骤与示例

用Java发送邮件,核心在于利用JavaMail API,它提供了一套标准接口来处理邮件的发送、接收和管理。你只需要配置好SMTP服务器信息,构建邮件内容,然后通过Transport类就能轻松发送出去。这听起来可能有点技术性,但实际操作起来,步骤是相当清晰的。

如何用Java发送邮件 Java发送邮件的步骤与示例

解决方案

其实,用Java发邮件这事儿,核心就是那么几步,它依赖于JavaMail API。首先,你得把JavaMail的库引入到你的项目里,如果你用Maven,那就在pom.xml里加:


    com.sun.mail
    jakarta.mail
    2.0.1 


    jakarta.activation
    jakarta.activation-api
    2.0.1

接着,就是编写发送邮件的代码了。我个人觉得,最关键的是理解邮件会话(Session)和邮件内容(MimeMessage)这两个概念。

立即学习Java免费学习笔记(深入)”;

如何用Java发送邮件 Java发送邮件的步骤与示例
import jakarta.mail.*;
import jakarta.mail.internet.*;
import java.util.Properties;

public class EmailSender {

    public static void main(String[] args) {
        // 1. 配置邮件服务器属性
        // 这一步就像告诉你的程序,你要通过哪个邮局(SMTP服务器)寄信
        Properties props = new Properties();
        props.put("mail.smtp.host", "smtp.example.com"); // 替换为你的SMTP服务器地址,例如smtp.qq.com, smtp.gmail.com
        props.put("mail.smtp.port", "587"); // SMTP端口,通常是25, 465(SSL), 587(TLS)
        props.put("mail.smtp.auth", "true"); // 需要认证
        props.put("mail.smtp.starttls.enable", "true"); // 启用TLS加密

        // 如果是SSL/TLS端口,比如Gmail的465,可能需要这样配置
        // props.put("mail.smtp.socketFactory.port", "465");
        // props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
        // props.put("mail.smtp.ssl.enable", "true"); // 启用SSL

        // 2. 创建Session对象
        // Session就像你和邮局之间建立的一个会话,通过它来处理所有的邮件操作
        Session session = Session.getInstance(props, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                // 替换为你的邮箱地址和授权码(或密码)
                // 很多邮箱服务为了安全,需要使用授权码而非登录密码
                return new PasswordAuthentication("your_email@example.com", "your_authorization_code");
            }
        });

        // 开启调试模式,可以看到更详细的发送过程日志,排查问题很有用
        // session.setDebug(true);

        try {
            // 3. 创建MimeMessage对象
            // 这就是你要发送的那封信了,可以设置发件人、收件人、主题、内容等等
            MimeMessage message = new MimeMessage(session);

            // 设置发件人
            message.setFrom(new InternetAddress("your_email@example.com"));

            // 设置收件人
            // To: 主要收件人
            message.setRecipients(Message.RecipientType.TO, InternetAddress.parse("recipient_email@example.com"));
            // Cc: 抄送
            // message.setRecipients(Message.RecipientType.CC, InternetAddress.parse("cc_email@example.com"));
            // Bcc: 密送
            // message.setRecipients(Message.RecipientType.BCC, InternetAddress.parse("bcc_email@example.com"));

            // 设置邮件主题
            message.setSubject("Java发送邮件测试 - " + System.currentTimeMillis());

            // 设置邮件内容
            // 默认是纯文本
            message.setText("你好,这是一封通过Java程序发送的测试邮件。希望你能收到!");

            // 4. 发送邮件
            // Transport就是那个帮你把信寄出去的“邮递员”
            Transport.send(message);

            System.out.println("邮件发送成功!");

        } catch (MessagingException e) {
            // 捕获发送过程中可能出现的异常
            System.err.println("邮件发送失败:" + e.getMessage());
            e.printStackTrace();
        }
    }
}

这段代码,基本上涵盖了邮件发送的骨架。你需要做的就是替换那些占位符,比如SMTP服务器地址、端口、你的邮箱和授权码,以及收件人地址。我特别强调一下“授权码”这东西,现在很多邮箱服务,比如QQ邮箱、Gmail等,出于安全考虑,不再允许直接使用登录密码进行SMTP认证,而是需要你生成一个“授权码”或“应用专用密码”。这个在你的邮箱设置里通常能找到。

JavaMail API发送邮件时如何处理附件和HTML内容?

发送纯文本邮件固然简单,但在实际应用中,我们经常需要发送带有格式的HTML邮件,或者附带文件。JavaMail API当然考虑到了这一点,它通过MimeMultipartMimeBodyPart来优雅地处理这些复杂场景。这就像你要寄一封信,信里不仅有文字,还想塞一张照片进去,或者信纸本身就是彩色的、有排版的。

如何用Java发送邮件 Java发送邮件的步骤与示例

要发送HTML内容,你只需要在设置邮件内容时,指定其MIME类型为text/html

// ... (前面的Session和MimeMessage创建保持不变) ...

// 设置HTML邮件内容
String htmlContent = "

你好!

" + "

这是一封HTML格式的测试邮件,通过Java发送。

" + "

希望你能看到漂亮的排版和加粗的文字!

" + "@@##@@"; // 也可以包含图片链接 message.setContent(htmlContent, "text/html; charset=utf-8"); // 明确指定内容类型和字符编码 // ... (后续的Transport.send(message)保持不变) ...

至于附件,那就稍微复杂一点点,但逻辑也很直观。你需要创建一个MimeMultipart对象作为邮件的“主体”,然后把文本内容和附件都作为MimeBodyPart添加到这个主体里。

import jakarta.activation.DataHandler;
import jakarta.activation.DataSource;
import jakarta.activation.FileDataSource;
// ... 其他导入 ...

// ... (前面的Session和MimeMessage创建保持不变) ...

try {
    MimeMessage message = new MimeMessage(session);
    // ... 设置发件人、收件人、主题 ...

    // 创建一个MimeMultipart对象,用于组合邮件的不同部分(文本、附件)
    Multipart multipart = new MimeMultipart();

    // 1. 添加邮件正文(可以是纯文本或HTML)
    BodyPart messageBodyPart = new MimeBodyPart();
    String htmlContent = "

你好!

" + "

这是一封带有附件的测试邮件,通过Java发送。

" + "

请查收附件。

"; messageBodyPart.setContent(htmlContent, "text/html; charset=utf-8"); multipart.addBodyPart(messageBodyPart); // 2. 添加附件 messageBodyPart = new MimeBodyPart(); String filename = "/path/to/your/file.pdf"; // 替换为你要发送的文件路径 DataSource source = new FileDataSource(filename); messageBodyPart.setDataHandler(new DataHandler(source)); messageBodyPart.setFileName(source.getName()); // 设置附件的文件名 multipart.addBodyPart(messageBodyPart); // 如果想添加多个附件,重复上述“添加附件”的步骤即可 // 将MimeMultipart对象设置为邮件的内容 message.setContent(multipart); // 4. 发送邮件 Transport.send(message); System.out.println("带附件和HTML内容的邮件发送成功!"); } catch (MessagingException e) { System.err.println("邮件发送失败:" + e.getMessage()); e.printStackTrace(); }

这里有个小细节,FileDataSource是用于从文件系统读取数据源的,如果你想从其他地方(比如内存中的字节数组)作为附件,可以考虑实现自己的DataSource。我个人觉得,这种分层组合的方式,虽然代码量多了一点,但逻辑上非常清晰,便于管理邮件的复杂结构。

SlidesAI
SlidesAI

使用SlidesAI的AI在几秒钟内创建演示文稿幻灯片

下载

JavaMail API发送邮件时常见的错误和解决方案有哪些?

在用JavaMail API发送邮件的过程中,我遇到过不少“坑”。这些问题往往不是代码逻辑上的错误,而是配置、网络或者邮件服务商策略导致的。理解这些常见问题及其解决方案,能让你在遇到困难时少走很多弯路。

  1. 认证失败 (Authentication Failed):

    • 问题描述: 收到 AuthenticationFailedException,通常提示用户名或密码错误。
    • 解决方案:
      • 检查用户名和密码/授权码: 确保你提供的邮箱地址和授权码(或密码)是正确的。很多邮箱服务(如Gmail、QQ邮箱、163邮箱)为了安全,需要你开启SMTP服务并生成一个“授权码”或“应用专用密码”来代替登录密码。
      • 检查SMTP服务器是否开启: 确保你的邮箱服务商已经允许SMTP客户端发送邮件。
      • 网络连接: 确认你的服务器或本地机器可以访问邮件服务商的SMTP服务器。
  2. 连接超时或无法连接 (Connection Timeout/Could not connect to SMTP host):

    • 问题描述: 出现 ConnectExceptionSocketTimeoutException,提示无法连接到SMTP主机或连接超时。
    • 解决方案:
      • 检查SMTP主机地址和端口: 确保 mail.smtp.hostmail.smtp.port 配置正确。例如,Gmail的SMTP是smtp.gmail.com,端口通常是587(TLS)或465(SSL)。
      • 防火墙问题: 检查你的服务器或本地机器的防火墙是否阻止了对SMTP端口的传出连接。
      • 网络问题: 确认网络连接稳定,DNS解析正常。可以尝试 ping smtp.example.comtelnet smtp.example.com 587 来测试连通性。
  3. SSL/TLS握手失败 (SSL/TLS Handshake Failure):

    • 问题描述: 出现与SSL/TLS相关的错误,例如 PKIX path building failedCould not convert socket to TLS
    • 解决方案:
      • SSL/TLS配置: 确保 mail.smtp.starttls.enable 设置为 true (对于587端口) 或 mail.smtp.ssl.enable 设置为 true (对于465端口)。
      • 证书问题: 有时是Java环境的CA证书库缺少了SMTP服务器的证书。这在生产环境中较少见,但在某些自签名证书或企业内部邮件服务器上可能发生。确保Java的cacerts文件是最新的,或者手动导入证书。
      • Java版本: 确保你的Java版本支持所需的TLS协议版本。
  4. 邮件地址格式不正确 (Invalid Address):

    • 问题描述: 出现 AddressException,提示邮件地址格式不合法。
    • 解决方案:
      • 检查邮件地址: 确保所有发件人、收件人、抄送、密送地址都符合标准的邮件格式,例如 user@domain.com
  5. 字符编码问题 (Garbled Characters):

    • 问题描述: 邮件内容在收件人端显示乱码。
    • 解决方案:
      • 明确指定编码: 在设置邮件内容时,务必指定字符编码,例如 message.setText(content, "utf-8")message.setContent(htmlContent, "text/html; charset=utf-8")。统一使用UTF-8是一个好习惯。

调试小技巧: 我个人强烈推荐在开发阶段开启JavaMail的调试模式,这能让你看到非常详细的SMTP会话日志,包括客户端和服务端之间的每一条命令和响应。这对于诊断连接、认证或传输问题非常有帮助。

session.setDebug(true); // 在创建Session后添加这行

通过观察这些日志,你通常能快速定位问题所在。比如,看到535 Authentication Failed就明确是认证问题,看到220 Service ready但后面没动静,可能就是防火墙或连接阻塞了。

在Spring Boot项目中如何更优雅地集成Java邮件发送功能?

如果你正在使用Spring Boot,那么恭喜你,发送邮件这事儿会变得异常简单和优雅。Spring Boot提供了一个spring-boot-starter-mail模块,它自动配置了JavaMailSender,让你几乎不用关心JavaMail API的底层细节。我个人觉得,这是Spring Boot最让人省心的地方之一。

首先,在你的pom.xml里引入这个Starter:


    org.springframework.boot
    spring-boot-starter-mail

接着,在application.propertiesapplication.yml中配置邮件服务器信息。这些配置项Spring Boot会自动识别并用来创建JavaMailSender实例:

# application.properties
spring.mail.host=smtp.example.com
spring.mail.port=587
spring.mail.username=your_email@example.com
spring.mail.password=your_authorization_code
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true # 有些服务器需要
# spring.mail.properties.mail.smtp.ssl.enable=true # 如果使用SSL,如465端口

然后,你就可以在你的服务类中直接注入JavaMailSender,并使用它来发送邮件了。Spring提供了一个MimeMessageHelper,它比直接操作MimeMessage要方便得多,尤其是在处理HTML内容和附件时。

import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;

import jakarta.mail.MessagingException;
import jakarta.mail.internet.MimeMessage;
import java.io.File;
import java.nio.charset.StandardCharsets;

@Service
public class EmailService {

    private final JavaMailSender mailSender;

    // Spring会自动注入JavaMailSender
    public EmailService(JavaMailSender mailSender) {
        this.mailSender = mailSender;
    }

    public void sendSimpleEmail(String to, String subject, String content) {
        try {
            MimeMessage message = mailSender.createMimeMessage();
            MimeMessageHelper helper = new MimeMessageHelper(message, true, StandardCharsets.UTF_8.name()); // true表示支持multipart/附件

            helper.setFrom("your_email@example.com"); // 发件人
            helper.setTo(to); // 收件人
            helper.setSubject(subject); // 主题
            helper.setText(content, true); // true表示内容是HTML

            // 如果要添加附件
            // File attachment = new File("/path/to/your/file.pdf");
            // helper.addAttachment(attachment.getName(), attachment);

            mailSender.send(message);
            System.out.println("邮件发送成功 (Spring Boot)!");
        } catch (MessagingException e) {
            System.err.println("邮件发送失败 (Spring Boot):" + e.getMessage());
            e.printStackTrace();
        }
    }

    // 示例:在某个地方调用
    public static void main(String[] args) {
        // 这部分需要在Spring Boot应用上下文中运行
        // 例如,在你的Application类中或者一个测试类中
        // SpringApplication.run(YourApplication.class, args);
        // EmailService emailService = context.getBean(EmailService.class);
        // emailService.sendSimpleEmail("recipient_email@example.com", "Spring Boot邮件测试", "

Hello from Spring Boot!

This is a test email.

"); } }

我个人非常喜欢MimeMessageHelper,它把很多繁琐的MimeBodyPartMimeMultipart操作都封装起来了,让发送复杂邮件变得非常直观。另外,在生产环境中,你可能还会考虑异步发送邮件,避免邮件发送的耗时操作阻塞主线程。Spring Boot可以配合@Async注解轻松实现异步发送,这对于提升用户体验和系统响应速度是很有价值的。你只需要在配置类上启用@EnableAsync,然后在发送邮件的方法上加上@Async即可。这种集成方式,无疑让邮件服务成为Spring Boot应用中一个非常自然且强大的组成部分。

示例图片

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

112

2025.08.06

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

28

2026.01.26

spring boot框架优点
spring boot框架优点

spring boot框架的优点有简化配置、快速开发、内嵌服务器、微服务支持、自动化测试和生态系统支持。本专题为大家提供spring boot相关的文章、下载、课程内容,供大家免费下载体验。

135

2023.09.05

spring框架有哪些
spring框架有哪些

spring框架有Spring Core、Spring MVC、Spring Data、Spring Security、Spring AOP和Spring Boot。详细介绍:1、Spring Core,通过将对象的创建和依赖关系的管理交给容器来实现,从而降低了组件之间的耦合度;2、Spring MVC,提供基于模型-视图-控制器的架构,用于开发灵活和可扩展的Web应用程序等。

390

2023.10.12

Java Spring Boot开发
Java Spring Boot开发

本专题围绕 Java 主流开发框架 Spring Boot 展开,系统讲解依赖注入、配置管理、数据访问、RESTful API、微服务架构与安全认证等核心知识,并通过电商平台、博客系统与企业管理系统等项目实战,帮助学员掌握使用 Spring Boot 快速开发高效、稳定的企业级应用。

70

2025.08.19

Java Spring Boot 4更新教程_Java Spring Boot 4有哪些新特性
Java Spring Boot 4更新教程_Java Spring Boot 4有哪些新特性

Spring Boot 是一个基于 Spring 框架的 Java 开发框架,它通过 约定优于配置的原则,大幅简化了 Spring 应用的初始搭建、配置和开发过程,让开发者可以快速构建独立的、生产级别的 Spring 应用,无需繁琐的样板配置,通常集成嵌入式服务器(如 Tomcat),提供“开箱即用”的体验,是构建微服务和 Web 应用的流行工具。

34

2025.12.22

Java Spring Boot 微服务实战
Java Spring Boot 微服务实战

本专题深入讲解 Java Spring Boot 在微服务架构中的应用,内容涵盖服务注册与发现、REST API开发、配置中心、负载均衡、熔断与限流、日志与监控。通过实际项目案例(如电商订单系统),帮助开发者掌握 从单体应用迁移到高可用微服务系统的完整流程与实战能力。

135

2025.12.24

Java Maven专题
Java Maven专题

本专题聚焦 Java 主流构建工具 Maven 的学习与应用,系统讲解项目结构、依赖管理、插件使用、生命周期与多模块项目配置。通过企业管理系统、Web 应用与微服务项目实战,帮助学员全面掌握 Maven 在 Java 项目构建与团队协作中的核心技能。

0

2025.09.15

Python 自然语言处理(NLP)基础与实战
Python 自然语言处理(NLP)基础与实战

本专题系统讲解 Python 在自然语言处理(NLP)领域的基础方法与实战应用,涵盖文本预处理(分词、去停用词)、词性标注、命名实体识别、关键词提取、情感分析,以及常用 NLP 库(NLTK、spaCy)的核心用法。通过真实文本案例,帮助学习者掌握 使用 Python 进行文本分析与语言数据处理的完整流程,适用于内容分析、舆情监测与智能文本应用场景。

10

2026.01.27

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号