springboot 整合 Mail 邮件功能

application 配置文件修改

  mail:
    host: smtp.geotmt.com
    username: y***@geotmt.com        # 邮箱和密码自行配置
    password: y***66
    default-encoding: UTF-8
    properties:
      mail:
        smtp:
          auth: true
          starttls:
            enable: true
            requied: true

pom 文件依赖

 <!--邮件-->
        <dependency>
            <groupId>com.sun.mail</groupId>
            <artifactId>javax.mail</artifactId>
            <version>1.6.2</version>
        </dependency>

邮件 工具类

package com.geotmt.billingcenter.common.utils;

import com.geotmt.billingcenter.common.thread.EmailThread;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.FileSystemResource;
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.util.StringUtils;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.annotation.Resource;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.internet.*;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * @Description 发邮件工具类
 * @Author      yanghanwei
 * @Mail        yanghanwei@geotmt.com
 * @Date        2019/5/7 15:51
 * @Version     v1
 **/
@Component
public class MailUtils {
    private final Logger logger = LoggerFactory.getLogger(MailUtils.class);

    @Resource
    private JavaMailSender sender;

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

    /**
     * 发送纯文本的简单邮件
     * @param toStr
     * @param subject
     * @param content
     */
    public void sendSimpleMail(String toStr, String subject, String content){
        String[] toArr = dealTo(toStr);
        try {
            if(null != toArr && toArr.length > 0){
                SimpleMailMessage message = new SimpleMailMessage();
                message.setFrom(from);
                message.setTo(toArr);
                message.setSubject(subject);
                message.setText(content);
                sender.send(message);
                logger.info("简单邮件已经发送至:{}", Arrays.toString(toArr));
            }else {
                logger.info("收件人列表为空");
            }
        } catch (Exception e) {
            logger.error("发送简单邮件时发生异常!", e);
        }
    }

    /**
     * 发送html格式的邮件
     * @param toStr
     * @param subject
     * @param content
     */
    public void sendHtmlMail(String toStr, String subject, String content){
        String[] toArr = dealTo(toStr);
        try {
            if(null != toArr && toArr.length > 0){
                MimeMessage message = sender.createMimeMessage();
                //true表示需要创建一个multipart message
                MimeMessageHelper helper = new MimeMessageHelper(message, true);
                helper.setFrom(from);
                helper.setTo(toArr);
                helper.setSubject(subject);
                helper.setText(content, true);
                EmailThread et = new EmailThread(message, sender);
                et.start();
                logger.info("html邮件已经发送至:{}",Arrays.toString(toArr));
            }else {
                logger.info("收件人列表为空");
            }
        } catch (MessagingException e) {
            logger.error("发送html邮件时发生异常!", e);
        }
    }

