springboot邮件发送与接收读取
发送邮件
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
spring:
mail:
port: 25
username: ****
password: ****
protocol: smtp
default-encoding: utf-8
host: smtp.partner.outlook.cn
properties:
mail:
smtp:
auth: true
starttls:
enable: true
required: true
邮件模板
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>消息通知</title>
</head> <style type="text/css">
table {
font-family: "Trebuchet MS", Arial, Helvetica, sans-serif;
width: 100%;
border-collapse: collapse;
} td, th {
font-size: 1em;
border: 1px solid #5B4A42;
padding: 3px 7px 2px 7px;
} th {
font-size: 1.1em;
text-align: center;
padding-top: 5px;
padding-bottom: 4px;
background-color: #24A9E1;
color: #ffffff;
}
</style>
<body>
<img src="" alt="" style="display: inline-block;width: 0;height: 0"/> <div>
<h2>邮件消息通知</h2>
<table id="customers">
<tr>
<th>MessageCode</th>
<th>MessageStatus</th>
<th>Cause</th>
</tr>
<tr>
<td>${(params.messageCode)!""}</td>
<td>${(params.messageStatus)!""}</td>
<td>${(params.cause)!""}</td>
</tr>
</table>
</div>
</body>
</html>
模板实体类
public class MailMessage { private String messageCode; private String messageStatus; private String cause; public String getMessageCode() {
return messageCode;
} public void setMessageCode(String messageCode) {
this.messageCode = messageCode;
} public String getMessageStatus() {
return messageStatus;
} public void setMessageStatus(String messageStatus) {
this.messageStatus = messageStatus;
} public String getCause() {
return cause;
} public void setCause(String cause) {
this.cause = cause;
} }
import java.time.LocalDate;
import java.time.LocalTime;
import java.util.HashMap;
import java.util.Map; import javax.mail.MessagingException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;
import org.springframework.ui.freemarker.FreeMarkerTemplateUtils;
import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer; import freemarker.template.Template; @Service
public class MailService { //邮件的发送者
@Value("${spring.mail.username}")
private String from; //注入MailSender
@Autowired
private JavaMailSender mailSender; //发送邮件的模板引擎
@Autowired
private FreeMarkerConfigurer configurer; /**
* @param params 发送邮件的主题对象 object
* @param title 邮件标题
* @param templateName 模板名称
* @param to 收件人地址
* @param receipt 是否需要回执
* @throws MessagingException
* @throws Exception
*/
public void sendMessageMail(Object params, String title, String templateName, String to, boolean receipt) throws Exception{
MimeMessage mimeMessage = mailSender.createMimeMessage();
if(receipt) {
mimeMessage.setHeader("Disposition-Notification-To", "1");
}
mimeMessage.setContentID(System.currentTimeMillis()+"");
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
helper.setFrom(from);
helper.setTo(InternetAddress.parse(to));
helper.setSubject("【" + title + "-" + LocalDate.now() + " " + LocalTime.now().withNano(0) + "】");//邮件标题
Map<String, Object> model = new HashMap<>();
model.put("params", params);
Template template = configurer.getConfiguration().getTemplate(templateName);
String text = FreeMarkerTemplateUtils.processTemplateIntoString(template, model);
helper.setText(text, true);
System.out.println(mimeMessage.getContentID());
mailSender.send(mimeMessage);
}
}
测试发送
@RequestMapping(value = "/sendMessage", method = RequestMethod.GET)
public void sendMailMessage() {
MailMessage message = new MailMessage();
message.setMessageCode("MissingParameter");
message.setMessageStatus("Failed");
message.setCause("缺少参数,请确认");
try {
mailService.sendMessageMail(message, "测试消息通知", "message.ftl", "aaaaa@qq.com", true);
} catch (Exception e) {
e.printStackTrace();
}
}
读取邮件
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Properties; import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.internet.MimeUtility; import com.sun.mail.imap.IMAPMessage; public class ReciveIMAPmail { public static void main(String[] args) throws Exception {
// 准备连接服务器的会话信息
Properties props = new Properties();
props.setProperty("mail.store.protocol", "imap");
props.setProperty("mail.imap.host", "imap.163.com");
props.setProperty("mail.imap.port", "143"); // 创建Session实例对象
Session session = Session.getInstance(props); // 创建IMAP协议的Store对象
Store store = session.getStore("imap"); // 连接邮件服务器
store.connect("username***", "password***"); // 获得收件箱
Folder folder = store.getFolder("INBOX");
// 以读写模式打开收件箱
folder.open(Folder.READ_WRITE); // 获得收件箱的邮件列表
Message[] messages = folder.getMessages(); // 打印不同状态的邮件数量
System.out.println("收件箱中共" + messages.length + "封邮件!");
System.out.println("收件箱中共" + folder.getUnreadMessageCount() + "封未读邮件!");
System.out.println("收件箱中共" + folder.getNewMessageCount() + "封新邮件!");
System.out.println("收件箱中共" + folder.getDeletedMessageCount() + "封已删除邮件!"); System.out.println("------------------------开始解析邮件----------------------------------"); int total = folder.getMessageCount();
System.out.println("-----------------您的邮箱共有邮件:" + total + " 封--------------");
// 得到收件箱文件夹信息,获取邮件列表
Message[] msgs = folder.getMessages();
System.out.println("\t收件箱的总邮件数:" + msgs.length);
for (int i = 0; i < total; i++) {
Message a = msgs[i];
// 获取邮箱邮件名字及时间 System.out.println(a.getReplyTo()); System.out.println("==============");
// System.out.println(a.getSubject() + " 接收时间:" + a.getReceivedDate().toLocaleString()+" contentType()" +a.getContentType());
}
System.out.println("\t未读邮件数:" + folder.getUnreadMessageCount());
System.out.println("\t新邮件数:" + folder.getNewMessageCount());
System.out.println("----------------End------------------"); // 关闭资源
folder.close(false);
store.close();
} }
ssl方式读取邮件
import java.security.Security;
import java.text.SimpleDateFormat;
import java.util.Properties; import javax.mail.FetchProfile;
import javax.mail.Flags;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.URLName;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeUtility;
import javax.mail.search.FlagTerm; //查看收件箱邮件
public class ReadMailUtil {
public static void main(String[] args) {
//设置SSL连接、邮件环境
Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
Properties props = System.getProperties();
props.setProperty("mail.imap.host", "imap.partner.outlook.cn");
props.setProperty("mail.imap.socketFactory.class", SSL_FACTORY);
props.setProperty("mail.imap.socketFactory.fallback", "false");
props.setProperty("mail.imap.port", "993");
props.setProperty("mail.imap.socketFactory.port", "993");
props.setProperty("mail.imap.auth", "true");
//建立邮件会话
Session session = Session.getInstance(props, null);
//设置连接邮件仓库的环境
URLName url = new URLName("imap", "imap.partner.outlook.cn", 993, null, "username", "password");
Store store = null;
Folder inbox = null;
try {
//得到邮件仓库并连接
store = session.getStore(url);
store.connect();
//得到收件箱并抓取邮件
inbox = store.getFolder("INBOX");
inbox.open(Folder.READ_WRITE);
FetchProfile profile = new FetchProfile();
profile.add(FetchProfile.Item.ENVELOPE);
//false代表未读,true代表已读
FlagTerm ft = new FlagTerm(new Flags(Flags.Flag.SEEN), false);
//根据设置好的条件获取message
Message[] messages = inbox.search(ft);
// Message[] messages = inbox.getMessages();
inbox.fetch(messages, profile);
int length = messages.length;
System.out.println("收件箱的邮件数:" + length);
System.out.println("-------------------------------------------\n"); //遍历收件箱、垃圾箱等名称
Folder defaultFolder = store.getDefaultFolder();
Folder[] folders = defaultFolder.list();
for (int i = 0; i < folders.length; i++) {
System.out.println("名称:"+folders[i].getName());
}
for (int i = 0; i < length; i++) {
String from = MimeUtility.decodeText(messages[i].getFrom()[0].toString());
InternetAddress ia = new InternetAddress(from);
System.out.println("发件人:" + ia.getPersonal() + '(' + ia.getAddress() + ')');
System.out.println("主题:" + messages[i].getSubject());
System.out.println("邮件发送时间:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(messages[i].getSentDate()));
System.out.println("-------------------------------------------\n");
messages[i].setFlag(Flags.Flag.SEEN, true);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if(inbox != null) {
inbox.close(false);
}
} catch (MessagingException e) {
e.printStackTrace();
}
try {
if(store != null) {
store.close();
}
} catch (MessagingException e) {
e.printStackTrace();
}
}
}
}
/**
* Flag 类型列举如下
* Flags.Flag.ANSWERED 邮件回复标记,标识邮件是否已回复。
* Flags.Flag.DELETED 邮件删除标记,标识邮件是否需要删除。
* Flags.Flag.DRAFT 草稿邮件标记,标识邮件是否为草稿。
* Flags.Flag.FLAGGED 表示邮件是否为回收站中的邮件。
* Flags.Flag.RECENT 新邮件标记,表示邮件是否为新邮件。
* Flags.Flag.SEEN 邮件阅读标记,标识邮件是否已被阅读。
* Flags.Flag.USER 底层系统是否支持用户自定义标记,只读。
*/
camera_shade_message.ftl
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>监控通知</title>
</head> <style type="text/css">
table {
font-family: "Trebuchet MS", Arial, Helvetica, sans-serif;
width: 100%;
border-collapse: collapse;
} td, th {
font-size: 1em;
border: 1px solid #5B4A42;
padding: 3px 7px 2px 7px;
} th {
font-size: 1.1em;
text-align: center;
padding-top: 5px;
padding-bottom: 4px;
background-color: #24A9E1;
color: #ffffff;
}
</style>
<body> <p>${userName!""},您好!</p>
<p>
以下为${cusnames!""},${dataCycle!""} 明细:
</p>
</br>
<div>
<table id="customers">
<tr>
<th>车牌号</th>
<th>设备号</th>
<th>监控周期</th>
<th>客户名称</th>
</tr> <#list datas as item>
<tr>
<td>${item.carnum!""}</td>
<td>${item.gpsno!""}</td>
<td>${item.dataCycle!""}</td>
<td>${item.cusname!""}</td>
</tr>
</#list> </table>
</div> <p>请查收</p> </body>
</html>
Map<String, Object> map = new HashMap<>();
map.put("datas", list);
map.put("controllerName", mailNoticeReq.getControllerName());
mailService.sendMessageMail(map, mailNoticeDetail.getTitle(), "camera_shade_message.ftl", mailNoticeDetail.getReceiver(), true);
springboot邮件发送与接收读取的更多相关文章
- Java邮件发送与接收原理
一. 邮件开发涉及到的一些基本概念 1.1.邮件服务器和电子邮箱 要在Internet上提供电子邮件功能,必须有专门的电子邮件服务器.例如现在Internet很多提供邮件服务的厂商:sina.sohu ...
- SMTP协议及POP3协议-邮件发送和接收原理(转)
本文转自https://blog.csdn.net/qq_15646957/article/details/52544099 感谢作者 一. 邮件开发涉及到的一些基本概念 1.1.邮件服务器和电子邮箱 ...
- Springboot邮件发送思路分析
毕业设计里需要邮件发送,所以学习,总的来讲,我考虑以下几点, 代码量少,代码简单.配置少,一看就懂,使用 JavaMail 太麻烦了. 异步执行,添加员工之后会发送入职邮件, 多线程处理,设计里有一个 ...
- SpringBoot邮件发送
这篇文章介绍springboot的邮件发送. 由于很简单就没有分出server和imp之类,只是在controller简单写个方法进行测试. 首先pom文件加入spring-boot-starter- ...
- javaMail 邮件发送和接收示例,支持正文图片、html、附件(转)
转自:https://blog.csdn.net/star_fly4/article/details/52037587 一.RFC882文档简单说明 RFC882文档规定了如何编写一封简单的邮件(纯文 ...
- SpringBoot邮件发送功能
快速入门 在Spring Boot的工程中的pom.xml中引入spring-boot-starter-mail依赖: <dependency> <groupId>org.sp ...
- SpringBoot项目实现文件上传和邮件发送
前言 本篇文章主要介绍的是SpringBoot项目实现文件上传和邮件发送的功能. SpringBoot 文件上传 说明:如果想直接获取工程那么可以直接跳到底部,通过链接下载工程代码. 开发准备 环境要 ...
- SpringBoot集成邮件发送
一:简述 在日常中的工作中难免会遇到程序集成邮件发送功能.接收功能:此篇文章我将使用SpringBoot集成邮件发送功能和接收功能:若对邮件一些基本协议和发送流程不懂的请务必参考我之前写的博客或者浏览 ...
- springboot利用mail配置包,实现邮件发送
了解邮件发送与接收的过程: A->S1->S2->B 1.计算机A通过SMTP协议将邮件发送到服务器S1上: 2.服务器S1再发送到服务器S2: 3.计算机B通过POP3协议接收服务 ...
随机推荐
- ASP.NET machineKey的作用和使用方法
ASP.NET machineKey的作用 如果你的Asp.Net程序执行时碰到这种错误:“验证视图状态 MAC 失败.如果此应用程序由网络场或群集承载,请确保 <machineKey> ...
- 伪分布式hbase从0.94.11版本升级stable的1.4.9版本
Hbase从0.94.11升级到stable的1.4.9版本: 升级思路: hadoop1.1.2 hbase 0.94.11 ↓ had ...
- 移动端上拉加载下拉刷新插件-mescroll.js插件
官网地址是:http://www.mescroll.com // 初始化mescroll function initMeScroll() { //创建MeScroll对象,内部已默认开启下拉刷新,自动 ...
- HTML—xhtml和html5
一.什么是XHTML? XHTML指的是可扩展超文本标记语言: XHTML与HTML 4.01几乎是相同的: XHTML是更严格跟纯净的HTML版本: XHTML是以XML应用的方式定义的HTML: ...
- LINQ技术
转载http://www.cnblogs.com/Dlonghow/p/1413830.html Linq (Language Integrated Query,语言集成查询),是微软公司提供的一项新 ...
- Redis闪退解决办法
复杂办法! cmd 进入命令,cd进入redis文件 输入:redis-server.exe redis.windows.conf,手动开启! 简单办法,删除重新下载! 不确定办法如下 1.在解压的r ...
- mysql group_concat时间用法
第一张表的worksId在第二张表中对应多条数据,需要将每条数据的日期作为结果查询出来,一个作为“初审时间”,另一个作为“复审时间”: 可以使用group_concat 和 group by 来进行分 ...
- Scala-Unit5-Scala面对对象与模式匹配
Java中的面向对象:万物皆对象. 我们要封装数据,定义模板等操作,素以我们需要面向对象. ====================================================== ...
- [ 高危 ] my网任意账户登陆
该网站的任意登录其实都已经提交得差不多了,本来以为这个漏洞会是一个重复的,然而试了一下发现思路奇葩. 任意登录,一般都为验证码爆破,4位手机验证码,而用于拦截的图片验证码没有或者可以重复使用,所以就能 ...
- html5手势操作与多指操作封装与Canvas图片裁切实战
当前情况,移动端的开发占比越来越高,单指的拖拽触碰等操作是常规需要.特殊的多指操作与手势操作还需另做处理,而且还涉及到兼容性问题. // 屏幕上存在两根或两根以上的手指 时触发 仅IOS存在手势事件, ...