Springboot发送邮件,附件及按照模板发送邮件案例

项目结构

主要依赖如下:

<dependencies>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-thymeleaf</artifactId>
	</dependency>
	  <!--邮件-->
	  <dependency>
		  <groupId>org.springframework.boot</groupId>
		  <artifactId>spring-boot-starter-mail</artifactId>
	  </dependency>
	  <dependency>
		  <groupId>org.springframework.boot</groupId>
		  <artifactId>spring-boot-starter-freemarker</artifactId>
	  </dependency>
	  <!--excel-->
	  <dependency>
		  <groupId>org.apache.poi</groupId>
		  <artifactId>poi</artifactId>
		  <version>3.7</version>
	  </dependency>
controller:
package cn.com.hj.mail.controller;



import cn.com.hj.mail.bean.MailBean;
import cn.com.hj.mail.common.InitThreadPoll;
import cn.com.hj.mail.mailService.MailService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Semaphore;
import java.util.concurrent.ThreadPoolExecutor;


@RestController
@RequestMapping("/MailController")
public class MailController {

    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    @Autowired
    private MailService mailService;

    /**
     *  发送简单邮件模式
     * @return
     */
    @RequestMapping("/simpMail")
    public String simpMail(){
        logger.info("进入 邮件发送服务");
        String toMail = "h****@sift.com.cn";
        String subject ="邮件服务测试";
        String content = "邮件测试";
         mailService.sendSimpleMail(toMail,subject,content);
         return  "Hello world spring boot";
    }
    /**
     *  发送带附件邮件
     * @return
     */
    @RequestMapping("/simpAndFileMail")
    public String simpAndFileMail(){
        logger.info("进入 邮件发送服务");
        String toMail = "h****@sift.com.cn";
        String subject ="邮件服务加附件";
        String content = "邮件测试";
        String filePath="D:\\1.txt";
        mailService.sendAttachmentsMail(toMail,subject,content,filePath);
        return  "Hello world spring boot";
    }
    /**
     *  发送html邮件模式
     * @return
     */
    @RequestMapping("/simpMail_html")
    public String simpHtmlMail(){
        logger.info("进入 邮件发送服务");
        String toMail = "h****@sift.com.cn";
        String subject ="邮件服务测试 simple";
        String content = "<html><head><style>td{border:solid #add9c0; border-width:0px 1px 1px 0px; padding:10px 0px;} table{border:solid #add9c0; border-width:1px 0px 0px 1px;}</style></head><body style=''><h3>xx系统中错误领导项目,项目信息如下:</h3>" +
                "<table><tr><th>合同号</th><th>项目名称</th><th>客户名称</th><th>合同总金额(元)</th><th>合同实收款(元)</th><th>签订日期</th><th>项目所属领导</th><th>提交人</th></tr>" +
                "<tr><td>1</td><td>1</td><td>1</td><td>1</td><td>1</td><td>1</td><td>1</td><td>1</td></tr>" +
                "</table></body></html>";
        mailService.sendHtmlMail(toMail,subject,content);
        return  "Hello world spring boot";
    }

    /**
     *  按照模板发送邮件
     * @return
     */
    @RequestMapping("/simpMail_Templage")
    public String simpTemplageMail(){
        logger.info("进入 邮件发送服务");
        String toMail = "h****@sift.com.cn";
        String subject ="邮件服务测试";
        Map<String, Object> map = new HashMap<String, Object>();
        MailBean mailBean1 = new MailBean();
        mailBean1.setExName("Exception");
        mailBean1.setExNum("20");
        mailBean1.setTime("2019-03-20");

        MailBean mailBean2 = new MailBean();
        mailBean2.setExName("Exception1");
        mailBean2.setExNum("20");
        mailBean2.setTime("2019-03-20");
        List<MailBean> list = new ArrayList<MailBean>();
        list.add(mailBean1);
        list.add(mailBean2);
        map.put("listInfo",list);
        map.put("UserName", "通知:bug如下");
        map.put("titleName","bug通知");
        mailService.sendTemplageMail(toMail,subject,map);
        return  "Hello world spring boot";
    }

