java发送邮件工具

package com.example.test.utils;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.net.NetUtil;
import cn.hutool.extra.mail.MailAccount;
import cn.hutool.extra.mail.MailUtil;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * 发送邮件工具
 *
 * @author 陈学冬杭州分冬
 */
@Slf4j
public class MailSendUtil {
    /*********************************** 需要修改的配置 开始 ***************************************/
    /**
     * 邮件参数
     */
    public static final List<MailAccount> MAIL_ACCOUNT_LIST = CollUtil.newArrayList(
            initMailAccount("发送邮件的邮箱1@163.com", "ABVYBZDLAWIGQBGE")
            , initMailAccount("发送邮件的邮箱2@163.com", "NMISTNGOYQMXYBUN")
            , initMailAccount("发送邮件的邮箱3@163.com", "FPIYNFZBNAEQKMQN")
            , initMailAccount("发送邮件的邮箱4@163.com", "ZXUWEGHWPGXBXBIQ")
            , initMailAccount("发送邮件的邮箱5@163.com", "OPGKTDTYZLYWXFPM")
    );

    /**
     * 邮件接收人
     */
    public static final ArrayList<String> TOS = CollUtil.newArrayList("接收邮件的邮箱@qq.com");
    /*********************************** 需要修改的配置 结束 ***************************************/

    /*********************************** 准备工作 开始 ***************************************/

    /**
     * 获取本机网卡IP地址
     */
    public static final String LOCALHOST_STR = NetUtil.getLocalhostStr();
    /**
     * 邮件list下标
     */
    public static int SUBSCRIPT = 0;
    /**
     * 发送邮件失败次数
     */
    public static int fail = 0;


    /**
     * 更换邮件参数列表下标
     */
    private static void updateSUBSCRIPT() {
        //配置list下标+1
        int i = SUBSCRIPT + 1;
        //如果没超出总量就直接赋值
        if (i < MAIL_ACCOUNT_LIST.size()) {
            SUBSCRIPT = i;
            //超出了则归0计数
        } else {
            SUBSCRIPT = 0;
        }
    }

    /**
     * 通过下标获取生效的邮件参数
     *
     * @return
     */
    public static MailAccount getMailAccount() {
        return MAIL_ACCOUNT_LIST.get(SUBSCRIPT);
    }

    /**
     * 初始化邮件参数
     *
     * @param from
     * @param pass
     */
    private static MailAccount initMailAccount(String from, String pass) {
        MailAccount mailAccount = new MailAccount();
        mailAccount.setPort(465);
        mailAccount.setSslEnable(true);
        mailAccount.setFrom(from);
        mailAccount.setPass(pass);
        return mailAccount;
    }
    /*********************************** 准备工作 结束 ***************************************/

    /*********************************** 发送方法 开始 ***************************************/
    /**
     * 发送普通文本邮件
     *
     * @param subject
     * @param content
     */
    public static void mailSend(String subject, String content) {
        Thread thread = new Thread(new MailSend(subject, content));
        thread.start();
    }

    /**
     * 发送普通文本邮件(给线程用)
     *
     * @param subject
     * @param content
     */
    public static void mailSendRunnable(String subject, String content) {
        //如果发送失败次数大于了邮件配置list,说明每个配置都试过了都不成功,则不再重试,并打印报错信息
        if (fail > MAIL_ACCOUNT_LIST.size()) {
//            log.info("邮件发送失败:{}", MAIL_ACCOUNT_LIST);
            return;
        }
        try {
            //尝试发送邮件
            MailUtil.send(
                    //拖过下标获取生效的邮件参数
                    getMailAccount(),
                    //发送人
                    TOS,
                    //当前ip地址(可以知道是哪台机子发的) + 标题
                    LOCALHOST_STR + subject,
                    //正文
                    content, false);
            //如果未发生异常,则把失败次数归零
            fail = 0;
        } catch (Exception e) {
            //发送失败则失败次数+1
            fail++;
            //获取邮件list的下标更新
            updateSUBSCRIPT();
            //递归
            mailSendRunnable(subject, content);
        }
    }


    /**
     * 带文件的发送邮件
     *
     * @param subject
     * @param content
     * @param file
     */
    public static void mailSend(String subject, String content, MultipartFile file) {
        Thread thread = new Thread(new MailSendFile(subject, content, file));
        thread.start();
    }


    /**
     * 带文件的发送邮件(给线程用)
     *
     * @param subject
     * @param content
     */
    public static void mailSendRunnable(String subject, String content, boolean isHtml, File... files) {
        if (fail > MAIL_ACCOUNT_LIST.size()) {
//            log.info("邮件发送失败:{}", MAIL_ACCOUNT_LIST);
            return;
        }
        try {
            MailUtil.send(getMailAccount(), TOS, LOCALHOST_STR + subject, content, isHtml, files);
            fail = 0;
        } catch (Exception e) {
            fail++;
            updateSUBSCRIPT();
            mailSendRunnable(subject, content, isHtml, files);
        }
    }
    /*********************************** 发送方法 结束 ***************************************/
    /****************************************** 多线程类 开始 ******************************************************/

    @Data
    private static class MailSend implements Runnable {

        private String subject;
        private String content;

        private MailSend(String subject, String content) {
            super();
            this.subject = subject;
            this.content = content;
        }

        @Override
        public void run() {
            MailSendUtil.mailSendRunnable(subject, content);
        }
    }


    @Data
    private static class MailSendFile implements Runnable {
        private String subject;
        private String content;
        private MultipartFile file;

        private MailSendFile(String subject, String content, MultipartFile file) {
            super();
            this.subject = subject;
            this.content = content;
            this.file = file;
        }

        @Override
        public void run() {
            if (file != null) {
                File file2 = null;
                try {
                    //获取原始文件名
                    String originalFilename = file.getOriginalFilename();
                    String[] filename = originalFilename.split("\\.");
                    //创建临时文件
                    file2 = File.createTempFile(filename[0], "." + filename[1]);
                    //把网络文件转移至临时文件
                    file.transferTo(file2);
                    //发送邮件
                    MailSendUtil.mailSendRunnable(subject, content, true, file2);
                    //删除临时文件
                    file2.deleteOnExit();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
/****************************************** 多线程类 结束 ******************************************************/
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值