栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Springboot 邮件发送(html内嵌图片、附件)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Springboot 邮件发送(html内嵌图片、附件)

1、引入依赖包

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

2、配置文件
spring:
  mail:
    host: smtp.qq.com
    # 发送者的邮箱账号
    username: 1111@qq.com
    # 邮箱密码授权码
    password: ****
    default-encoding: utf-8
    properties:
      mail:
      	debug: true
        smtp:
          auth: true
          starttls:
            enable: true
            required: true
3、业务逻辑 3.1 定义邮件发送类
@Data
public  class MailInfo {
    // 邮件接收人
    private String[] receiver;
    // 邮件主题
    private String subject;
    // 邮件的文本内容
    private String content;
    // 抄送人
    private String[] cc;
    // 邮件附件的文件名
    private String[] attachFileNames;
    // 邮件内容内嵌图片
    private Map imageMap;
}
3.2 定义 ISendMsgHandle
public interface ISendMsgHandle {

	
	void sendSimpleTextEmail(MailInfo mailInfo);

	
	void sendHtmlEmail(MailInfo mailInfo,boolean html);

	
	void sendEnclosureEmail(MailInfo mailInfo);
}
3.3 邮件处理逻辑
import com.weigang.email.bean.MailInfo;
import com.weigang.email.handle.ISendMsgHandle;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Component;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.annotation.Resource;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import java.util.*;

@Slf4j
@Component
public class EmailSendMsgHandle implements ISendMsgHandle {

    @Resource
    private JavaMailSender javaMailSender;

    @Value(value = "${spring.mail.username}")
    private String emailFrom;


    @Override
    public void sendSimpleTextEmail(MailInfo mailInfo) {
        try {
            SimpleMailMessage mailMessage = new SimpleMailMessage();
            //发件人
            mailMessage.setFrom(emailFrom);
            //接收人
            mailMessage.setTo(mailInfo.getReceiver());
            //邮件主题
            mailMessage.setSubject(mailInfo.getSubject());
            //邮件抄送
            mailMessage.setCc(mailInfo.getCc());
            //邮件内容
            mailMessage.setText(mailInfo.getContent());
            //发送邮件
            javaMailSender.send(mailMessage);
        } catch (Exception e) {
            log.error("邮件发送失败:{}", e.getMessage());
        }
    }