    /**
     * 发送带附件的邮件
     * @param toStr
     * @param subject
     * @param content
     * @param filePath
     */
    public void sendAttachmentsMail(String toStr, String subject, String content, String filePath){
        logger.info("发送带附件的邮件 starting");
        String[] toArr = dealTo(toStr);
        try {
            if(null != toArr && toArr.length > 0){
                MimeMessage message = sender.createMimeMessage();
                //true表示需要创建一个multipart message
                MimeMessageHelper helper = new MimeMessageHelper(message, true);
                helper.setFrom(from);
                helper.setTo(toArr);
                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);
                EmailThread et = new EmailThread(message, sender);
                et.start();
                logger.info("带附件的邮件已经发送至:{}", Arrays.toString(toArr));
            }else {
                logger.info("收件人列表为空");
            }
        } catch (MessagingException e) {
            logger.error("发送带附件的邮件时发生异常!", e);
        }
    }

    /**
     * 发送嵌入静态资源(一般是图片)的邮件
     * @param subject
     * @param content 邮件内容,需要包括一个静态资源的id,比如:<img src=\"cid:rscId01\" >
     * @param rscPath 静态资源路径和文件名
     * @param rscId 静态资源id
     */
    public void sendInlineResourceMail(String toStr, String subject, String content, String rscPath, String rscId){
        String[] toArr = dealTo(toStr);
        try {
            if(null != toArr && toArr.length > 0) {
                MimeMessage message = sender.createMimeMessage();
                //true表示需要创建一个multipart message
                MimeMessageHelper helper = new MimeMessageHelper(message, true);
                helper.setFrom(from);
                helper.setTo(toArr);
                helper.setSubject(subject);
                helper.setText(content, true);
                FileSystemResource res = new FileSystemResource(new File(rscPath));
                helper.addInline(rscId, res);
                EmailThread et = new EmailThread(message, sender);
                et.start();
                logger.info("嵌入静态资源的邮件已经发送至:{}", Arrays.toString(toArr));
            }else {
                logger.info("收件人列表为空");
            }
        } catch (MessagingException e) {
            logger.error("发送嵌入静态资源的邮件时发生异常!", e);
        }
    }

    /**
     * 发送多附件 方法
     * @param toStr
     * @param text
     * @param title
     * @param filePath
     * @throws Exception
     */
    public void sendBatchMailWithFile(String toStr, String text, String title, String[] filePath) throws Exception{
        String[] mailto = dealTo(toStr);
        MimeMessage mimeMessage = sender.createMimeMessage();
        MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true, "UTF-8");
        messageHelper.setFrom(from);
        messageHelper.setSubject(title);
        if (filePath != null) {
            // 新建一个存放信件内容的BodyPart对象
            BodyPart mdp = new MimeBodyPart();
            // 给BodyPart对象设置内容和格式/编码方式
            mdp.setContent(text, "text/html;charset=UTF-8");
            // 新建一个MimeMultipart对象用来存放BodyPart对象
            Multipart mm = new MimeMultipart();
            // 将BodyPart加入到MimeMultipart对象中(可以加入多个BodyPart)
            mm.addBodyPart(mdp);
            // 把mm作为消息对象的内容
            MimeBodyPart filePart;
            FileDataSource filedatasource;
            // 逐个加入附件
            for (int j = 0; j < filePath.length; j++) {
                filePart = new MimeBodyPart();
                filedatasource = new FileDataSource(filePath[j]);
                filePart.setDataHandler(new DataHandler(filedatasource));
                try {
                    filePart.setFileName(MimeUtility.encodeText(filedatasource.getName()));
                } catch (Exception e) {
                    e.printStackTrace();
                }
                mm.addBodyPart(filePart);
            }
            mimeMessage.setContent(mm);
        } else {
            messageHelper.setText(text, true);
        }
        // 不能使用string类型的类型,这样只能发送一个收件人
        List<InternetAddress> list = new ArrayList<>();
        for (int i = 0; i < mailto.length; i++) {
            list.add(new InternetAddress(mailto[i]));
        }
        InternetAddress[] address = list.toArray(new InternetAddress[list.size()]);
        mimeMessage.setRecipients(Message.RecipientType.TO, address);
        mimeMessage = messageHelper.getMimeMessage();

        EmailThread et = new EmailThread(mimeMessage, sender);
        et.start();
        logger.info("多附件邮件已经发送至:{}", Arrays.toString(mailto));
    }

    private String [] dealTo(String to){
        if(!StringUtils.isEmpty(to)){
            return to.split(",");
        }
        return null;
    }

}

发送邮件的线程类

/**
 * @Description 发送邮件的 线程类
 * @Author      yanghanwei
 * @Mail        yanghanwei@geotmt.com
 * @Date        12:26 2019-11-20
 * @Version     v1
 **/
public class EmailThread extends Thread {

    private JavaMailSender sender;

    private final MimeMessage mimeMessage;

    public EmailThread(MimeMessage mimeMessage, JavaMailSender sender) {
        this.mimeMessage = mimeMessage;
        this.sender = sender;
    }

    @Override
    public void run() {
        sender.send(mimeMessage);
    }
}

 

简单实用示例

@Resource
private MailUtils mailUtils;

public String testMail(){
    mailUtils.sendSimpleMail(to, "测试", "测试邮件发送!");
    return "success";
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值