package com.mw.utils;

import com.mw.bean.SmsAlarmLogBean;

import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.search.FlagTerm;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Properties;
import java.util.regex.Matcher;
import java.util.regex.Pattern; /**
*
*/
public class MonitorMail { public static final String prefix ="[";
public static final String suffix ="]"; public static final String regex="\\[([^}]*)\\]";
public Pattern pattern = Pattern.compile(regex);
//邮箱服务地址
private String host;
//邮箱协议(pop3 imap,协议需要小写)
private String protocol;
//服务端口
private int port;
//邮箱name
private String username;
//邮箱密码
private String password; private URLName url; private Session session; private Store store; private Boolean filter; private Folder folder; private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); /**
*
* @param protocol 协议
* @param host 服务器
* @param port 端口
* @param username 邮箱账号
* @param password 邮箱密码
*/
public MonitorMail(String protocol,String host,int port,String username,String password){ //协议小写
this.protocol=protocol.toLowerCase();
this.host=host;
this.port=port;
this.username=username;
this.password=password; } /**
* 初始化连接邮箱服务器
* @return
* @throws Exception
* store.isConnected();
*/ public MonitorMail initConnect() throws NoSuchProviderException,MessagingException{
//INBOX 为抓取收件箱的邮件
this.url = new URLName(protocol, host, port, "INBOX", username, password);
Properties props = new Properties();
props.put("mail.imap.timeout",4000);
props.put("mail.imap.connectiontimeout",4000);//连接超时时间
this.session = Session.getInstance(props, null);
//得到邮件仓库
this.store = session.getStore(url);
//连接server
this.store.connect(); return this; } /**
* 获取收件箱所有的信息消息
* @return
* @throws Exception
*/
public Message[] requireMessage() throws Exception{
this.folder = store.getFolder(url);
folder.open(Folder.READ_WRITE);
//index 索引
FlagTerm ft =
new FlagTerm(new Flags(Flags.Flag.SEEN), false); //false代表未读,true代表已读
Message[] message = folder.search(ft);
return message; } /**
* 获取邮箱内容
* @return
* @throws Exception
*/
public List<String> requireText(boolean filter) throws Exception{
this.filter=filter;
ArrayList<String> candidate =new ArrayList<>();
//获取邮箱内容对象
Message[] message = requireMessage(); for(int i=0;i<message.length;i++){
String text="";
//文本类型mail
if (message[i].isMimeType("text/plain")) { text = message[i].getContent().toString();
//媒体类型
}else if(message[i].isMimeType("multipart/*")){
text = requireMultipartContext(message[i]);
} //默认拦截器过滤mail 内容
if(filter){
String filterContent = defaultFilter(text);
if(filterContent!=null){
candidate.add(filterContent);
updateState(message[i]);
}
}else {
String filterContent = customerFilter(text);
candidate.add(filterContent);
updateState(message[i]);
} }
/**
System.out.println("发件人:" + formatAddress(message.getFrom())
+ "\n发送时间:" + formatDate(message.getSentDate())
+ "\n收件人:" + formatAddress(message.getRecipients(Message.RecipientType.TO))
// + "\n收件时间:" + formatDate(msg.getReceivedDate())
// + "\n抄送:" + formatAddress(msg.getRecipients(Message.RecipientType.CC))
// + "\n暗送:" + formatAddress(msg.getRecipients(Message.RecipientType.BCC))
+ "\n主题:" + message.getSubject());
**/ return candidate;
} protected void updateState(Message msg) throws Exception{
if(protocol.equals("imap")) {
//pop3没有判断邮件是否为已读的功能,要使用imap才可以进行邮件的标记状态
msg.setFlag(Flags.Flag.SEEN, true);//设置邮件为已读状态
// msg.saveChanges();
}
} /**
* 获取Multipart/*类型的邮箱内容
* @param message
* @return
*/
public String requireMultipartContext(Message message) throws Exception{
StringBuffer strBuf =new StringBuffer();
if (message.isMimeType("multipart/*")) {
Multipart mp = (Multipart) message.getContent();
int count = mp.getCount();
for (int j = 0; j < count; j++) {
BodyPart bp = mp.getBodyPart(j);
String disposition = bp.getDisposition();
if (disposition != null && disposition.equals(Part.ATTACHMENT)) {
System.out.println("附件:" + bp.getFileName());
} else {
if (bp.isMimeType("text/plain")) {
//邮件文本内容
strBuf.append(bp.getContent()); }
}
}
}
return strBuf.toString();
} /**
* 默认拦截,匹配"[][][][]" 此类型格式的mail
* @param mailContent
* @return 匹配失败返回null
*/
protected String defaultFilter(String mailContent){
StringBuffer buffer =new StringBuffer();
Matcher matcher = pattern.matcher(mailContent);
while(matcher.find()){
buffer.append(matcher.group());
}
String content = buffer.toString();
if(content.length()==0){
return null;
}
return content;
} /**
* 解析mail 内容
* @param content
* @return
*/
public SmsAlarmLogBean defaultParseText(String content){
if(!filter){
throw new IllegalStateException("只可以解析[][][]格式的邮件内容");
}
String[] info = content.split(suffix);
SmsAlarmLogBean alarm =null;
if(info.length>7){
alarm= new SmsAlarmLogBean();
alarm.setAlarm_type(preIndex(info[5]));
alarm.setServer_name(preIndex(info[0]));
alarm.setPc_ip(preIndex(info[1]));
alarm.setStart_time(preIndex(info[3]));
alarm.setProcess_name(preIndex(info[7]));
alarm.setEquip_name(preIndex(info[4])); }
return alarm;
} /**
* 自定义拦截器
*/
public String customerFilter(String mailContent){ return mailContent;
} /**
* 自定义解析
* @param content
* @return
*/
public Object customerParseText(String content){
return null;
} public static String preIndex(String info){
String substring ="";
if(info.length()>=2) {
substring= info.substring(1);
}
return substring;
} public void close()throws Exception{
if(folder !=null) {
if (folder.isOpen()) {
folder.close(true);
}
};
if(store!=null){
if(store.isConnected()){
store.close();
}
} } public static String formatDate(Date date) {
return sdf.format(date);
} public static String formatAddress(Address[] addr) {
StringBuffer sb = new StringBuffer();
if (addr == null) {
return "";
}
for (int i = 0; i < addr.length; i++) {
Address a = addr[i];
if (a instanceof InternetAddress) {
InternetAddress ia = (InternetAddress) a;
sb.append(ia.getPersonal() + "<" + ia.getAddress() + ">,");
} else {
sb.append(a.toString());
}
}
if (sb.length() != 0) {
return sb.substring(0, sb.length() - 1);
}
return "";
} //test MonitorMail
public static void main(String[] args) throws Exception {
MonitorMail mail =new MonitorMail("imap","192.168.0.101",143,"test@luobin.com",
"Pass1234");
List<String> strings = mail.initConnect().requireText(true);//fasle返回我们自定义的,根据业务需求
System.out.println(strings);
mail.close(); } }

