利用 Springboot 发送邮件和附件

本文介绍了如何使用Java和SpringBoot通过JavaMailAPI创建并发送电子邮件,包括SMTP设置、依赖管理、构建EmailDTO实体类、处理附件以及发送邮件的详细步骤。

本文简单介绍如何通过 Java 代码来创建电子邮件,并连接邮件服务器发送邮件,主要作为项目开发过程的记录,想要详细了解这其中的过程和原理可以参考这两篇文章,写得很详细很不错。
基于JavaMail的Java邮件发送:简单邮件发送
SpringBoot 发送邮件和附件(实用版)

1、前期准备

本文以 126邮箱 为例(其他邮箱大同小异),邮箱账号必须要开启 SMTP 服务,在浏览器网页登录邮箱后一般在邮箱的“设置”选项中可以开启,然后会得到一个授权码,这个邮箱和授权码将用作登陆认证。
在这里插入图片描述
记下邮箱的 SMTP 服务器地址,如下所示:
在这里插入图片描述

常用邮箱SMTP服务器地址大全

2、相关依赖

<dependency>  
    <groupId>org.springframework.boot</groupId>  
    <artifactId>spring-boot-starter-web</artifactId>  
</dependency>  
<dependency>  
        <groupId>org.springframework.boot</groupId>  
        <artifactId>spring-boot-starter-mail</artifactId>  
</dependency>  

3、构建邮件实体类

我一开始想直接用一个实体类接收前端传递过来的参数,但是发现其他属性都没问题,只有件属性为 null 接收不到。

实体类:

@Data
public class EmailDTO {

    private String userEmail; // 发件人邮箱   
    private String receiveEmail; // 收件人邮箱
    private String sendName; // 发件人名称
    private String receiveName; // 收件人名称
    private String subject; // 邮件主题
    private String content; // 邮件内容
    private MultipartFile[] attach; // 邮件附件
    
}

Postman传递的参数:
在这里插入图片描述

Controller中的方法:
在这里插入图片描述

参考这篇文章的说法,@RequestBody不能和Multipart同时用
传送门

然后我去问了gpt,他给的回答如下:

  • 当使用 @RequestBody 注解接收实体类对象时,Spring MVC 默认使用的是 HttpMessageConverter,它将请求的内容转换为相应的对象。然而,MultipartFile 是一个特殊的类型,用于处理文件上传,不属于常规的请求参数。
  • 由于 MultipartFile 是用于处理文件上传的类型,它的数据通常会以 multipart/form-data 的形式提交,而不是默认的 application/json 或 application/x-www-form-urlencoded 形式。因此,在通过 @RequestBody 接收实体类对象时,这些文件数据不会默认被转换为 MultipartFile 对象。
  • 对于文件上传操作,推荐使用 @RequestParam 注解来接收文件参数,而不是 @RequestBody。

最后我用了一个笨办法在这里插入图片描述
在这里插入图片描述

4、发送邮件

由于业务需求,邮件的信息不能写死,所以这里我是用set的方式来进行配置。如果不需要变化,也可以参考网上其他博客将这些信息配置在 application.yml 文件中,这里就不详细说了。

	// 发件人邮箱的 SMTP 服务器地址, 必须准确, 不同邮件服务器地址不同, 一般(只是一般, 绝非绝对)格式为: smtp.xxx.com
    // 网易126邮箱的 SMTP 服务器地址为: smtp.126.com
    // SSL加密端口:465;非加密端口:25
    public static final String EMAIL_SMTP_HOST = "smtp.126.com";
    public static final String EMAIL_SMTP_PORT = "465";
