Java实现发邮件功能---网易邮箱

目录

  • Java实现发邮件功能

    • 前言
    • 开发环境
    • 代码
    • 效果
    • 结束语

Java实现发邮件功能

前言

电子邮件的应用场景非常广泛,例如新用户加入,即时发送优惠清单、通过邮件找回密码、监听后台程序,出现异常自动邮件通知等。

本文以网易邮箱为例,通过Java代码实现发送邮件功能。

开发环境

请参照: 基于SpringBoot构建分模块项目

代码

  1. pom.xml引入依赖

    <properties>
        <java.version>1.8</java.version>
        <!-- 你的其他依赖... -->
        <javax.mail.version>1.6.0</javax.mail.version>
    </properties>
    
    <dependencies>
        <!-- 你的其他依赖... -->
        <!-- 发送短信 -->
        <dependency>
            <groupId>com.sun.mail</groupId>
            <artifactId>javax.mail</artifactId>
            <version>${javax.mail.version}</version>
        </dependency>
    </dependencies>
  2. 发送邮件工具类
    package com.wayne.common.utils;
    
    import com.wayne.common.entity.CmsMailConfig;
    import com.wayne.common.vo.MailVo;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;
    
    import javax.mail.*;
    import javax.mail.internet.InternetAddress;
    import javax.mail.internet.MimeMessage;
    import java.util.Date;
    import java.util.Properties;
    
    /**
     * 发送邮件工具类
     * @author Wayne
     * @date 2019/6/19
     */
    @Component
    public class MailUtils {
    
        /**
         * 发送邮件
         * @param isSingle 是否单发: true-单发 false-群发
         * @param mailVo 邮件内容
         * @param sendTime 发送时间, 如果为null,表示立即发送
         * @param mailConfig 发件人信息及授权
         */
        public void sendMail(Boolean isSingle, MailVo mailVo, Date sendTime, CmsMailConfig mailConfig) throws MessagingException {
            Session session = this.authenticationMail();
            MimeMessage message = getMimeMessage(isSingle, session, mailConfig.getMailAccount(), mailVo.getRecipients());
            message = getContent(message, mailVo.getMailTiTle(), mailVo.getMailContent(), sendTime);
    
            Transport transport = session.getTransport();
            transport.connect(mailConfig.getMailAccount(), mailConfig.getMailLicense());
            transport.sendMessage(message, message.getAllRecipients());
            transport.close();
        }
    
        /**
         * 校验发送的邮件内容
         */
        private MimeMessage getContent(MimeMessage message, String messageTitle, String messageContent, Date sendTime) throws MessagingException {
            if (null == messageTitle) {
                throw new MessagingException("邮件标题不能为空");
            }
            if (null == messageContent) {
                throw new MessagingException("邮件内容不能为空");
            }
            sendTime = sendTime == null ? new Date() : sendTime;
            message.setSubject(messageTitle, "UTF-8");
            message.setContent(messageContent, "text/html;charset=UTF-8");
            message.setSentDate(sendTime);
            return message;
        }
    
        /**
         * 验证认证信息
         */
        private Session authenticationMail() throws MessagingException {
            Session session;
            try {
                Properties props = new Properties();
                //设置用户的认证方式
                props.setProperty("mail.smtp.auth", "true");
                //设置传输协议
                props.setProperty("mail.transport.protocol", "smtp");
                //设置发件人的SMTP服务器地址
                props.setProperty("mail.smtp.host", "smtp.163.com");
                session = Session.getInstance(props);
                session.setDebug(true);
            } catch (Exception e) {
                e.printStackTrace();
                throw new MessagingException("认证失败");
            }
            return session;
        }
    
        /**
         * @param isSingle 是否单发
         *                 <P>true-向指定的一个收件人发送邮件,比如:找回密码、登录验证
         *                 <P>false-向多个收件人群发邮件,比如:优惠活动推送
         *                 <P>群发时多个收件人之间用英文逗号','分割
         * @param senderAddress 发件人地址
         * @param recipientAddress 收件人地址
         */
        private MimeMessage getMimeMessage(Boolean isSingle, Session session, String senderAddress, String recipientAddress) throws MessagingException {
            MimeMessage message = new MimeMessage(session);
            try {
                message.setFrom(new InternetAddress(senderAddress));
            } catch (MessagingException e) {
                throw new MessagingException("发件人地址错误");
            }
            /*
              设置收件人地址
              MimeMessage.RecipientType.TO:发送
              MimeMessage.RecipientType.CC:抄送
              MimeMessage.RecipientType.BCC:密送
             */
            if (isSingle) {
                message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(recipientAddress));
            } else {
                message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(recipientAddress));
            }
            return message;
        }
    }
  3. 邮件内容对象-MailVo
    package com.wayne.common.vo;
    
    import lombok.Data;
    
    /**
     * @author Wayne
     * @date 2019/6/24
     */
    @Data
    public class MailVo {
        /**
         * 邮件标题
         */
        private String mailTiTle;
        /**
         * 邮件内容
         */
        private String mailContent;
        /**
         * 收件人(们)
         */
        private String recipients;
    }
  4. 发件人信息及授权

    注: 此处我假定有多个发件人,且不确定,可以动态添加、选择由哪个发件人发送,因此我将发件人信息存储在数据库中。假如你的应用中发件人是固定的,则此处可写在项目中或配在配置文件!

    我们正常发送邮件时需要输入密码,登录我们的邮箱账户。而通过程序发送邮件不需要密码登录,而是使用授权码,网易邮箱授权码获得方式如下

    1. 启用授权

    1. 获得授权码

    package com.wayne.common.entity;
    
    import lombok.Data;
    
    import javax.persistence.*;
    
    @Data
    @Table(name = "cms_mail_config")
    public class CmsMailConfig {
        /**
         * 主键
         */
        @Id
        @Column(name = "MAIL_ID")
        private Integer mailId;
    
        /**
         * 邮箱账号
         */
        @Column(name = "MAIL_ACCOUNT")
        private String mailAccount;
    
        /**
         * 授权码
         */
        @Column(name = "MAIL_LICENSE")
        private String mailLicense;
    
        /**
         * 状态,0:使用,1:未使用
         */
        @Column(name = "IS_USE")
        private String isUse;
    
        /**
         * 是否删除,0:否,1:是
         */
        @Column(name = "IS_DELETE")
        private String isDelete;
    
        /**
         * 创建者ID
         */
        @Column(name = "CREATE_ADMIN_ID")
        private Integer createAdminId;
    
        @Column(name = "EXTEND1")
        private String extend1;
    
        @Column(name = "EXTEND2")
        private String extend2;
    
        @Column(name = "EXTEND3")
        private String extend3;
    
        @Column(name = "EXTEND4")
        private String extend4;
    
        @Column(name = "EXTEND5")
        private String extend5;
    
        @Column(name = "EXTEND6")
        private String extend6;
    }
  5. Service
    @Override
    public ResponseBean sendMails(MailVo mailVo) {
        if (null == mailVo) {
            return ResponseBean.createInstance(Boolean.FALSE, 400, "参数异常");
        }
        // 获取当前正在使用的发件人配置
        List<CmsMailConfig> mailConfigList = mailConfigMapper.selectCurrUseMailConfig();
        if (null == mailConfigList || mailConfigList.size() != 1) {
            return ResponseBean.createInstance(Boolean.FALSE, 400, "参数异常");
        }
    
        try {
            // 发送邮件
            mailUtils.sendMail(Boolean.FALSE, mailVo, null, mailConfigList.get(0));
            return ResponseBean.createInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return ResponseBean.createInstance(Boolean.FALSE, 400, "参数异常");
    }
  6. Controller
    @PostMapping("/mail/sendMails")
    public ResponseBean sendMails(MailVo mailVo) {
        return mailService.sendMails(mailVo);
    }

效果

此处发送为手动发送,主要体验代码功能。具体应用场景可根据实际生产环境,随机应变。比如:通过结合定时器任务,每天定时发送报表;检测用户登录地址不是常用地址时,自动发邮件通知用户;普通用户登录时,触发发送邮件向管理员等

结束语

本人已开通公众号,欢迎大家前来灌水

原文地址:https://www.cnblogs.com/L-Wirepuller/p/11415652.html

时间: 2024-12-16 13:36:23

Java实现发邮件功能---网易邮箱的相关文章

Java实现发邮件功能

代码如下: package com.weimob.finance.utils;import java.io.UnsupportedEncodingException;import java.util.Date;import java.util.List;import java.util.Properties; import javax.activation.DataHandler;import javax.activation.FileDataSource;import javax.mail.M

java实现发邮件的工具类,方便 好用(需要架包的Send Email To me)

原文:java实现发邮件的工具类,方便 好用(需要架包的Send Email To me) 源代码下载地址:http://www.zuidaima.com/share/1550463394794496.htm package com.zuidaima.util; import java.util.Properties; import javax.mail.BodyPart; import javax.mail.Message; import javax.mail.Multipart; impor

Nagios 配置自动发邮件功能

安装sendmailyum install -y sendmail* 修改防火墙设置,添加25端口到防火墙vi /etc/sysconfig/iptables 重启 iptables.sendmail 服务service iptables restartservice sendmail restart 测试发邮件功能是否正常echo "Nagios Test Email " | mail -s "Alert" [email protected]此时163邮箱会收到一

iOS打电话、发短信、发邮件功能

以下为学习过程中在网上查到的方法, 实现打电话的功能,主要二种方法,下面我就分别说说它们的优缺点. 1.1.发短信(1)——URL // 直接拨号,拨号完成后会停留在通话记录中 1.方法: NSURL *url = [NSURL URLWithString:@"sms://10010"]; [[UIApplication sharedApplication] openURL:url]; 2.优点: –简单 3.缺点: –不能指定短信内容,而且不能自动回到原应用 1.2发短信(2)——M

Selenium 2自动化测试实战37(自动发邮件功能)

自动发邮件功能 例如,如果想在自动化脚本运行完成之后,邮箱就可以收到最新的测试报告结果.SMTP(Simple Mail Transfer Protocol)是简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规划,由它来控制信件的中转方式.python的smtplib模块提供了一种很方便的途径用来发送电子邮件,它对SMTP协议进行了简单的封装.可以使用SMTP对象的sendmail方法发送邮件,通过help()可查看SMTP所提供的方法,命令如下: -from smtplib impo

自动发邮件功能

HTMLTestRunner.py """A TestRunner for use with the Python unit testing framework. Itgenerates a HTML report to show the result at a glance. The simplest way to use this is to invoke its main method. E.g. import unittest import HTMLTestRunne

Linux 通过sendmail 发邮件到外部邮箱

Linux 通过sendmail 发邮件到外部邮箱 最近在写自动化巡检脚本,想着怎么预警后自动发送邮件报警. 首先下载最新版本mailx-12.4.tar.bz2 # wget http://sourceforge.net/projects/heirloom/files/latest/download?source=files 解压包: # tar jxvf mailx-12.4.tar.bz2 # cd mailx-12.4 # make # make install UCBINSTALL=/

关于java mail 发邮件的问题总结(转)

今天项目中有需要用到java mail发送邮件的功能,在网上找到相关代码,代码如下: import java.io.IOException; import java.util.Properties; import javax.mail.Message; import javax.mail.PasswordAuthentication; import javax.mail.Session; import javax.mail.Transport; import javax.mail.interne

JavaMail实现发邮件功能

今天闲来没事,想着通过程序来给别人发邮件.于是,上网搜了一下,相应的资料也很多,刚开始完成了邮件的简单发送,后来想如何能发送附件,继续寻找 答案,但是遇到了一个问题是当我使用txt类型作为附件时,附件里的内容总是会显示在正文里面,并且还会出现正文乱码的现象,之后经过不断的查阅资料,终 于解决了问题,实现了我自己想要的功能. 需要的jar文件: 下载地址:https://java.net/projects/javamail/pages/Home 主要的类有三个,代码分别如下: 1.MailSend