SpringBoot发送带有图片和附件的邮件

本文档详细介绍了如何使用Spring Boot的邮件服务发送包含图片内嵌和附件的邮件。首先需要配置邮件服务器的相关属性,如SMTP服务器、用户名、密码等。接着,通过JavaMailSender接口创建并发送邮件,对于含有图片和附件的邮件,可以利用MimeMessageHelper的addInline方法添加内嵌图片,用addAttachment方法添加附件。提供的代码示例展示了如何构建并发送这两种类型的邮件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       最近工作中,使用到了发送邮件的功能,邮件内容嵌套了图片,并且要携带附件。在此记录一下,希望可以帮助大家。

前提:开通邮件的POP3/SMTP/IMAP功能。

1. 引入发送邮件的依赖

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

2. 添加邮件属性配置

spring:
  mail:
    host: smtp.163.com
    username: 你的邮箱账号
    password: 你的邮箱密码或者口令之类的认证信息
    port: 465 
    properties:
      mail:
        debug: true  # 在控制台打印邮件的发送过程
        smtp:
          ssl:
            enable: true # 启用ssl

3. 编写发送邮件的服务

接口:

public interface MailService {
    /**
     * 发送纯文本内容的邮件
     * @param dto
     * @return 是否发送成功
     */
    boolean sendSimpleEmail(MailDTO dto);

    /**
     * 发送使用freemarker模板制作的邮件
     * @param dto
     * @return 是否发送成功
     */
    boolean sendTemplateEmail(MailDTO dto);
}

实现类:

@Service
public class MailServiceImpl implements MailService {

    @Value("${spring.mail.username}")
    private String from;

    @Autowired
    private JavaMailSender javaMailSender;

    @Autowired
    private FreeMarkerConfigurer configurer;

    @Override
    public boolean sendSimpleEmail(MailDTO dto) {
        boolean success;
        SimpleMailMessage message = new SimpleMailMessage();
        message.setFrom(from);
        message.setTo(dto.getTo());
        message.setSubject(dto.getSubject());
        message.setText(dto.getText());
        try {
            javaMailSender.send(message);
            success = true;
            System.out.println("给 "+ Arrays.toString(dto.getTo()) +" 发送邮件成功");
        } catch (MailException e) {
            System.err.println("给 "+ Arrays.toString(dto.getTo()) +" 发送邮件失败");
            success = false;
        }
        return success;
    }

    @Override
    public boolean sendTemplateEmail(MailDTO dto) {
        boolean success;
        try {
            MimeMessage msg = javaMailSender.createMimeMessage();//创建模拟的消息
            MimeMessageHelper helper = new MimeMessageHelper(msg, true);//创建模拟的消息工具
            helper.setFrom(from);//发件人
            helper.setTo(dto.getTo());
            helper.setSubject(dto.getSubject());//发送主题
            Template template = configurer.getConfiguration().getTemplate(dto.getTemplatePath());
            StringWriter writer = new StringWriter();
            template.process(dto.getTemplateParams(), writer);
            //内容是否设置成html,true代表是
            helper.setText(writer.toString(), true);

            // 判断邮件内容是否嵌套了图片
            if (!CollectionUtils.isEmpty(dto.getPicMap())){
                for (Map.Entry<String, String> entry : dto.getPicMap().entrySet()) {
                    helper.addInline(entry.getKey(),new FileSystemResource(new File(entry.getValue())));
                }
            }

            // 判断是否存在附件
            if (!CollectionUtils.isEmpty(dto.getAttachmentMap())){
                for (Map.Entry<String, String> entry : dto.getAttachmentMap().entrySet()) {
                    helper.addAttachment(entry.getKey(),new File(entry.getValue()));
                }
            }

            javaMailSender.send(msg);
            success = true;
            System.out.println("给 "+ Arrays.toString(dto.getTo()) +" 发送邮件成功");
        } catch (Exception e) {
            System.err.println("给 "+ Arrays.toString(dto.getTo()) +" 发送邮件失败");
            success = false;
        }
        return success;
    }
}

发送图片主要是使用了MimeMessageHelper#addInline

            // 判断邮件内容是否嵌套了图片
            if (!CollectionUtils.isEmpty(dto.getPicMap())){
                for (Map.Entry<String, String> entry : dto.getPicMap().entrySet()) {
                    // <img src="cid:pic0"/> key与cid后面的值对应,value为图片路径
                    helper.addInline(entry.getKey(),new FileSystemResource(new File(entry.getValue())));
                }
            }

发送附件则是使用了MimeMessageHelper#addAttachment

            // 判断是否存在附件
            if (!CollectionUtils.isEmpty(dto.getAttachmentMap())){
                for (Map.Entry<String, String> entry : dto.getAttachmentMap().entrySet()) {
                    // key是文件名,value是文件路径
                    helper.addAttachment(entry.getKey(),new File(entry.getValue()));
                }
            }

测试结果

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值