    /**
     * 测试多线程发送邮件
     * @return
     */
    @RequestMapping("/simpTemplageMailThread")
    public String simpTemplageMailThread(){
        ExecutorService executorService = InitThreadPoll.getInstance();
        final Semaphore semaphore = new Semaphore(5);
        List<MailBean> list = new ArrayList<MailBean>();
        MailBean mailBean1 = new MailBean();
        mailBean1.setExName("Exception1");
        mailBean1.setExNum("20");
        mailBean1.setTime("2019-03-20");
        MailBean mailBean2 = new MailBean();
        mailBean2.setExName("Exception2");
        mailBean2.setExNum("20");
        mailBean2.setTime("2019-03-20");
        MailBean mailBean3 = new MailBean();
        mailBean3.setExName("Exception3");
        mailBean3.setExNum("20");
        mailBean3.setTime("2019-03-20");
        MailBean mailBean4 = new MailBean();
        mailBean4.setExName("Exception4");
        mailBean4.setExNum("20");
        mailBean4.setTime("2019-03-20");
        MailBean mailBean5 = new MailBean();
        mailBean5.setExName("Exception5");
        mailBean5.setExNum("20");
        mailBean5.setTime("2019-03-20");
        MailBean mailBean6 = new MailBean();
        mailBean6.setExName("Exception6");
        mailBean6.setExNum("20");
        mailBean6.setTime("2019-03-20");
        MailBean mailBean7 = new MailBean();
        mailBean7.setExName("Exception7");
        mailBean7.setExNum("20");
        mailBean7.setTime("2019-03-20");
        MailBean mailBean8 = new MailBean();
        mailBean8.setExName("Exception8");
        mailBean8.setExNum("20");
        mailBean8.setTime("2019-03-20");
        MailBean mailBean9 = new MailBean();
        mailBean9.setExName("Exception9");
        mailBean9.setExNum("20");
        mailBean9.setTime("2019-03-20");
        MailBean mailBean10 = new MailBean();
        mailBean10.setExName("Exception10");
        mailBean10.setExNum("20");
        mailBean10.setTime("2019-03-20");


        list.add(mailBean1);
        list.add(mailBean2);
        list.add(mailBean3);
        list.add(mailBean4);
        list.add(mailBean5);
        list.add(mailBean6);
        list.add(mailBean7);
        list.add(mailBean8);
        list.add(mailBean9);
        list.add(mailBean10);

        int m = list.size();
        for (int i = 0; i < m; i++) {

            final MailBean mailBean =  list.get(i);
            executorService.execute(new Runnable() {
                public void run() {
                    try {
                        semaphore.acquire(); //获取一个信号量
                        getInfoMail(mailBean);
                        semaphore.release(); //释放一个信号量
                    }catch (InterruptedException e) {
                        e.printStackTrace();
                    }catch (Exception e){
                        e.printStackTrace();
                    }
                }
            });
        }

        return  "Hello world spring boot";
    }


    @RequestMapping("/simpTemplageMailThreadMonitor")
    public String simpTemplageMailThreadMonitor(){

        logger.info("-------------------------------------");

        ThreadPoolExecutor treadPoolExecutor = (ThreadPoolExecutor)InitThreadPoll.getInstance();
        long taskCount = treadPoolExecutor.getTaskCount();//线程池中已执行和未执行的线程总数
        int poolSize = treadPoolExecutor.getPoolSize();//线程池中当前的线程数量
        int activeCount =   treadPoolExecutor.getActiveCount(); //当前线程池中正在执行的线程数量
        long completedTaskCount  =treadPoolExecutor.getCompletedTaskCount();//  已完成的线程任务数量
        int  corePoolSize = treadPoolExecutor.getCorePoolSize();

        return  "线程池中已执行和未执行的线程总数:"+taskCount+"\n" +
                "线程池中当前的线程数量:"+poolSize+"\n"+
                "当前线程池中正在执行的线程数量:"+activeCount+"\n"+
                "已完成的线程任务数量:"+completedTaskCount+"\n"+
                "corePoolSize:"+corePoolSize+"\n";

    }


    @RequestMapping("/simpTemplageMailThreadNull")
    public String simpTemplageMailThreadNull(){
        ExecutorService executorService = InitThreadPoll.getInstance();
        logger.info("{}:",executorService.isShutdown());
        if(!executorService.isShutdown()){
            executorService = null ;
        }
        return  "Hello world spring boot";
    }

