Java使用企业邮箱发送预警邮件

前言:最近接到一个需求,需要根据所监控设备的信息,在出现问题时发送企业微信进行预警。

POM依赖

<!--  邮件   -->
<dependency>
   <groupId>com.sun.mail</groupId>
   <artifactId>jakarta.mail</artifactId>
   <version>1.6.7</version>
</dependency>

yml配置项 

mail:
    service:
        smtpSslEnable: true
        smtpAuth: true
        smtpHost: smtp.exmail.qq.com # 企业微信的host
        smtpPort: 465
        account: 发信人邮箱名
        password: 发信人邮箱密码

邮箱工具类

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Data
@Component
@ConfigurationProperties(prefix = "mail.service")
public class MailServiceProperties {

    private String account;


    /**
     * 登录密码
     */
    private String password;


    /**
     * 邮件服务器地址
     */
    private String smtpHost;


    /**
     * 发信端口
     */
    private String smtpPort;


    /**
     * 是否认证
     */
    private String smtpAuth;


    private String smtpSslEnable;


}
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;

@Data
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
public class MailContent {
    private String aliasName;
    private String recipients;
    private String subject;
    private String content;
}
import com.ruoyi.common.config.MailServiceProperties;
import com.ruoyi.common.constant.MailContent;
import com.sun.mail.util.MailSSLSocketFactory;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import java.io.File;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.StandardCopyOption;
import java.security.GeneralSecurityException;
import java.util.Date;
import java.util.Properties;


@Slf4j
@Component
public class MailUtils {

    @Autowired
    private MailServiceProperties properties;

    /**
     * 批量发送邮件
     *
     * @param aliasName 别名
     * @param subject   主题
     * @param content   内容
     */
    public void batchSendEmail(String recipientList, String aliasName, String subject, String content) {
        if (!StringUtils.isEmpty(recipientList)) {
            String[] arrs = recipientList.split(",");
            for (String arr : arrs) {
                send(new MailContent(aliasName, arr, subject, content));
            }
        } else {
            log.error("收件人为空,发送失败。");
        }
    }

    /**
     * 批量发送邮件 带图片
     *
     * @param aliasName 别名
     * @param subject   主题
     * @param content   内容
     * @param  is       图片
     */
    public void batchSendEmail(String recipientList, String aliasName, String subject, String content,InputStream is) {
        if (!StringUtils.isEmpty(recipientList)) {
            String[] arrs = recipientList.split(",");
            for (String arr : arrs) {
                send(new MailContent(aliasName, arr, subject, content),is);
            }
        } else {
            log.error("收件人为空,发送失败。");
        }
    }

    /**
     * 发送邮件
     *
     * @param content
     */

    private void send(MailContent content) {
        // 设置邮件属性
        Properties prop = new Properties();
        prop.setProperty("mail.transport.protocol", "smtp");
        prop.setProperty("mail.smtp.host", properties.getSmtpHost());
        prop.setProperty("mail.smtp.port", properties.getSmtpPort());
        prop.setProperty("mail.smtp.auth", properties.getSmtpAuth());
        prop.setProperty("mail.smtp.ssl.protocols", "TLSv1.2");
        MailSSLSocketFactory sslSocketFactory = null;
        try {
            sslSocketFactory = new MailSSLSocketFactory();
            sslSocketFactory.setTrustAllHosts(true);
        } catch (GeneralSecurityException e1) {
            log.error("开启 MailSSLSocketFactory 失败", e1);
        }
        if (sslSocketFactory == null) {
            log.error("开启 MailSSLSocketFactory 失败");
        } else {
            prop.put("mail.smtp.ssl.enable", properties.getSmtpSslEnable());
            prop.put("mail.smtp.ssl.socketFactory", sslSocketFactory);
            // 创建邮件会话(注意,如果要在一个进程中切换多个邮箱账号发信,应该用 Session.getInstance)
            Session session = Session.getDefaultInstance(prop, new MyAuthenticator(properties.getAccount(), properties.getPassword()));
            try {
                MimeMessage mimeMessage = new MimeMessage(session);
                // 设置发件人别名(如果未设置别名就默认为发件人邮箱)
                if (content.getAliasName() != null && !content.getAliasName().trim().isEmpty()) {
                    mimeMessage.setFrom(new InternetAddress(properties.getAccount(), content.getAliasName()));
                } else {
                    mimeMessage.setFrom(new InternetAddress(properties.getAccount(), properties.getAccount()));
                }
                // 设置主题和收件人、发信时间等信息
                mimeMessage.addRecipient(Message.RecipientType.TO, new InternetAddress(content.getRecipients()));
                mimeMessage.setSubject(content.getSubject());
                mimeMessage.setSentDate(new Date());

                // 添加正文信息
                MimeMultipart multipart = new MimeMultipart();
                MimeBodyPart body = new MimeBodyPart();
                body.setContent(content.getContent(), "text/html; charset=UTF-8");
                multipart.addBodyPart(body);

                mimeMessage.setContent(multipart);
                // 开始发信
                mimeMessage.saveChanges();
                Transport.send(mimeMessage);
            } catch (Exception e) {
                log.error("发送邮件错误:", e);
            }
        }
    }