java mail 接收邮件的更多相关文章

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

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

  2. java来接收邮件并解析邮件正文中的表格

    这里是实际需求中的一个DEMO 有一部分内容进行了注释和处理,参考需要修改成自己的实际参数.另这个是对于实际一个场景的案例并不是通用解决的工具类. import org.jsoup.Jsoup; im ...

  3. java mail 读取邮件列表,

    // 准备连接服务器的会话信息 Properties props = new Properties(); props.setProperty("mail.store.protocol&quo ...

  4. 关于使用Java Mail发邮件的问题

    今天做东西的时候突然遇到需要发邮件的问题,然后就使用SMTP协议进行邮件的发送.用了一个工具类简化邮件发送的功能, 在这次试验中,我使用了自己的QQ邮箱进行发送邮件的发送者. public class ...

  5. Java邮件服务学习之三:邮箱服务客户端-Java Mail

    一.java mail的两个JAR包 1.mail.jar:不在JDK中,核心功能依赖JDK4及以上,该jar包已经加入到java EE5: 下载地址:http://www.oracle.com/te ...

  6. java mail

    java mail 1.配置 mvn <dependency> <groupId>javax.mail</groupId> <artifactId>ma ...

  7. 基于java mail实现简单的QQ邮箱发送邮件

    刚学习到java邮件相关的知识,先写下这篇博客,方便以后翻阅学习. -----------------------------第一步 开启SMTP服务 在 QQ 邮箱里的 设置->账户里开启 S ...

  8. 通过Java发送邮件和接收邮件的工具类

    一.第一种 使用SMTP协议发送电子邮件 第一步:加入mail.jar包 (1)简单类型 package com.souvc.mail; import java.util.Date; import j ...

  9. Java Mail(二):JavaMail介绍及发送一封简单邮件

    http://blog.csdn.net/ghsau/article/details/17839983 ************************************************ ...

随机推荐

  1. Nuget调用简单封装.

    1. 项目引用Dapper作为直接访问, 为了使用方便, 封装一下.达到效果: - 数据库连接配置在webconfig.xml中.  - 常用调用方法封装. 调用: //可以采用单例模式. //全局实 ...

  2. hive函数--编码解码

    以UTF-8为例: 测试字符串:☕️午后咖啡☕️ 一.编码 hive"); 输出: %E2%98%95%EF%B8%8F%E5%8D%88%E5%90%8E%E5%92%96%E5%95%A ...

  3. this 指向详细解析(箭头函数)

    前言 this 指向问题是入坑前端必须了解知识点,现在迎来了ES6时代,因为箭头函数的出现,所以感觉有必要对 this 问题梳理一下,遂有此文 在非箭头函数下, this 指向调用其所在函数的对象,而 ...

  4. Android开发 MVP模式的规范记录(个人总结)

    前言 首先,这篇文章不在讲解什么是mvp模式,如果需要请自行搜索mvp模式文章了解.这个文章里我只记录mvp模式的创建和mvp各自层的界限.另外这个博客属于个人使用mvp模式后一些经验总结与记录.并不 ...

  5. caffe学习笔记1

    博客 http://blog.csdn.net/seven_first/article/details/47378697 https://zhuanlan.zhihu.com/p/25127756?r ...

  6. centos mysql 默认是区分大小写的,修改成不区分大小写

    修改mysql为不区分大小写设置: [root@test-huanqiu ~]# vim /etc/my.cnf //添加下面一行设置 .... [mysqld] lower_case_table_n ...

  7. 电脑修改密码后git上传失败Authentication failed

    (一)进入控制面板 (二)选择用户账户 (三)选择管理你的凭据 (四)选择Windows凭据 (五)选择git保存的用户信息 (六)选择编辑或者进行删除操作 (七)完成

  8. c++堆和栈(转)

    想要学好C++的C++堆栈,那么就要了解什么是C++堆栈,所为C++堆栈就是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除,分为堆和栈两部分. 在C++中,内存分 ...

  9. Vsftpd服务重启、暂停命令

    VSFTP是一个基于GPL发布的类Unix系统上使用的FTP服务器软件,它的全称是Very Secure FTP 从此名称可以看出来,编制者的初衷是代码的安全. 在使用Vsftp服务是经常需要启动.停 ...

  10. DEDECMS 多站用一个站图片

    function replaceurl($newurl) { $newurl=str_replace('src="/uploads/allimg/','src="xxx.com/u ...