欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java的邮件发送功能实现

程序员文章站 2022-03-26 17:44:29
简述使用spring 的邮件发送功能,能够很简易地实现 配置自己的邮箱信息,发送邮件到指定人,包括抄送、密送、以及上传附件pom.xml依赖 org.springframework.boot spring-boot-starter-mail由于版本兼容问题,使用过两种方式,...

简述

使用spring 的邮件发送功能,能够很简易地实现 配置自己的邮箱信息,发送邮件到指定人,包括抄送、密送、以及上传附件

pom.xml依赖

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

由于版本兼容问题,使用过两种方式,都提供给大家;具体哪个版本兼容哪种方式,在此就不过多细究;


邮件信息实体封装

package com.kellan.demo.utils.entitys;

import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;
import org.springframework.web.multipart.MultipartFile;
import java.util.Date;

/**
 * 邮件信息 实体
 * @author: Kellan
 * @time: 2020/11/27 18:27
 */
@Data
public class MailVo {

    public MailVo() {
    }

    public MailVo(String from, String to, String subject, Date sentDate) {
        this.from = from;
        this.to = to;
        this.subject = subject;
        this.sentDate = sentDate;
    }

    private String id;
    /**
     * 邮件发送人
     */
    private String from;
    /**
     * 邮件接收人(多个邮箱则用逗号","隔开)
     */
    private String to;
    /**
     * 邮件主题
     */
    private String subject;
    /**
     * 邮件内容
     */
    private String text;
    /**
     * 发送时间
     */
    private Date sentDate;
    /**
     * 抄送(多个邮箱则用逗号","隔开)
     */
    private String cc;
    /**
     * 密送(多个邮箱则用逗号","隔开)
     */
    private String bcc;
    /**
     * 状态
     */
    private String status;
    /**
     * 报错信息
     */
    private String error;
    /**
     * 邮件附件
     */
    @JsonIgnore
    private MultipartFile[] multipartFiles;
    /**
     * 邮件附件
     */
    @JsonIgnore
    private List<File> fileList;

}

方式一:(较新的版本: 在此使用的是 spring-boot 2.1.3)

package com.kellan.demo.utils.email;

import com.kellan.demo.utils.entitys.MailVo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import java.util.Date;

/**
 * 发送邮箱工具类
 *
 * 使用该类,需要pom.xml引用 spring-boot-starter-mail
 * 并且在配置文件中,配置
 * spring.mail.host \ username \ password(授权码)
 *
 * @author: Kellan
 * @time: 2020/11/26 15:19
 */
@Slf4j
@Component
public class EmailUtils {

    @Resource
    JavaMailSenderImpl mailSender;

    public void sendMimeMail(MailVo mailVo) {
        try {
            MimeMessageHelper messageHelper = new MimeMessageHelper(mailSender.createMimeMessage(), true);
            // 邮件发信人
            messageHelper.setFrom(mailVo.getFrom());
            // 收信人
            messageHelper.setTo(mailVo.getTo().split(","));
            // 主题
            messageHelper.setSubject(mailVo.getSubject());
            // 抄送
            if (!StringUtils.isEmpty(mailVo.getCc())) {
                messageHelper.setCc(mailVo.getCc().split(","));
            }
            // 密送
            if (!StringUtils.isEmpty(mailVo.getBcc())) {
                messageHelper.setCc(mailVo.getBcc().split(","));
            }
            // 附件
            if (mailVo.getMultipartFiles() != null) {
                for (MultipartFile multipartFile : mailVo.getMultipartFiles()) {
                    if("".equals(multipartFile.getOriginalFilename())){
                        break;
                    }
                    messageHelper.addAttachment(multipartFile.getOriginalFilename(), multipartFile);
                }
            }
            // 发送时间
            if (StringUtils.isEmpty(mailVo.getSentDate())) {
                mailVo.setSentDate(new Date());
                messageHelper.setSentDate(mailVo.getSentDate());
            }

            messageHelper.setText(mailVo.getText(),true);
            // 发送
            mailSender.send(messageHelper.getMimeMessage());
            mailVo.setStatus("ok");
            log.info("发送邮件成功:{}->{}", mailVo.getFrom(), mailVo.getTo());
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }


}

方式二:(较新的版本: 在此使用的是 spring-boot 1.5.4)

package com.kellan.demo.utils.email;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

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.util.Date;
import java.util.Properties;

/**
 * 发送邮箱工具类
 *
 * 使用该类,需要pom.xml引用 spring-boot-starter-mail
 *
 * @author: Kellan
 * @time: 2020/11/26 15:19
 */
@Component
public class EmailUtils {