    public void getInfoMail(MailBean mailBean){
        logger.info("{}",mailBean.getExName());
        Map<String, Object> map = new HashMap<String, Object>();
        List<MailBean> list = new ArrayList<MailBean>();
        list.add(mailBean);
        map.put("listInfo",list);
        map.put("UserName", "通知");
        map.put("titleName","标题名-测试");
        String toMail = "h****@sift.com.cn";
        String subject ="邮件服务测试";
        mailService.sendTemplageMail(toMail,subject,map);
        try{
            Thread.sleep(9000);
        }catch (Exception ex){
            ex.printStackTrace();
        }


    }




    @RequestMapping("/testThread")
    public String testThread(){

        ExecutorService executorService = InitThreadPoll.getInstance();
        final Semaphore semaphore = new Semaphore(5);

        final List<String> names = new ArrayList<String>();

        names.add("1");
        names.add("2");
        names.add("3");
        names.add("4");
        names.add("5");
        names.add("6");
        names.add("7");
        names.add("8");
        names.add("9");
        names.add("10");

        for (int i = 0; i < names.size(); i++) {

            final String mailBean =  names.get(i);
            final int j=i;
            executorService.execute(new Runnable() {
                public void run() {
                    try {
                        semaphore.acquire(); //获取一个信号量
                        try{
                            Thread.sleep(9000);
                        }catch (Exception ex){
                            ex.printStackTrace();
                        }
                       System.out.print(names.get(j));
                        semaphore.release(); //释放一个信号量
                    }catch (InterruptedException e) {
                        e.printStackTrace();
                    }catch (Exception e){
                        e.printStackTrace();
                    }
                }
            });
        }

        return  "namesTest";
    }


}
Service:
package cn.com.hj.mail.mailService;


import java.util.Map;

/**
 * 处理邮件业务接口
 */
public interface MailService {

    // 发送文本邮件
    public void sendSimpleMail(String to, String subject, String content);

    // 发送html邮件
    public void sendHtmlMail(String to, String subject, String content);
    //发送带附件的邮件
    public void sendAttachmentsMail(String to, String subject, String content, String filePath);
    //发送模板内容邮件
    public void sendTemplageMail(String to, String subject, Map<String, Object> map);

}
ServiceImpl:
package cn.com.hj.mail.mailService.impl;

import cn.com.hj.mail.mailService.MailService;
import freemarker.template.Template;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.FileSystemResource;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Component;
import org.springframework.ui.freemarker.FreeMarkerTemplateUtils;
import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer;

import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.io.File;
import java.util.*;

/**
 * 处理邮件业务类
 */
@Component
public class MailServiceImpl implements MailService {

    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    @Autowired
    private FreeMarkerConfigurer fmc;

    @Autowired
    private JavaMailSender mailSender;
    @Autowired
    JdbcTemplate coreJdbcTemplate;
    //读取配置文件中信息,发件人邮箱
    @Value("${mail.from.info}")
    private String from;

    /**
     * 发送文本邮件
     *
     * @param to
     * @param subject
     * @param content
     */
    public void sendSimpleMail(String to, String subject, String content) {
        SimpleMailMessage message = new SimpleMailMessage();
        message.setFrom(from);
        message.setTo(to);
        message.setSubject(subject);
        message.setText(content);

        try {
            mailSender.send(message);
            logger.info("from:"+from+" to:"+to+" subject:"+subject+" content:"+content);
        } catch (Exception e) {
            logger.error("发送简单邮件时发生异常!", e);
            e.printStackTrace();
        }

    }

    /**
     * 发送html邮件
     *
     * @param to
     * @param subject
     * @param content
     */
    public void sendHtmlMail(String to, String subject, String content) {
        MimeMessage message = mailSender.createMimeMessage();

        try {
            // true表示需要创建一个multipart message
            MimeMessageHelper helper = new MimeMessageHelper(message, true);
            helper.setFrom(from);
            helper.setTo(to);
            helper.setSubject(subject);
            helper.setText(content, true);

           mailSender.send(message);
            logger.info("html邮件发送成功");
        } catch (MessagingException e) {
            logger.error("发送html邮件时发生异常!", e);
        }
    }



