《SpringBoot2.0 实战》系列-集成JMS实现邮件发送

简介

JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持。

正文

增加依赖

本文用的spring-boot-starter-mail,不用显示指定版本号

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

配置信息

# 邮件
  spring:
    mail:
      host: smtp.163.com
      username: ******@163.com
      # 客户端授权码不是邮箱密码
      password: ******
      senderName: gourd
      port: 25
      protocol: smtp
      default-encoding: UTF-8
      properties:
        mail.smtp.auth: true
        mail.smtp.ssl.enable: true
        mail.smtp.starttls.enable: true
        mail.smtp.starttls.required: true
        mail.smtp.socketFactory.port: 465
        mail.smtp.socketFactory.class: javax.net.ssl.SSLSocketFactory
        mail.smtp.socketFactory.fallback: false

避坑:

没有加配置:spring.mail.properties.mail.smtp.ssl.enable:true   会报以下错误:

Caused by: javax.mail.MessagingException: Could not connect to SMTP host: smtp.163.com, port: 465, response: 554
    at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:2197)
    at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:722)
    at javax.mail.Service.connect(Service.java:342)

此处password为客户端授权码不是邮箱密码。

163邮箱获取授权码:如果之前设置过忘了,可以重置下。

发送邮件业务service:

/**
 * 邮件发送
 * @author gourd
 */
@Service
@Slf4j
public class GourdMailServiceImpl implements GourdMailService {

    @Autowired
    private JavaMailSender javaMailSender;

    @Autowired
    private TemplateEngine templateEngine;

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

    /**
     * 发送包含简单文本的邮件
     *
     * @param toMails 接收者
     * @param subject 主题
     * @param text    内容
     */
    @Override
    public void sendTxtMail(String[] toMails, String subject, String text) {
        SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
        // 设置收件人,寄件人
        simpleMailMessage.setTo(toMails);
        simpleMailMessage.setFrom(from);
        simpleMailMessage.setSubject(subject);
        simpleMailMessage.setText(text);
        // 发送邮件
        javaMailSender.send(simpleMailMessage);
        log.info("^o^= 邮件已发送");
    }

    /**
     * 发送包含HTML文本的邮件
     *
     * @param toMails  接收者
     * @param subject  主题
     * @param htmlText html格式内容
     */
    @Override
    public void sendHtmlMail(String[] toMails, String subject, String htmlText) {
        MimeMessage mimeMessage = javaMailSender.createMimeMessage();
        MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage);
        try {
            setMailInfo(toMails, subject, htmlText, mimeMessageHelper);
            // 发送邮件
            javaMailSender.send(mimeMessage);
            log.info("^o^= 邮件已发送");
        } catch (Exception e) {
            log.info("^o^= 邮件发送失败{}:",e);
        }
    }

    /**
     * 发送包含内嵌图片的邮件
     */
    @Override
    public void sendImageMail(String[] toMails, String subject, String htmlImageText) {
        MimeMessage mimeMessage = javaMailSender.createMimeMessage();
        try {
            // multipart模式
            MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);
            setMailInfo(toMails, subject, htmlImageText, mimeMessageHelper);
            // 设置imageId
            FileSystemResource img = new FileSystemResource(new File("D:/MailImage/welcome.jpg"));
            mimeMessageHelper.addInline("imageId", img);
            // 发送邮件
            javaMailSender.send(mimeMessage);
            log.info("^o^= 邮件已发送");
        } catch (Exception e) {
            log.info("^o^= 邮件发送失败{}:",e);
        }
    }

    /**
     * 发送包含附件的邮件
     */
    @Override
    public void sendAttachmentMail(String[] toMails, String subject, String htmlAttachText) {
        MimeMessage mimeMessage = javaMailSender.createMimeMessage();
        try {
            // multipart模式
            MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true, "utf-8");
            setMailInfo(toMails, subject, htmlAttachText, mimeMessageHelper);
            // 设置附件
            FileSystemResource img = new FileSystemResource(new File("D:/MailImage/welcome.jpg"));
            FileSystemResource xlsx = new FileSystemResource(new File("D:/MailImage/软件项目需求.xlsx"));
            mimeMessageHelper.addAttachment("welcome.jpg", img);
            mimeMessageHelper.addAttachment("软件项目需求.xlsx", xlsx);
            // 发送邮件
            javaMailSender.send(mimeMessage);
            log.info("^o^= 邮件已发送");
        } catch (Exception e) {
            log.info("^o^= 邮件发送失败{}:",e);
        }
    }

    /**
     * 发送模板邮件
     */
    @Override
    public void sendTemplateMail(String[] toMails, String subject) {
        MimeMessage mimeMessage = javaMailSender.createMimeMessage();
        try {
            // multipart模式
            MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true, "utf-8");
            // 声明一个上下文对象,里面放入要存到模板里面的数据
            Context context = new Context();
            Map<String, Object> params = new HashMap(4){{
                put("name","小葫芦");
                put("account","gourdHu");
                put("password","123456");
            }};
            context.setVariables(params);
            // 指定相应的模板,然后给context数据传过去
            String process = templateEngine.process("mail", context);
            setMailInfo(toMails, subject, process, mimeMessageHelper);
        } catch (Exception e) {
            e.printStackTrace();
        }
        // 发送邮件
        javaMailSender.send(mimeMessage);
        log.info("^o^= 邮件已发送");
    }

    /**
     * 设置邮件信息
     * @param toMails
     * @param subject
     * @param text
     * @param mimeMessageHelper
     * @throws MessagingException
     * @throws UnsupportedEncodingException
     */
    private void setMailInfo(String[] toMails, String subject, String text, MimeMessageHelper mimeMessageHelper) throws MessagingException, UnsupportedEncodingException {
        mimeMessageHelper.setTo(toMails);
        mimeMessageHelper.setFrom(from, fromName);
        mimeMessageHelper.setSubject(subject);
        if(StringUtils.isNotBlank(text)){
            // 启用html
            mimeMessageHelper.setText(text, true);
        }
    }
}

