java控制发送邮箱(qq邮箱、网易邮箱、新浪邮箱)

一、背景

需要通过动态配置邮箱,进行发送信息。这里配置的邮箱,包括不同类型的邮箱,如新浪、qq、网易等等,所以写了个动态配置的方法。

二、实现逻辑

  1. 配置服务器信息
  2. 配置发送人的授权码(后面会说明如何获取)
  3. 配置接收人、抄送人等等
  4. 配置发送信息,包括文本、图片、附件等等

三、工具类代码实现

  1. 附件类

    import lombok.Data;
    
    /**
     * @author 天真热
     * @create 2022-05-07 15:45
     * @desc
     **/
    @Data
    public class FileDto {
        private String path;
        private String fileName;
    
        public FileDto(String path, String fileName) {
            this.path = path;
            this.fileName = fileName;
        }
    }
    
    
  2. 服务器信息类

    import lombok.Data;
    
    /**
     * @author 天真热
     * @create 2022-05-07 14:14
     * @desc
     **/
    @Data
    public class MailDto {
        /**
         * 邮件发送协议
         */
        private String protocol;
        /**
         * SMTP邮件服务器
         */
        private String host;
        /**
         * SMTP邮件服务器默认端口
         */
        private String port;
        /**
         * 是否要求身份认证
         */
        private String isAuth="true";
        /**
         * 是否启用调试模式(启用调试模式可打印客户端与服务器交互过程时一问一答的响应消息)
         */
        private String isEnabledDebugMod="true";
        /**
         * 发件人邮箱授权码
         */
        private String authorizationCode;
        /**
         * 发件人
         */
        private String from;
        /**
         * 发件人名称
         */
        private String setFromName;
    }
    
    
  3. 邮箱发送核心工具类(文本+附件)

    import javax.activation.DataHandler;
    import javax.activation.DataSource;
    import javax.activation.FileDataSource;
    import javax.mail.*;
    import javax.mail.internet.*;
    import java.io.File;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;
    import java.util.Properties;
    
    /**
     * @author 天真热
     * @create 2022-05-07 14:13
     * @desc
     **/
    public class MailUtil {
    
        private static Properties props = null;
        private static Transport transport = null;
        public static List<String> emails = new ArrayList<>();
        public static List<String> emailsMacd = new ArrayList<>();
        private MailDto mailDto;
    
    
    
        /**
         * 初始化邮箱连接
         *
         * @param mail
         */
        public MailUtil(MailDto mail) {
            this.mailDto = mail;
        }
    
    
        /**
         * 发送复杂邮件
         *
         * @param title        邮件标题
         * @param content      邮件内容
         * @param receiveArray 接收人集合
         * @param toCc         抄送人
         * @param toBcc        密送人
         * @param files        附件集合
         * @param priority     优先级(1:紧急   3:普通    5:低)
         * @throws Exception
         */
        public void sendMultipleEmail(String title, String content, Address[] receiveArray, InternetAddress toCc, InternetAddress toBcc, List<FileDto> files, String priority) throws Exception {
            //初始化transport
            initTransport();
            try {
                // 创建Session实例对象
                Session session = Session.getInstance(props,null);
                // 创建MimeMessage实例对象
                MimeMessage message = new MimeMessage(session);
                // 设置发送时间
                message.setSentDate(new Date());
                // 设置优先级(1:紧急   3:普通    5:低)
                message.setHeader("X-Priority", priority);
                // 设置主题
                message.setSubject(title);
                // 设置发送人
                message.setFrom(new InternetAddress(mailDto.getFrom(), mailDto.getSetFromName(), "utf-8"));
                // 设置收件人
                message.setRecipients(Message.RecipientType.TO, receiveArray);
                // 设置抄送人
                if (toCc != null) {
                    message.setRecipient(Message.RecipientType.CC, toCc);
                }
                // 设置密送人
                if (toBcc != null) {
                    message.setRecipient(Message.RecipientType.BCC, toBcc);
                }
                // 要求阅读回执(收件人阅读邮件时会提示回复发件人,表明邮件已收到,并已阅读)
                //message.setHeader("Disposition-Notification-To", mailDto.getFrom());
                // 创建一个MIME子类型为"mixed"的MimeMultipart对象,表示这是一封混合组合类型的邮件
                // 设置回复人(收件人回复此邮件时,默认收件人)
                //message.setReplyTo(InternetAddress.parse("\"" + MimeUtility.encodeText("天真呢") + "\" <1738708583@qq.com>"));
    
                // 创建一个MIME子类型为"mixed"的MimeMultipart对象,表示这是一封混合组合类型的邮件
                MimeMultipart mailContent = new MimeMultipart("mixed");
                //附件
                for (FileDto file : files) {
                    MimeBodyPart attach = new MimeBodyPart();
                    DataSource ds = new FileDataSource(file.getPath());
                    DataHandler dh = new DataHandler(ds);
                    attach.setFileName(MimeUtility.encodeText(file.getFileName()));
                    attach.setDataHandler(dh);
                    mailContent.addBodyPart(attach);
                }
    
                // 正文
                MimeBodyPart mailBody = new MimeBodyPart();
                MimeMultipart body = new MimeMultipart("related");  //邮件正文也是一个组合体,需要指明组合关系
                MimeBodyPart htmlPart = new MimeBodyPart();
                MimeMultipart htmlMultipart = new MimeMultipart("alternative");
                MimeBodyPart htmlContent = new MimeBodyPart();
                htmlContent.setContent(content, "text/html;charset=gbk");
                htmlMultipart.addBodyPart(htmlContent);
                htmlPart.setContent(htmlMultipart);
                body.addBodyPart(htmlPart);
                mailBody.setContent(body);
                mailContent.addBodyPart(mailBody);
    
                message.setContent(mailContent);
                // 保存邮件内容
                message.saveChanges();
                // 发送邮件
                transport.sendMessage(message, message.getAllRecipients());
                transport.close();
            } catch (Exception e) {
                e.printStackTrace();
                transport.close();
            }
    
        }
    
        /**
         * 之所以要初始化,是因为业务导致每发送一次都需要关闭连接。如果你们的业务能保证发送方是一个固定的邮箱类型与账号,可以使用单例模式,保证全局就一个连接,不关闭也可以。
         * 初始化initTransport
         */
        public void initTransport() {
            props = new Properties();
            //邮件发送协议
            props.setProperty("mail.transport.protocol", mailDto.getProtocol());
            //SMTP邮件服务器
            props.setProperty("mail.smtp.host", mailDto.getHost());
            //SMTP邮件服务器默认端口
            props.setProperty("mail.smtp.port", mailDto.getPort());
      
    

四、调用邮箱发送

  1. qq邮箱发送
    1.1 实验结果:成功,并且支持跨邮箱发送
    1.2 获取授权码:登录网页版qq邮箱,设置->账号
    在这里插入图片描述
    1.3 代码实现

    MailDto mailDto = new MailDto();
    mailDto.setProtocol("smtp");//邮件发送协议
    mailDto.setHost("smtp.qq.com");//SMTP邮件服务器
    mailDto.setPort("587");//SMTP邮件服务器默认端口
    mailDto.setAuthorizationCode("xxxxxxxxxxx");//发件人邮箱授权码
    mailDto.setFrom("173xxxxx83@qq.com");
    mailDto.setSetFromName("环保系统");
    
    //实例化工具类
    MailUtil mailUtil = new MailUtil(mailDto);    
    //接收人集合
    List<InternetAddress> list = new ArrayList<>();
    String charset = "utf-8";
    list.add(new InternetAddress("173xxxxx83@qq.com", "张三", charset));
    list.add(new InternetAddress("173xxxxx83@qq.com", "李四", charset));
    Address[] receiveArray = list.toArray(new Address[list.size()]);
    //附件集合
    List<FileDto> fileDtos = new ArrayList<>();
    fileDtos.add(new FileDto("C:\\\\Users\\\\86188\\\\Desktop\\\\t1.png", "t1.png"));
    fileDtos.add(new FileDto("C:\\\\Users\\\\86188\\\\Desktop\\\\t2.png", "t2.png"));
    //发送
    mailUtil.sendMultipleEmail("测试qq邮箱发送", "测试内容", receiveArray, null, null, fileDtos, "1");
    
  2. 网易邮箱发送
    2.1 实验结果:成功,但不支持跨邮箱发送,报错被对方服务器退回。暂未解决,解决的小伙伴可在评论区留言。
    2.2 获取授权码:登录网页版网易邮箱
    在这里插入图片描述
    在这里插入图片描述
    2.3 代码实现

    MailDto mailDto = new MailDto();
    mailDto.setProtocol("smtp");//邮件发送协议
    mailDto.setHost("smtp.163.com");//SMTP邮件服务器
    mailDto.setPort("25");//SMTP邮件服务器默认端口
    mailDto.setAuthorizationCode("xxxxxxxxxx");//发件人邮箱授权码
    mailDto.setFrom("173xxxxx83@163.com");
    mailDto.setSetFromName("环保系统");
    
    //实例化工具类
    MailUtil mailUtil = new MailUtil(mailDto);    
    //接收人集合
    List<InternetAddress> list = new ArrayList<>();
    String charset = "utf-8";
    list.add(new InternetAddress("173xxxxx83@qq.com", "张三", charset));
    list.add(new InternetAddress("173xxxxx83@qq.com", "李四", charset));
    Address[] receiveArray = list.toArray(new Address[list.size()]);
    //附件集合
    List<FileDto> fileDtos = new ArrayList<>();
    fileDtos.add(new FileDto("C:\\\\Users\\\\86188\\\\Desktop\\\\t1.png", "t1.png"));
    fileDtos.add(new FileDto("C:\\\\Users\\\\86188\\\\Desktop\\\\t2.png", "t2.png"));
    //发送
    mailUtil.sendMultipleEmail("测试网易邮箱发送", "测试内容", receiveArray, null, null, fileDtos, "1");
    
  3. 新浪邮箱发送
    3.1 实验结果:成功,并且支持跨邮箱发送
    3.2 获取授权码:登录网页版新浪邮箱,设置->账号
    在这里插入图片描述
    3.3 代码实现

    MailDto mailDto = new MailDto();
    mailDto.setProtocol("smtp");//邮件发送协议
    mailDto.setHost("smtp.sina.com.cn");//SMTP邮件服务器
    mailDto.setPort("25");//SMTP邮件服务器默认端口
    mailDto.setAuthorizationCode("xxxxxxxxx");//发件人邮箱授权码
    mailDto.setFrom("173xxxxx83@sina.com");
    mailDto.setSetFromName("环保系统");
    
    //实例化工具类
    MailUtil mailUtil = new MailUtil(mailDto);    
    //接收人集合
    List<InternetAddress> list = new ArrayList<>();
    String charset = "utf-8";
    list.add(new InternetAddress("173xxxxx83@qq.com", "张三", charset));
    list.add(new InternetAddress("173xxxxx83@qq.com", "李四", charset));
    Address[] receiveArray = list.toArray(new Address[list.size()]);
    //附件集合
    List<FileDto> fileDtos = new ArrayList<>();
    fileDtos.add(new FileDto("C:\\\\Users\\\\86188\\\\Desktop\\\\t1.png", "t1.png"));
    fileDtos.add(new FileDto("C:\\\\Users\\\\86188\\\\Desktop\\\\t2.png", "t2.png"));
    //发送
    mailUtil.sendMultipleEmail("测试新浪邮箱发送", "测试内容", receiveArray, null, null, fileDtos, "1");
    

这里一共就演示了三种常用邮箱的发送,至于其他的邮箱配置也是八九不离十,有兴趣自行尝试。

五、其他工具类(可忽略)

  1. 邮箱发送其他简单工具类(文本、图片)(正常核心工具类已够用)

    import javax.activation.DataHandler;
    import javax.activation.DataSource;
    import javax.activation.FileDataSource;
    import javax.mail.*;
    import javax.mail.internet.*;
    import java.io.File;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;
    import java.util.Properties;
    
    /**
     * @author 天真热
     * @create 2022-05-07 14:13
     * @desc
     **/
    public class MailUtilDemo {
    
        private static Properties props = null;
        private static Transport transport = null;
        public static List<String> emails = new ArrayList<>();
        public static List<String> emailsMacd = new ArrayList<>();
        private MailDto mailDto;
    
        public static void main(String[] args) throws Exception {
            MailDto mailDto = new MailDto();
            mailDto.setProtocol("smtp");//邮件发送协议
            mailDto.setHost("smtp.qq.com");//SMTP邮件服务器
            mailDto.setPort("587");//SMTP邮件服务器默认端口
            mailDto.setIsAuth("true");//是否要求身份认证
            mailDto.setIsEnabledDebugMod("true");//是否启用调试模式(启用调试模式可打印客户端与服务器交互过程时一问一答的响应消息)
            mailDto.setAuthorizationCode("xxxxxxxxxx");//发件人邮箱授权码
            mailDto.setFrom("173xxxxxxxxxx@qq.com");
            mailDto.setSetFromName("环保系统");
    
            MailUtilDemo mailUtil = new MailUtilDemo(mailDto);
            //===========================测试文本===========================
            mailUtil.sendTextEmail("173xxxxxxxxxx3@qq.com", "测试发送", "测试发送");
            //===========================测试html内容===========================
            mailUtil.sendHtmlEmail("173xxxxxxxxxx@qq.com", "888");
            //===========================测试图片===========================
            mailUtil.sendHtmlWithInnerImageEmail("173xxxxxxxxxx@qq.com", "17xxxxxxxxxx3@qq.com", "1xxxxxxxxxx3@qq.com", "C:\\Users\\86188\\Desktop\\t1.png", "testpng");
    
        }
    
        /**
         * 初始化邮箱连接
         *
         * @param mail
         */
        public MailUtilDemo(MailDto mail) {
            this.mailDto = mail;
        }
    
    
        /**
         * 发送简单的文本邮件
         */
        public boolean sendTextEmail(String to, String title, String content) throws Exception {
            try {
                //初始化transport
                initTransport();
                Session session = Session.getInstance(props, null);
                // 创建MimeMessage实例对象
                MimeMessage message = new MimeMessage(session);
                // 设置发件人
                message.setFrom(new InternetAddress(mailDto.getFrom()));
                // 设置邮件主题
                message.setSubject(title);
                // 设置收件人
                message.setRecipient(Message.RecipientType.TO, new InternetAddress(to));
                // 设置发送时间
                message.setSentDate(new Date());
                // 设置纯文本内容为邮件正文
                message.setText(content);
                // 保存并生成最终的邮件内容
                message.saveChanges();
                if (!transport.isConnected()) {
                    transport.connect(mailDto.getFrom(), mailDto.getAuthorizationCode());
                }
                // 将message对象传递给transport对象,将邮件发送出去
                transport.sendMessage(message, message.getAllRecipients());
                transport.close();
                return true;
            } catch (Exception e) {
                transport.close();
                e.printStackTrace();
                return false;
            }
        }
    
    
        /**
         * 发送简单的html邮件
         */
        public boolean sendHtmlEmail(String to, String code) throws Exception {
    
            try {
                //初始化transport
                initTransport();
                // 创建Session实例对象
                Session session = Session.getInstance(props, null);
    
                // 创建MimeMessage实例对象
                MimeMessage message = new MimeMessage(session);
                // 设置邮件主题
                message.setSubject("内燃机注册");
                // 设置发送人
                message.setFrom(new InternetAddress(mailDto.getFrom()));
                // 设置发送时间
                message.setSentDate(new Date());
                // 设置收件人
                message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
                // 设置html内容为邮件正文,指定MIME类型为text/html类型,并指定字符编码为gbk
                message.setContent("<div style='width: 600px;margin: 0 auto'>"
                                + "<h3 style='color:#003E64; text-align:center; '>获取验证码</h3>" + "<p style=''>尊敬的用户您好:</p>"
                                + "<p style='text-indent: 2em'>验证码是:" + code + ",有效期10分钟!如果过期请重新获取。</p>"
                                + "<p style='text-align: right; color:#003E64; font-size: 20px;'>天真热</p>" + "</div>",
                        "text/html;charset=utf-8");
    
                // 保存并生成最终的邮件内容
                message.saveChanges();
                // 将message对象传递给transport对象,将邮件发送出去
                transport.sendMessage(message, message.getAllRecipients());
                System.err.println("发送邮件成功");
                // 关闭连接
                transport.close();
                return true;
            } catch (Exception e) {
                transport.close();
                e.printStackTrace();
                return false;
            }
    
        }
    
    
        /**
         * 发送带内嵌图片的HTML邮件
         *
         * @param to        接收人
         * @param toCc      抄送人
         * @param toMs      密送人
         * @param path      图片地址
         * @param contentId 内容编号
         * @throws MessagingException
         */
        public void sendHtmlWithInnerImageEmail(String to, String toCc, String toMs, String path, String contentId) throws MessagingException {
            //初始化transport
            initTransport();
            // 创建Session实例对象
            Session session = Session.getDefaultInstance(props, null);
    
            // 创建邮件内容
            MimeMessage message = new MimeMessage(session);
            // 邮件主题,并指定编码格式
            message.setSubject("带内嵌图片的HTML邮件", "utf-8");
            // 发件人
            message.setFrom(new InternetAddress(mailDto.getFrom()));
            // 收件人
            message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
            // 抄送
            message.setRecipient(Message.RecipientType.CC, new InternetAddress(toCc));
            // 密送 (不会在邮件收件人名单中显示出来)
            message.setRecipient(Message.RecipientType.BCC, new InternetAddress(toMs));
            // 发送时间
            message.setSentDate(new Date());
    
            // 创建一个MIME子类型为“related”的MimeMultipart对象
            MimeMultipart mp = new MimeMultipart("related");
            // 创建一个表示正文的MimeBodyPart对象,并将它加入到前面创建的MimeMultipart对象中
            MimeBodyPart htmlPart = new MimeBodyPart();
            mp.addBodyPart(htmlPart);
            // 创建一个表示图片资源的MimeBodyPart对象,将将它加入到前面创建的MimeMultipart对象中
            MimeBodyPart imagePart = new MimeBodyPart();
            mp.addBodyPart(imagePart);
    
            // 将MimeMultipart对象设置为整个邮件的内容
            message.setContent(mp);
    
            // 设置内嵌图片邮件体
            DataSource ds = new FileDataSource(new File(path));
            DataHandler dh = new DataHandler(ds);
            imagePart.setDataHandler(dh);
            imagePart.setContentID(contentId);  // 设置内容编号,用于其它邮件体引用
    
            // 创建一个MIME子类型为"alternative"的MimeMultipart对象,并作为前面创建的htmlPart对象的邮件内容
            MimeMultipart htmlMultipart = new MimeMultipart("alternative");
            // 创建一个表示html正文的MimeBodyPart对象
            MimeBodyPart htmlBodypart = new MimeBodyPart();
            // 其中cid=androidlogo.gif是引用邮件内部的图片,即imagePart.setContentID("androidlogo.gif");方法所保存的图片
            htmlBodypart.setContent("<span style='color:red;'>图片邮件<img src=\"cid:" + contentId + "\" /></span>", "text/html;charset=utf-8");
            htmlMultipart.addBodyPart(htmlBodypart);
            htmlPart.setContent(htmlMultipart);
    
            // 保存并生成最终的邮件内容
            message.saveChanges();
    
            // 发送邮件
            // 将message对象传递给transport对象,将邮件发送出去
            transport.sendMessage(message, message.getAllRecipients());
            System.err.println("发送邮件成功");
            // 关闭连接
            transport.close();
        }
    
    
        /**
         * 初始化initTransport
         */
        public void initTransport() {
            props = new Properties();
            //邮件发送协议
            props.setProperty("mail.transport.protocol", mailDto.getProtocol());
            //SMTP邮件服务器
            props.setProperty("mail.smtp.host", mailDto.getHost());
            //SMTP邮件服务器默认端口
            props.setProperty("mail.smtp.port", mailDto.getPort());
            //是否要求身份认证
            props.setProperty("mail.smtp.auth", mailDto.getIsAuth());
            //是否启用调试模式(启用调试模式可打印客户端与服务器交互过程时一问一答的响应消息)
            props.setProperty("mail.debug", mailDto.getIsEnabledDebugMod());
            Session session = Session.getInstance(props, null);
            try {
                // 获得Transport实例对象
                transport = session.getTransport();
                // 打开连接
                transport.connect(mailDto.getFrom(), mailDto.getAuthorizationCode());
            } catch (MessagingException e) {
                e.printStackTrace();
            }
        }
    
    }
    
    
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值