    /**
     * 发送带附件的邮件
     *
     * @param to
     * @param subject
     * @param content
     * @param filePath
     */
    @Override
    public void sendAttachmentsMail(String to, String subject, String content, String filePath) {
        MimeMessage message = mailSender.createMimeMessage();

        try {
            MimeMessageHelper helper = new MimeMessageHelper(message, true);
            helper.setFrom(from);
            helper.setTo(to);
            helper.setSubject(subject);
            helper.setText(content, true);

            FileSystemResource file = new FileSystemResource(new File(filePath));
            String fileName = filePath.substring(filePath.lastIndexOf(File.separator));
            helper.addAttachment(fileName, file);
            mailSender.send(message);
            logger.info("带附件的邮件已经发送。");
        } catch (MessagingException e) {
            logger.error("发送带附件的邮件时发生异常!", e);
        }
    }

    /**
     *发送模板内容邮件
     * @param to 发送邮箱
     * @param subject 邮件主题
     * @param map 邮件内容
     */
    public void sendTemplageMail(String[] to, String[] copyEmail, String subject, Map<String, Object> map,String templeName) throws Exception {
        MimeMessage message = mailSender.createMimeMessage();
            MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(message, true);
            mimeMessageHelper.setSubject(subject==null?"":subject);
            mimeMessageHelper.setTo(to);
            mimeMessageHelper.setCc(copyEmail);
            mimeMessageHelper.setFrom(from);
            Template t =  fmc.getConfiguration().getTemplate(templeName);//获取模板
            String content = FreeMarkerTemplateUtils.processTemplateIntoString(t, map);//解析模板
            mimeMessageHelper.setText(content, true);
            mailSender.send(message);
    }
@Override
    public void sendTemplageMail(String to, String subject, Map<String, Object> map) {
        MimeMessage message = mailSender.createMimeMessage();
        try {
            MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(message, true);
            mimeMessageHelper.setSubject(subject);
            mimeMessageHelper.setTo(to);
            mimeMessageHelper.setFrom(from);
            Template t =  fmc.getConfiguration().getTemplate("mailTemplage_1.ftl");//获取模板
            String content = FreeMarkerTemplateUtils.processTemplateIntoString(t, map);//解析模板
            mimeMessageHelper.setText(content, true);
//            mimeMessageHelper.addAttachment();
            mailSender.send(message);
        } catch (Exception e) {
            logger.error("发送带模板的邮件时发生异常!", e);
        }


    }

}



MailBean:
package cn.com.hj.mail.bean;

public class MailBean {

    public String getTime() {
        return time;
    }

    public void setTime(String time) {
        this.time = time;
    }

    public String getExName() {
        return exName;
    }

    public void setExName(String exName) {
        this.exName = exName;
    }

    public String getExNum() {
        return exNum;
    }

    public void setExNum(String exNum) {
        this.exNum = exNum;
    }

    private  String time;
    private String exName;
    private String exNum;


}
InitThreadPoll:
package cn.com.hj.mail.common;/**
 */

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 *  初始化线程池
 */
public class InitThreadPoll {

    // 单例对象
    private static ExecutorService executorService = null;

    // 静态的工厂方法
    public static ExecutorService getInstance() {
        if (executorService == null) { // 双重检测机制        // B
            synchronized (ExecutorService.class) { // 同步锁
                if (executorService == null) {
                    System.out.println("重新创建对象----------------");
                    executorService = Executors.newCachedThreadPool(); // A - 3
                }
            }
        }
        return executorService;
    }


    public static void main(String[] args) {
        System.out.println(getInstance().hashCode());
        System.out.println(getInstance().hashCode());
    }


}


#mail
spring.mail.username=10*****[email protected]
spring.mail.password=idshjdsaksa
spring.mail.host=smtp.qq.com
spring.mail.properties.mail.smtp.ssl.enable=true
spring.mail.default-encoding=UTF-8
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true

mail.from.info=10*****[email protected]

猜你喜欢

转载自blog.csdn.net/jungeCSND/article/details/107615237