    /**
     * 发送邮件(带图片)
     *
     * @param content 文本内容
     * @param inputStream 图片内容
     */

    private void send(MailContent content, InputStream inputStream) {
        // 设置邮件属性
        Properties prop = new Properties();
        prop.setProperty("mail.transport.protocol", "smtp");
        prop.setProperty("mail.smtp.host", properties.getSmtpHost());
        prop.setProperty("mail.smtp.port", properties.getSmtpPort());
        prop.setProperty("mail.smtp.auth", properties.getSmtpAuth());
        prop.setProperty("mail.smtp.ssl.protocols", "TLSv1.2");
        MailSSLSocketFactory sslSocketFactory = null;
        try {
            sslSocketFactory = new MailSSLSocketFactory();
            sslSocketFactory.setTrustAllHosts(true);
        } catch (GeneralSecurityException e1) {
            log.error("开启 MailSSLSocketFactory 失败", e1);
        }
        if (sslSocketFactory == null) {
            log.error("开启 MailSSLSocketFactory 失败");
        } else {
            prop.put("mail.smtp.ssl.enable", properties.getSmtpSslEnable());
            prop.put("mail.smtp.ssl.socketFactory", sslSocketFactory);
            // 创建邮件会话(注意,如果要在一个进程中切换多个邮箱账号发信,应该用 Session.getInstance)
            Session session = Session.getDefaultInstance(prop, new MyAuthenticator(properties.getAccount(), properties.getPassword()));
            try {
                MimeMessage mimeMessage = new MimeMessage(session);
                // 设置发件人别名(如果未设置别名就默认为发件人邮箱)
                if (content.getAliasName() != null && !content.getAliasName().trim().isEmpty()) {
                    mimeMessage.setFrom(new InternetAddress(properties.getAccount(), content.getAliasName()));
                } else {
                    mimeMessage.setFrom(new InternetAddress(properties.getAccount(), properties.getAccount()));
                }
                // 设置主题和收件人、发信时间等信息
                mimeMessage.addRecipient(Message.RecipientType.TO, new InternetAddress(content.getRecipients()));
                mimeMessage.setSubject(content.getSubject());
                mimeMessage.setSentDate(new Date());

                // 添加正文信息
                MimeMultipart multipart = new MimeMultipart();


                //邮件内容
                //准备图片数据
                MimeBodyPart image=new MimeBodyPart();
                File tmpFile =File.createTempFile("123",".jpg");
                Files.copy(inputStream,tmpFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
                DataHandler dh=new DataHandler(new FileDataSource(tmpFile));
                image.setDataHandler(dh);
                //id自己设置
                image.setContentID("123");
                //image.setFileName("999.png");

                //正文
                MimeBodyPart text=new MimeBodyPart();
                text.setContent(content.getContent()+"<br/><a><img src='cid:123'></a>","text/html;charset=UTF-8");
                // text.setContent("<h1 style='color:red'>带图片的邮件<img src='cid:bz.jpg'></h1>","text/html;charset=UTF-8");

                MimeMultipart mmTextImage = new MimeMultipart();
                mmTextImage.addBodyPart(text);
                mmTextImage.addBodyPart(image);
                // 关联关系
                mmTextImage.setSubType("related");

                MimeBodyPart textImage = new MimeBodyPart();
                textImage.setContent(mmTextImage);

                multipart.addBodyPart(textImage);
                multipart.setSubType("mixed");

                mimeMessage.setContent(multipart);
                // 开始发信
                mimeMessage.saveChanges();
                Transport.send(mimeMessage);
                tmpFile.deleteOnExit();
            } catch (Exception e) {
                log.error("发送邮件错误:", e);
            }
        }
    }

    /**
     * 认证信息
     */
    static class MyAuthenticator extends Authenticator {

        /**
         * 用户名
         */
        String username = null;

        /**
         * 密码
         */
        String password = null;

        /**
         * 构造器
         *
         * @param username 用户名
         * @param password 密码
         */
        public MyAuthenticator(String username, String password) {
            this.username = username;
            this.password = password;
        }

        @Override
        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication(username, password);
        }
    }

}

Controller

import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.utils.MailUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

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

    @Autowired
    private MailUtils mailUtils;

    @PostMapping("/sendMail")
    public R sendMail() {
        String recipientList = "xxx@xx.com"; //收件人邮箱,以逗号分割,可同时发给多个人
        String aliasName = "测试邮件";
        String subject = "邮件主题";
        String content = "邮件内容";

        mailUtils.batchSendEmail(recipientList, aliasName, subject, content);
        return R.ok();
    }
}

测试结果

  • 11
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

顾十方

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值