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);
    }

效果

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

结束语

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

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

  1. Java实现发邮件功能

    代码如下: package com.weimob.finance.utils;import java.io.UnsupportedEncodingException;import java.util. ...

  2. Nagios 配置自动发邮件功能

    安装sendmailyum install -y sendmail* mailx 修改防火墙设置,添加25端口到防火墙vi /etc/sysconfig/iptables 重启 iptables.se ...

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

    自动发邮件功能 例如,如果想在自动化脚本运行完成之后,邮箱就可以收到最新的测试报告结果.SMTP(Simple Mail Transfer Protocol)是简单邮件传输协议,它是一组用于由源地址到 ...

  4. Selenium 2自动化测试实战38(整合自动发邮件功能)

    整合自动发邮件功能 解决了前面的问题后,现在就可以将自动发邮件功能集成到自动化测试项目中了.下面重新编辑runtest.py文件 #runtest.py #coding:utf-8 from HTML ...

  5. Python 爬取1688货源重量,自动发邮件到指定邮箱(qq),设置定时运行程序

    1 # -*- coding: utf-8 -*- 2 # @Time : 2020/7/6 13:46 3 # @Author : Chunfang 4 # @Email : 3470959534@ ...

  6. Thinkphp5的使用phpmailer实现发邮件功能(163邮箱)

    Thinkphp5本身并没有实现发邮件的功能,至少据我所知. 本文利用网易邮箱作为发邮件的邮箱.作为发送邮件的前提是需要开启SMTP服务,打开网易邮件,点击设置按钮,如下图所示 勾选smtp服务 保存 ...

  7. 【知识积累】JavaMail实现发邮件功能

    一.前言 今天闲来没事,想着通过程序来给别人发邮件.于是,上网搜了一下,相应的资料也很多,刚开始完成了邮件的简单发送,后来想如何能发送附件,继续寻找 答案,但是遇到了一个问题是当我使用txt类型作为附 ...

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

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

  9. Android调用系统的发邮件功能

    package com.example.myapi.email; import java.util.ArrayList; import java.util.List; import android.c ...

随机推荐

  1. Flutter移动电商实战 --(33)列表页_子类和商品列表交互效果

    主要实现点击小类下面的列表跟着切换 获取右侧下面的列表信息,即要传递大类的id也要传递小类的,所以需要把左侧的大类的id也要Provide化 可以看下网站上的接口说明: https://jspang. ...

  2. centos下使用virtualenv建立python虚拟环境

    在centos使用python3的virtualenv,先用yum install python3 安装后pip3也已经安装好了,pip3 install virtualenv, 在系统中新建一个空文 ...

  3. Spring Boot确保Web应用安全(登陆认证)

    Spring Boot官方提供了一个登陆认证的清晰易懂的 例子 , 我们在次以此例展开演示Spring Boot是如何实现登陆认证的. 首先我们去 https://start.spring.io/ 下 ...

  4. xampp 启动mysql 显示busy

    1.端口被占用问题:2.默认3306端口并没有被占用:3.删除xampp\mysql\data\下的ibdata1再重启:4.没装其他mysql.

  5. BP神经网络算法预测销量高低

    理论以前写过:https://www.cnblogs.com/fangxiaoqi/p/11306545.html,这里根据天气.是否周末.有无促销的情况,来预测销量情况. function [ ma ...

  6. 在VMware上部署MOS(MirantisOpenStack-6.0)搭建全过程

    安装清单 MOS9.0系统镜像 1 MirantisOpenStack-6.0.iso ****首先创建3个仅主机模式网卡, 禁用DHCP,分别配置ip为 /10.20.0.0 /172.16.0.0 ...

  7. [python] 一行命令搭建http服务内网传文件

    在Linux服务器上或者Windows服务器上,只要安装python,均可以使用此命令,建立一个内网可以快速访问的WEB服务. 在想要搭建WEB服务的目录下,使用Python3.x内置方法: pyth ...

  8. poj1915(双向bfs)

    题目链接:https://vjudge.net/problem/POJ-1915 题意:求棋盘上起点到终点最少的步数. 思路:双向广搜模板题,但玄学的是我的代码G++会wa,C++过了,没找到原因QA ...

  9. Object类入门这一篇就够了!

    第三阶段 JAVA常见对象的学习 第一章 常见对象--Object类 引言: 在讲解Object类之前,我们不得不简单的提一下什么是API,先贴一组百度百科的解释: API(Application P ...

  10. WinForm打包

    首先要在想要打包的项目下创建一个新的项目, 创建好setup项目,之后点击属性,去修改打包软件的名字,ProductName....可以选填 到此已经创建好了setup工程了,那么下面开始将要打包的d ...