    @Override
    public void sendHtmlEmail(MailInfo mailInfo,boolean html) {
        try {
            MimeMessage mimeMailMessage = javaMailSender.createMimeMessage();
            //true 表示需要创建一个multipart message
            MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMailMessage);
            //发件人
            mimeMessageHelper.setFrom(emailFrom);
            //接收人
            mimeMessageHelper.setTo(mailInfo.getReceiver());
            //邮件主题
            mimeMessageHelper.setSubject(mailInfo.getSubject());
            //邮件抄送
            mimeMessageHelper.setCc(mailInfo.getCc());
            //邮件内容
            mimeMessageHelper.setText(mailInfo.getContent(), html);
            javaMailSender.send(mimeMailMessage);
        } catch (Exception e) {
            log.error("邮件发送失败:{}", e.getMessage());
        }
    }


    @Override
    public void sendEnclosureEmail(MailInfo mailInfo) {
        try {
            MimeMessage mimeMailMessage = javaMailSender.createMimeMessage();
            //true 表示需要创建一个multipart message
            MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMailMessage, true);
            //发件人
            mimeMessageHelper.setFrom(emailFrom);
            //邮件接收人
            mimeMessageHelper.setTo(mailInfo.getReceiver());
            //邮件主题
            mimeMessageHelper.setSubject(mailInfo.getSubject());
            //邮件抄送
            mimeMessageHelper.setCc(mailInfo.getCc());
            //设置显示的发件时间
            mimeMessageHelper.setSentDate(new Date());

            MimeMultipart allMultipart = new MimeMultipart();

            //创建代表邮件正文和附件的各个MimeBodyPart对象
            MimeBodyPart contentPart = createContent(mailInfo.getContent(), mailInfo.getImageMap());
            allMultipart.addBodyPart(contentPart);

            //创建用于组合邮件正文和附件的MimeMultipart对象
            for (int i = 0; i < mailInfo.getAttachFileNames().length; i++) {
                allMultipart.addBodyPart(createAttachment(mailInfo.getAttachFileNames()[i]));
            }

            //设置整个邮件内容为最终组合出的MimeMultipart对象
            mimeMailMessage.setContent(allMultipart);
            mimeMailMessage.saveChanges();

            javaMailSender.send(mimeMailMessage);
        } catch (Exception e) {
            log.error("邮件发送失败:{}", e.getMessage());
        }
    }

    
    public MimeBodyPart createAttachment(String filename) throws Exception {
        //创建保存附件的MimeBodyPart对象,并加入附件内容和相应的信息
        MimeBodyPart attachPart = new MimeBodyPart();
        FileDataSource fsd = new FileDataSource(filename);
        attachPart.setDataHandler(new DataHandler(fsd));
        attachPart.setFileName(fsd.getName());
        return attachPart;
    }

    
    public MimeBodyPart createContent(String body) throws Exception {
        //创建代表组合Mime消息的MimeMultipart对象,将该MimeMultipart对象保存到MimeBodyPart对象
        MimeBodyPart contentPart = new MimeBodyPart();
        MimeMultipart contentMultipart = new MimeMultipart("related");

        //创建用于保存HTML正文的MimeBodyPart对象,并将它保存到MimeMultipart中
        MimeBodyPart htmlBodyPart = new MimeBodyPart();
        htmlBodyPart.setContent(body, "text/html;charset=UTF-8");
        contentMultipart.addBodyPart(htmlBodyPart);

        //将MimeMultipart对象保存到MimeBodyPart对象
        contentPart.setContent(contentMultipart);
        return contentPart;
    }

    
    public MimeBodyPart createContent(String body, Map map) throws Exception {
        //创建代表组合Mime消息的MimeMultipart对象,将该MimeMultipart对象保存到MimeBodyPart对象
        MimeBodyPart contentPart = new MimeBodyPart();
        MimeMultipart contentMultipart = new MimeMultipart("related");

        //创建用于保存HTML正文的MimeBodyPart对象,并将它保存到MimeMultipart中
        MimeBodyPart htmlBodyPart = new MimeBodyPart();
        htmlBodyPart.setContent(body, "text/html;charset=UTF-8");
        contentMultipart.addBodyPart(htmlBodyPart);

        if (map != null && map.size() > 0) {
            Set> set = map.entrySet();
            for (Map.Entry entry : set) {
                //创建用于保存图片的MimeBodyPart对象,并将它保存到MimeMultipart中
                MimeBodyPart gifBodyPart = new MimeBodyPart();
                FileDataSource fds = new FileDataSource(entry.getValue());//图片所在的目录的绝对路径

                gifBodyPart.setDataHandler(new DataHandler(fds));
                gifBodyPart.setContentID(entry.getKey());    //cid的值
                contentMultipart.addBodyPart(gifBodyPart);
            }
        }

        //将MimeMultipart对象保存到MimeBodyPart对象
        contentPart.setContent(contentMultipart);
        return contentPart;
    }
}
3.4 测试

(1)简单邮件发送

    @Test
    void sendSimpleTextEmail() {
        MailInfo mailInfo = new MailInfo();
        mailInfo.setReceiver(new String[]{"11111@qq.com"});
        mailInfo.setSubject("测试主题");
        mailInfo.setContent("邮件内容");
        emailSendMsgHandle.sendSimpleTextEmail(mailInfo);
    }

