当前位置:首页 > 技术 > 正文内容

使用Java和Spring实现邮件发送功能

访客 技术 2026年6月16日 1

Spring邮件配置指南

在Java应用中,通过Spring框架实现邮件发送功能是一个非常常见的需求。本文将详细介绍如何配置和使用Spring的邮件发送功能,包括基本的邮件配置和发送HTML邮件的实现方法。

Spring邮件配置步骤

  1. 添加必要的依赖

首先,确保你的项目中包含了Spring邮件发送相关的依赖。在Maven项目中,你需要添加以下依赖:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
    <version>5.3.20</version>
</dependency>
<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>
  1. 配置邮件发送属性

在src/main/resources目录下创建mail.properties文件,配置邮件服务器相关信息:

# 邮件服务器主机
mail.host=smtp.example.com
# 邮件服务器端口
mail.port=587
# 发件人邮箱
mail.username=your-email@example.com
# 发件人邮箱密码
mail.password=your-password
# 是否需要认证
mail.smtp.auth=true
# 启用TLS
mail.smtp.starttls.enable=true
  1. Spring配置文件配置

在Spring配置文件中,添加以下Bean配置:

<!-- 加载邮件配置文件 -->
<context:property-placeholder location="classpath:mail.properties"/>

<!-- 邮件发送器配置 -->
<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
    <property name="host" value="${mail.host}"/>
    <property name="port" value="${mail.port}"/>
    <property name="username" value="${mail.username}"/>
    <property name="password" value="${mail.password}"/>
    <property name="javaMailProperties">
        <props>
            <prop key="mail.smtp.auth">${mail.smtp.auth}</prop>
            <prop key="mail.smtp.starttls.enable">${mail.smtp.starttls.enable}</prop>
        </props>
    </property>
</bean>

<!-- 简单邮件消息配置 -->
<bean id="simpleMailMessage" class="org.springframework.mail.SimpleMailMessage">
    <property name="from" value="${mail.username}"/>
</bean>
  1. 邮件服务实现类

创建邮件服务类,实现邮件发送功能:

package com.example.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.ClassPathResource;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;

import javax.mail.internet.MimeMessage;
import java.io.UnsupportedEncodingException;

/**
 * 邮件服务实现类
 */
@Service
public class EmailService {

    @Autowired
    private JavaMailSender mailSender;
    
    @Autowired
    private SimpleMailMessage simpleMailMessage;

    /**
     * 发送简单文本邮件
     * @param subject 邮件主题
     * @param content 邮件内容
     * @param to 收件人邮箱
     */
    public void sendSimpleMail(String subject, String content, String to) {
        try {
            // 创建简单邮件消息
            SimpleMailMessage message = new SimpleMailMessage(simpleMailMessage);
            message.setTo(to);
            message.setSubject(subject);
            message.setText(content);
            
            // 发送邮件
            mailSender.send(message);
        } catch (Exception e) {
            System.out.println("发送邮件失败: " + e.getMessage());
        }
    }

    /**
     * 发送HTML邮件
     * @param subject 邮件主题
     * @param content HTML内容
     * @param to 收件人邮箱
     */
    public void sendHtmlMail(String subject, String content, String to) {
        try {
            // 创建MimeMessage
            MimeMessage mimeMessage = mailSender.createMimeMessage();
            
            // 创建MimeMessageHelper,设置支持多部分和编码为UTF-8
            MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true, "UTF-8");
            
            // 设置发件人
            messageHelper.setFrom(simpleMailMessage.getFrom());
            
            // 设置收件人
            messageHelper.setTo(to);
            
            // 设置邮件主题
            messageHelper.setSubject(subject);
            
            // 设置邮件内容,true表示HTML格式
            messageHelper.setText(content, true);
            
            // 发送邮件
            mailSender.send(mimeMessage);
        } catch (Exception e) {
            System.out.println("发送HTML邮件失败: " + e.getMessage());
        }
    }

    /**
     * 发送带附件的邮件
     * @param subject 邮件主题
     * @param content HTML内容
     * @param to 收件人邮箱
     * @param attachmentPath 附件路径(类路径)
     * @param attachmentName 附件名称
     */
    public void sendMailWithAttachment(String subject, String content, String to, 
                                      String attachmentPath, String attachmentName) {
        try {
            // 创建MimeMessage
            MimeMessage mimeMessage = mailSender.createMimeMessage();
            
            // 创建MimeMessageHelper,设置支持多部分和编码为UTF-8
            MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true, "UTF-8");
            
            // 设置发件人
            messageHelper.setFrom(simpleMailMessage.getFrom());
            
            // 设置收件人
            messageHelper.setTo(to);
            
            // 设置邮件主题
            messageHelper.setSubject(subject);
            
            // 设置邮件内容,true表示HTML格式
            messageHelper.setText(content, true);
            
            // 添加附件
            ClassPathResource file = new ClassPathResource(attachmentPath);
            messageHelper.addAttachment(attachmentName, file);
            
            // 发送邮件
            mailSender.send(mimeMessage);
        } catch (Exception e) {
            System.out.println("发送带附件邮件失败: " + e.getMessage());
        }
    }
}
  1. 使用邮件服务

在需要发送邮件的地方,注入EmailService并调用相应方法:

package com.example.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.example.service.EmailService;

@RestController
public class EmailController {

    @Autowired
    private EmailService emailService;

    /**
     * 发送简单文本邮件
     */
    @GetMapping("/sendSimpleMail")
    public String sendSimpleMail(@RequestParam String to, @RequestParam String subject, @RequestParam String content) {
        emailService.sendSimpleMail(subject, content, to);
        return "简单邮件已发送至: " + to;
    }

    /**
     * 发送HTML邮件
     */
    @GetMapping("/sendHtmlMail")
    public String sendHtmlMail(@RequestParam String to, @RequestParam String subject, @RequestParam String content) {
        emailService.sendHtmlMail(subject, content, to);
        return "HTML邮件已发送至: " + to;
    }

    /**
     * 发送带附件的邮件
     */
    @GetMapping("/sendMailWithAttachment")
    public String sendMailWithAttachment(@RequestParam String to, @RequestParam String subject, 
                                       @RequestParam String content, @RequestParam String attachmentPath,
                                       @RequestParam String attachmentName) {
        emailService.sendMailWithAttachment(subject, content, to, attachmentPath, attachmentName);
        return "带附件邮件已发送至: " + to;
    }
}

注意事项

  1. 在发送HTML邮件时,确保MimeMessageHelper的构造方法中指定编码为"UTF-8",以避免中文乱码问题。

  2. 如果需要在HTML邮件中嵌入图片,可以使用MimeMessageHelper的addInline方法,并在HTML中使用cid引用。

  3. 发送邮件时可能会抛出异常,建议在实际应用中添加更完善的异常处理机制。

  4. 邮件服务器配置可能因不同的邮件服务商而异,请根据实际情况调整配置参数。

  5. 对于生产环境,建议将敏感信息(如邮箱密码)存储在安全的地方,而不是直接写在配置文件中。

总结

通过以上步骤,我们实现了使用Java和Spring框架发送邮件的功能,包括简单文本邮件、HTML邮件和带附件的邮件。在实际应用中,可以根据需求进一步扩展邮件服务功能,如添加邮件模板、批量发送邮件等。

标签: JavaSpring

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。