当前位置: > > > SpringBoot - 使用JavaMailSender发送邮件教程2(发送带附件、图片的邮件)

SpringBoot - 使用JavaMailSender发送邮件教程2(发送带附件、图片的邮件)

三、发送带附件的邮件

1,改造 MailService

这里对前文封装的邮件发送类 MailService 做个改造,增加一个可以发送包含附件的邮件的方法:
    这里使用 MimeMessageHelper 简化邮件配置,通过 MimeMessageHelper 构造一个 multipart message 类型邮件来发送,multipart message 类型邮件可以包含多个正文、附件以及内嵌资源。
@Component
public class MailService {

    // JavaMailSender 在Mail 自动配置类 MailSenderAutoConfiguration 中已经导入,这里直接注入使用即可
    @Autowired
    JavaMailSender javaMailSender;
    
    // 发送带附件的邮件
    // 方法5个参数分别表示:邮件发送者、收件人、邮件主题、邮件内容、以及附件
    public void sendAttachFileMail(String from, String to,
                                   String subject, String content, File file) {
        try {
            MimeMessage message = javaMailSender.createMimeMessage();
            // 这里使用 MimeMessageHelper 简化了邮件配置
            // 第二个参数true表示构造一个 multipart message 类型邮件
            // multipart message类型邮件包含多个正文、附件以及内嵌资源,邮件表现形式更加丰富
            MimeMessageHelper helper = new MimeMessageHelper(message,true);
            helper.setFrom(from);
            helper.setTo(to);
            helper.setSubject(subject);
            helper.setText(content);
            // 最后通过 addAttachment 方法添加附件
            helper.addAttachment(file.getName(), file);
            javaMailSender.send(message);
        } catch (MessagingException e) {
            e.printStackTrace();
        }
    }
}

2,开始测试

(1)首先我们创建一个 Controller 调用这个 Service 方法进行测试:
@RestController
public class HelloController {

    @Autowired
    MailService mailService;

    @GetMapping("/hello")
    public void hello() {
        mailService.sendAttachFileMail("123@QQ.com",
                "service@hangge.com",
                "我是邮件的标题",
                "我是邮件的内容",
                new File("/Users/hangge/Desktop/test.txt"));
    }
}

(2)启动项目,访问 http://localhost:8080/hello 地址发送一个邮件,可以发现目标邮箱可以成功收到这封带附件的邮件。

四、发送带图片资源的邮件

1,改造 MailService

这里对前面封装的邮件发送类 MailService 做个改造,增加一个可以发送带图片的邮件的方法:
    如果需要在邮件正文中插入图片,可以使用 FileSystemResource 实现这一功能。通过 FileSystemResource 构造静态资源,然后调用 addInline 方法将资源加入到邮件对象中。
@Component
public class MailService {

    // JavaMailSender 在Mail 自动配置类 MailSenderAutoConfiguration 中已经导入,这里直接注入使用即可
    @Autowired
    JavaMailSender javaMailSender;

    // 发送带附件的邮件
    // 方法5个参数分别表示:邮件发送者、收件人、邮件主题、邮件内容、图片资源路径、以及资源id
    public void sendMailWithImg(String from, String to,
                                String subject, String content,
                                String[] srcPath,String[] resIds) {
        if (srcPath.length != resIds.length) {
            System.out.println("发送失败");
            return;
        }
        try {
            MimeMessage message = javaMailSender.createMimeMessage();
            MimeMessageHelper helper =
                    new MimeMessageHelper(message,true);
            helper.setFrom(from);
            helper.setTo(to);
            helper.setSubject(subject);
            // 第二个参数true表示邮件正文是HTML格式(默认为false)
            helper.setText(content,true);
            for (int i = 0; i < srcPath.length; i++) {
                // 通过FileSystemResource构造静态资源,让后调用addInline方法将资源加入到邮件对象中
                FileSystemResource res =
                        new FileSystemResource(new File(srcPath[i]));
                helper.addInline(resIds[i], res);
            }
            javaMailSender.send(message);
        } catch (MessagingException e) {
            System.out.println("发送失败");
        }
    }
}

2,开始测试

(1)首先我们创建一个 Controller 调用这个 Service 方法进行测试:
注意:邮件的正文是一段 HTML 文本,用 cid 标注出两个静态资源,分别为 p01p02
@RestController
public class HelloController {

    @Autowired
    MailService mailService;

    @GetMapping("/hello")
    public void hello() {
        mailService.sendMailWithImg("123@QQ.com",
                "service@hangge.com",
                "这个是邮件的标题)",
                "<div>hello,这是一封带图片资源的邮件:<br>" +
                        "这是图片1:<div><img src='cid:p01'/></div>" +
                        "这是图片2:<div><img src='cid:p02'/></div>" +
                        "</div>",
                new String[]{"/Users/hangge/Desktop/logo.png",
                        "/Users/hangge/Desktop/image.png"},
                new String[]{"p01", "p02"});
    }
}

(2)启动项目,访问 http://localhost:8080/hello 地址发送一个邮件,可以发现目标邮箱可以成功收到这封带有两张图片资源的邮件。
评论0