​​​​
(2)以html格式发送

    @Test
    public void sendHTMLMail() {
        MailInfo mailBean = new MailInfo();
        //接收人
        mailBean.setReceiver(new String[]{"11111@qq.com"});
        mailBean.setSubject("SpringBootMailHTML之这是一封HTML格式的邮件");
        //抄送给谁
        mailBean.setCc(new String[]{"11111@qq.com","winsky.com"});
        StringBuilder sb = new StringBuilder();
        sb.append("SpirngBoot测试邮件HTML")
                .append("

这是一封HTML邮件...

") .append("

时间为:"+ new Date() +"

"); mailBean.setContent(sb.toString()); //true、false控制以普通文本发送还是以html格式发送 emailSendMsgHandle.sendHtmlEmail(mailBean,true); }


(2)以html格式发送并带附件

    @Test
    void sendEmail() {
        MailInfo mailBean = new MailInfo();
        mailBean.setReceiver(new String[]{"11111@qq.com"});
        mailBean.setSubject("SpringBootMailHTML之这是一封HTML格式的邮件");
        mailBean.setCc(new String[]{"11111@qq.com","winsky.com"});
        StringBuilder sb = new StringBuilder();
        sb.append("SpirngBoot测试邮件HTML")
                .append("

这是一封HTML邮件...

") .append("

时间为:"+ new Date() +"

"); mailBean.setContent(sb.toString()); mailBean.setAttachFileNames(new String[]{"/Users/Downloads/密码管理.xlsx","/Users/Downloads/1635834323888.jpg"}); emailSendMsgHandle.sendEnclosureEmail(mailBean); }


(3)以html格式内嵌图片并带附件发送

    @Test
    void sendEmail2() {
        MailInfo mailBean = new MailInfo();
        mailBean.setReceiver(new String[]{"111111@qq.com"});
        mailBean.setSubject("SpringBootMailHTML之这是一封HTML格式的邮件");
        mailBean.setCc(new String[]{"111111@qq.com","winsky.com"});
        StringBuilder sb = new StringBuilder();
        sb.append("SpirngBoot测试邮件HTML")
                .append("

这是一封HTML邮件...

") .append("点击进入百度
") //内嵌图片 .append("") .append("") .append("

时间为:"+ new Date() +"

"); mailBean.setContent(sb.toString()); //附件 mailBean.setAttachFileNames(new String[]{"/Users/Downloads/密码管理.xlsx","/Users/Downloads/1635834323888.jpg"}); //内嵌了多少张图片,如果没有,则new一个不带值的Map Map image = new HashMap<>(); image.put("a00000001", "/Users/Downloads/WechatIMG22.jpg"); image.put("a00000002", "/Users/Downloads/face_1631083961355.png"); mailBean.setImageMap(image); emailSendMsgHandle.sendEnclosureEmail(mailBean); }


(4)以表格的形式发送邮件

log.info(" --- 任务调度开始 --- ");
        try {
            //查询维保时间即将过期的产品
            List customerProductList = customerService.selectCustomerProductList();
            //根据项目编号去重
            List newCustomerProductList = customerProductList.stream().filter(distinctByKey(CustomerProductVo::getProjectCode)).collect(Collectors.toList());

            //发送邮件
            MailInfo mailBean = new MailInfo();
//            mailBean.setReceiver(new String[]{"weg@bj.com"});
            mailBean.setSubject("维保时间即将过期的客户产品");
            mailBean.setCc(new String[]{"weg@bj.com"});
            StringBuilder stringBuilder = new StringBuilder();
            //表格制作
            stringBuilder.append("rn");
            stringBuilder.append("您好,以下内容是维保时间即将过期的客户产品,请及时处理!");
            stringBuilder.append("");
            stringBuilder.append("" +
                    "" +
                    "" +
                    "" +
                    "" +
//                    "" +
//                    "" +
                    "" +
                    "" +
                    "");
            for (CustomerProductVo vo : newCustomerProductList) {
                stringBuilder.append("");
                stringBuilder.append("");
                stringBuilder.append("");
                stringBuilder.append("");
                stringBuilder.append("");
//                stringBuilder.append("");
//                stringBuilder.append("");
                stringBuilder.append("");
                stringBuilder.append("");
                stringBuilder.append("");
            }
            stringBuilder.append("
客户中文名称客户英文名称项目名称项目编号产品名称产品版本查询时间维保结束时间
" + vo.getCustomerChName() + "" + vo.getCustomerEnName() + "" + vo.getProjectName() + "" + vo.getProjectCode() + "" + vo.getProductName() + "" + vo.getProductVersion() + "" + DateUtils.date2Str(new SimpleDateFormat("yyyy-MM-dd")) + "" + DateUtils.date2Str(vo.getDealine(),new SimpleDateFormat("yyyy-MM-dd")) + "
"); stringBuilder.append(""); //发送邮件 mailBean.setContent(stringBuilder.toString()); emailSendMsgHandle.sendHtmlEmail(mailBean,true); } catch (Exception e) { e.printStackTrace(); log.error("邮件发送失败,失败原因是:{}",e.getMessage()); } log.info(" --- 执行完毕,时间:"+DateUtils.now()+"---");

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/759198.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号