    private final static Logger logger = LoggerFactory.getLogger(EmailUtils.class);


    private Session getSession() {
        // 获取系统属性
        Properties properties = System.getProperties();
        // 设置邮件服务器
        properties.setProperty("mail.smtp.host", "smtphz.qiye.163.com");

        properties.put("mail.smtp.auth", "true");

        Session session = Session.getDefaultInstance(properties, new Authenticator() {
            public PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication("***@163.com", "Passw0rd"); //发件人邮件用户名、生成的授权码
            }
        });
        return session;
    }

    /**
     * 发送邮件
     * @param mailVo
     * @author: Kellan
     * @time: 2020/11/27 9:09
     */
    public boolean sendMimeMail(MailVo mailVo) {
        try {
            MimeMessage messageHelper = new MimeMessage(getSession());
            // 邮件发信人
            messageHelper.setFrom(mailVo.getFrom());
            // 收信人
            if (!StringUtils.isEmpty(mailVo.getTo())) {
                String[] split = mailVo.getTo().split(",");
                for (int i = 0; i < split.length; i++) {
                    messageHelper.addRecipient(Message.RecipientType.TO, new InternetAddress(split[i]));
                }
            }
            // 主题
            messageHelper.setSubject(mailVo.getSubject());
            // 发送时间
            if (StringUtils.isEmpty(mailVo.getSentDate())) {
                mailVo.setSentDate(new Date());
                messageHelper.setSentDate(mailVo.getSentDate());
            }
            // 抄送
            if (!StringUtils.isEmpty(mailVo.getCc())) {
                String[] split = mailVo.getCc().split(",");
                for (int i = 0; i < split.length; i++) {
                    messageHelper.addRecipient(Message.RecipientType.CC, new InternetAddress(split[i]));
                }
            }
            // 发送
            Transport.send(setMultipart(messageHelper, mailVo));
        } catch (Exception e) {
            logger.error("=== 发送邮件失败", e);
            e.printStackTrace();
            return false;
        }
        return true;
    }

    /**
     * 封装邮件 正文内容
     * @author: Kellan
     * @time: 2020/11/27 9:10
     */
    private MimeMessage setMultipart(MimeMessage message, MailVo mailVo) throws Exception{
        //设置邮件内容,混合模式
        MimeMultipart msgMultipart = new MimeMultipart("mixed");
        message.setContent(msgMultipart);
        //设置消息正文
        MimeBodyPart content = new MimeBodyPart();
        msgMultipart.addBodyPart(content);
        //设置正文格式
        MimeMultipart bodyMultipart = new MimeMultipart("related");
        content.setContent(bodyMultipart);
        //设置正文内容
        MimeBodyPart textPart = new MimeBodyPart();
        bodyMultipart.addBodyPart(textPart);
        textPart.setContent(mailVo.getText(), "text/plain;charset=UTF-8");

        // 设置附件
        if (!mailVo.getFileList().isEmpty()) {
            mailVo.getFileList().stream().forEach(file -> {
                //设置相关文件
                try {
                    MimeBodyPart filePart = new MimeBodyPart();
                    FileDataSource dataSource = new FileDataSource(file);
                    DataHandler dataHandler = new DataHandler(dataSource);
                    // 文件处理
                    filePart.setDataHandler(dataHandler);
                    // 附件名称
                    filePart.setFileName(file.getName());
                    // 放入正文(有先后顺序,所以在正文后面)
                    msgMultipart.addBodyPart(filePart);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            });
        }
        //保存文件准备发送
        message.saveChanges();
        return message;
    }
}

两种方式的区别

从代码的复杂程度来看,方式一是较为简易的;特别是在设置发送人、收件人,和附件上;代码的封装成都较高;而方式二在代码上虽然较为复杂,但是自主性较高,在消息体中,可自定义的样式比较倾向于程序员,可选择纯文本、html等样式;

使用Java发送邮件,最大的问题点在于开始配置时,经常报 验证失败;当时我也是在2.1.3版本中使用方式一验证可行后,回到项目的1.5.4版本中时,却始终验证不上; 后来迫于无奈,才用的方式二;

本文地址:https://blog.csdn.net/q410654146/article/details/110259082