测试controller

/**
 * 供前期测试使用
 * @author gourd
 */
@RestController
@RequestMapping("/mail")
@Api(tags = "mail", description = "邮件控制器")
@Slf4j
public class MailController {
 
    @Autowired
    private MailService mailService;
 
    @PostMapping("/text-send")
    @ApiOperation(value = "发送文本邮件")
    public void sendTextMail() {
        String[] toMails = new String[]{"869570209@qq.com"} ;
        String subject = "gourd邮件";
        String text = "gourd你好";
        mailService.sendTxtMail(toMails,subject,text);
    }
 
    @PostMapping("/html-send")
    @ApiOperation(value = "发送html格式邮件")
    public void sendHtmlMail() {
        String[] toMails = new String[]{"869570209@qq.com"} ;
        String subject = "gourd邮件";
        StringBuilder sb = new StringBuilder();
        sb.append("<html><head>gourd邮件</head>");
        sb.append("<body><h1>gourd邮件测试</h1><p>hello!this is spring mail test。</p></body>");
        sb.append("</html>");
        mailService.sendHtmlMail(toMails,subject,sb.toString());
    }
    @PostMapping("/image-send")
    @ApiOperation(value = "发送图片邮件")
    public void sendImageMail() {
        String[] toMails = new String[]{"869570209@qq.com"} ;
        String subject = "gourd邮件";
        StringBuilder sb = new StringBuilder();
        sb.append("<html><head>gourd邮件</head>");
        sb.append("<body><h1>gourd邮件</h1><p>hello!this is spring mail test。</p>");
        // cid为固定写法,imageId指定一个标识
        sb.append("<img src=\"cid:imageId\"/></body>");
        sb.append("</html>");
        mailService.sendImageMail(toMails,subject,sb.toString());
    }
 
    @PostMapping("/attach-send")
    @ApiOperation(value = "发送附件邮件")
    public void sendAttachmentMail() {
        String[] toMails = new String[]{"869570209@qq.com"} ;
        String subject = "gourd邮件";
        StringBuilder sb = new StringBuilder();
        sb.append("<html><head>gourd邮件</head>");
        sb.append("<body><h1>gourd邮件测试</h1><p>hello!this is spring mail test。</p></body>");
        sb.append("</html>");
        mailService.sendAttachmentMail(toMails,subject,sb.toString());
    }
}

===============================================

代码均已上传至本人的开源项目

spring-cloud-plus:https://blog.csdn.net/HXNLYW/article/details/104635673

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值