Java实现发邮件功能---网易邮箱
Java实现发邮件功能
前言
电子邮件的应用场景非常广泛,例如新用户加入,即时发送优惠清单、通过邮件找回密码、监听后台程序,出现异常自动邮件通知等。
本文以网易邮箱为例,通过Java代码实现发送邮件功能。
开发环境
请参照: 基于SpringBoot构建分模块项目
代码
- 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>
 
- 发送邮件工具类 - 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;
 }
 }
 
- 邮件内容对象-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;
 }
 
- 发件人信息及授权 - 注: 此处我假定有多个发件人,且不确定,可以动态添加、选择由哪个发件人发送,因此我将发件人信息存储在数据库中。假如你的应用中发件人是固定的,则此处可写在项目中或配在配置文件! - 我们正常发送邮件时需要输入密码,登录我们的邮箱账户。而通过程序发送邮件不需要密码登录,而是使用授权码,网易邮箱授权码获得方式如下 - 启用授权
  - 获得授权码
  - 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;
 }
 
- 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, "参数异常");
 }
 
- Controller - @PostMapping("/mail/sendMails")
 public ResponseBean sendMails(MailVo mailVo) {
 return mailService.sendMails(mailVo);
 }
 
效果
此处发送为手动发送,主要体验代码功能。具体应用场景可根据实际生产环境,随机应变。比如:通过结合定时器任务,每天定时发送报表;检测用户登录地址不是常用地址时,自动发邮件通知用户;普通用户登录时,触发发送邮件向管理员等


结束语
本人已开通公众号,欢迎大家前来灌水
Java实现发邮件功能---网易邮箱的更多相关文章
- Java实现发邮件功能
		代码如下: package com.weimob.finance.utils;import java.io.UnsupportedEncodingException;import java.util. ... 
- Nagios 配置自动发邮件功能
		安装sendmailyum install -y sendmail* mailx 修改防火墙设置,添加25端口到防火墙vi /etc/sysconfig/iptables 重启 iptables.se ... 
- Selenium 2自动化测试实战37(自动发邮件功能)
		自动发邮件功能 例如,如果想在自动化脚本运行完成之后,邮箱就可以收到最新的测试报告结果.SMTP(Simple Mail Transfer Protocol)是简单邮件传输协议,它是一组用于由源地址到 ... 
- Selenium 2自动化测试实战38(整合自动发邮件功能)
		整合自动发邮件功能 解决了前面的问题后,现在就可以将自动发邮件功能集成到自动化测试项目中了.下面重新编辑runtest.py文件 #runtest.py #coding:utf-8 from HTML ... 
- Python 爬取1688货源重量,自动发邮件到指定邮箱(qq),设置定时运行程序
		1 # -*- coding: utf-8 -*- 2 # @Time : 2020/7/6 13:46 3 # @Author : Chunfang 4 # @Email : 3470959534@ ... 
- Thinkphp5的使用phpmailer实现发邮件功能(163邮箱)
		Thinkphp5本身并没有实现发邮件的功能,至少据我所知. 本文利用网易邮箱作为发邮件的邮箱.作为发送邮件的前提是需要开启SMTP服务,打开网易邮件,点击设置按钮,如下图所示 勾选smtp服务 保存 ... 
- 【知识积累】JavaMail实现发邮件功能
		一.前言 今天闲来没事,想着通过程序来给别人发邮件.于是,上网搜了一下,相应的资料也很多,刚开始完成了邮件的简单发送,后来想如何能发送附件,继续寻找 答案,但是遇到了一个问题是当我使用txt类型作为附 ... 
- 关于java mail 发邮件的问题总结(转)
		今天项目中有需要用到java mail发送邮件的功能,在网上找到相关代码,代码如下: import java.io.IOException; import java.util.Properties; ... 
- Android调用系统的发邮件功能
		package com.example.myapi.email; import java.util.ArrayList; import java.util.List; import android.c ... 
随机推荐
- 如何隐藏EFI分区?
			U盘制作PE 后多了个EFI分区, 傲梅分区助手,,里面可以进行隐藏分区 文章来源:刘俊涛的博客 欢迎关注,有问题一起学习欢迎留言.评论 
- linux内核中rtc框架选用什么接口来注册rtc设备呢?
			1. 有哪些接口? 1.1 devm_rtc_device_register 1.2 devm_rtc_allocate_device和 rtc_register_device 2. 1.1与1.2 ... 
- .md 即 markdown 文件的基本常用编写语法
			0. 前言 Markdown 是一种纯文本格式的标记语言.通过简单的标记语法,它可以使普通文本内容具有一定的格式.现在的项目都使用了 git 仓库,再加上远程仓库 github 托管,那就难免要写一些 ... 
- 查看oracle数据库的链接数和用户
			http://www.cnblogs.com/is1988/archive/2012/11/21/2780067.html 1.查询oracle的连接数select count(*) from v$s ... 
- Flutter的闪屏动画案例AnimationController
			打开一个APP,经常会看到精美的启动页,这种启动页也称为闪屏动画.它是从无到有有一个透明度的渐变动画的.图像展示完事后,才跳转到用户可操作的页面. AnimationController Animat ... 
- python-Web-flask-路由和视图
			1 路由和视图: 简介: Flask框架包含两个核心:Werkzeug工具箱,Jinja2模板引擎 flask: 提供基本功能,属于轻量级 django: 提供相对完整功能,重量级 搭建虚拟环境 He ... 
- Egret入门学习日记 --- 第六篇(书中 3.6~3.9节 内容)
			第六篇(书中 3.6~3.9节 内容) 在本篇写之前,还是要为昨天写的日记道歉才行,差点就误人子弟了. 没想到在程序员界最低级的错误 “单词拼写错误” 还是会经常犯. childrenCreated ... 
- centOS7下的静态Ip的配置。
			centOS7下NAT的静态网卡的配置 最近在cenOS7下搭建大数据,发现centOS7配置静态ip的必要性.这篇博文就来谈谈如何VM虚拟机中配置centOS7的静态ip.如有不足,还望志同道合者纠 ... 
- Git速成学习第三课:创建与合并分支
			本来第三课想记录一下远程仓库的创建与克隆0.0但是想了想还是不写了. 这里写一下分支管理中的创建与合并. Git速成学习笔记整理于廖雪峰老师的官网网站:https://www.liaoxuefeng. ... 
- 【计算机视觉】深度相机(六)--Kinect v2.0 手势样本库制作
			目录为1.如何使用Kinect Studio录制手势剪辑:2.如何使用Visual Gesture Builder创建手势项目:3.如何在我的C#程序中使用手势:4.关于录制.剪辑手势过程中的注意事项 ... 
 
			
		