//    public static final String EMAIL_SMTP_PORT = "25";

    // 构建复杂邮件信息类
    public Result sendEmailWithAttach(EmailDTO emailDTO) {
        try {
            checkMail(emailDTO); //检查邮件信息完整性
            JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl();

            // 初始化邮件发送sender
            javaMailSender.setProtocol("smtp"); // 指定协议
            javaMailSender.setHost(EMAIL_SMTP_HOST); // 指定服务器
            javaMailSender.setUsername(emailDTO.getUserEmail()); // 邮件发信人

            // 根据用户邮箱获取邮箱授权码
            QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();
            userQueryWrapper.eq("email",emailDTO.getUserEmail());
            User user = userMapper.selectOne(userQueryWrapper);
            if (user == null) {
                return Result.fail("用户邮箱错误!");
            }
            javaMailSender.setPassword(user.getEmailCode()); // 邮件授权码
            javaMailSender.setDefaultEncoding("utf-8");
            // 初始化邮件发送properties
            Properties properties = new Properties();
            properties.setProperty("mail.smtp.auth", "true"); // 是否需要用户认证
            properties.setProperty("mail.debug", "true"); // 启用调试
            properties.setProperty("mail.smtp.port", EMAIL_SMTP_PORT); // 设置端口
            properties.setProperty("mail.smtp.socketFactory.fallback", "false");
            properties.setProperty("mail.smtp.socketFactory.port", EMAIL_SMTP_PORT); // 设置ssl端口
            properties.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
            javaMailSender.setJavaMailProperties(properties);

            MimeMessageHelper messageHelper = new MimeMessageHelper(javaMailSender.createMimeMessage(), true,"UTF-8");//true表示支持复杂类型
            messageHelper.setFrom(emailDTO.getUserEmail());  // 邮件发信人
            messageHelper.setTo(emailDTO.getReceiveEmail()); // 收件人邮箱
            messageHelper.setSubject(emailDTO.getSubject()); // 邮件主题
            messageHelper.setText(emailDTO.getContent()); // 邮件内容
            if (emailDTO.getAttach() != null) { // 添加邮件附件
                for (MultipartFile multipartFile : emailDTO.getAttach()) {
                    messageHelper.addAttachment(multipartFile.getOriginalFilename(), multipartFile);
                }
            }
            javaMailSender.send(messageHelper.getMimeMessage()); // 正式发送邮件
            return Result.ok();
        } catch (Exception e) {
            return Result.fail(e.getMessage()); // 发送失败
        }
    }

最后的结果,发送成功~
在这里插入图片描述

### 使用 Spring Boot 发送附件的电子邮件 为了实现通过 Spring Boot 应用程序发送附件邮件,可以利用 `JavaMailSender` 接口以及其默认实现类 `JavaMailSenderImpl` 提供的功能[^1]。 下面是一个完整的例子来展示如何配置并编写服务以支持此功能: #### 配置文件设置 (`application.properties`) ```properties spring.mail.host=smtp.example.com spring.mail.port=587 spring.mail.username=user@example.com spring.mail.password=password spring.mail.protocol=smtp spring.mail.properties.mail.smtp.auth=true spring.mail.properties.mail.smtp.starttls.enable=true ``` 这些属性用于指定 SMTP 服务器的相关参数,包括主机地址、端口号、认证信息等必要项。对于不同的邮箱服务商,可能需要调整具体的值。 #### 创建 Email Service 类 定义一个名为 `EmailService` 的 Java 类,在其中注入 `JavaMailSender` 并创建方法用来构建发送包含附件的消息体。 ```java @Service public class EmailService { @Autowired private JavaMailSender javaMailSender; public void sendEmailWithAttachment(String toAddress, String subject, String messageBody, File attachmentFile) throws MessagingException { MimeMessage mimeMessage = javaMailSender.createMimeMessage(); try { MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true); helper.setFrom("no-reply@domain.com"); helper.setTo(toAddress); helper.setSubject(subject); helper.setText(messageBody); FileSystemResource fileSystemResource = new FileSystemResource(attachmentFile); helper.addAttachment(fileSystemResource.getFilename(), fileSystemResource); javaMailSender.send(mimeMessage); } catch (MessagingException e) { throw new RuntimeException(e.getMessage()); } } } ``` 这段代码展示了怎样使用 `MimeMessageHelper` 来准备一封 MIME 格式的邮件消息,并附加文件到该邮件中。注意这里启用了多部分模式(即第二个参数设为 `true`),以便能够处理文本其他类型的附件数据。 #### 调用 Email Service 方法 最后一步是在适当的地方调用上述的服务函数,比如在一个控制器里响应用户的请求时触发邮件发送动作。 ```java @RestController @RequestMapping("/api/email") public class EmailController { @Autowired private EmailService emailService; @PostMapping("/send-with-attachment") public ResponseEntity<String> sendEmailWithAttachment( @RequestParam(value="to") String recipientEmail, @RequestParam(value="subject") String subject, @RequestParam(value="body") String body, @RequestParam(value="file", required=false) MultipartFile multipartFile){ if (!multipartFile.isEmpty()) { try { File tempFile = Files.createTempFile(null,null).toFile(); multipartFile.transferTo(tempFile); emailService.sendEmailWithAttachment(recipientEmail, subject,body,tempFile); return ResponseEntity.ok().build(); } catch (IOException | MessagingException ex) { return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(ex.toString()); } } return ResponseEntity.badRequest().build(); } } ``` 以上就是关于如何在 Spring Boot 中实现发送附有附件的电子邮件的一个简单教程及相应实例代码片段。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值