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. Specified key was too long; max key length is 767 bytes解决方案

    问题描述: 1.  使用spark sql处理数据逻辑,逻辑处理后使用 df.write.mode(saveMode).jdbc(url, tableName, connectionPropertie ...

  2. windows server 2003产生的 Minidmp蓝屏文件分析求助

    在机房运行的四台服务器中均出现了蓝屏dmp文件,经过整理发现CDMS主备服务器最近(2018年1月开始)蓝屏的dmp很多.经过自己的学习分析发现不足以找到先关的原因和处理方法,希望得到大牛们的帮助.以 ...

  3. Android View转为图片保存为本地文件,异步监听回调操作结果;

    把手机上的一个View或ViewGroup转为Bitmap,再把Bitmap保存为.png格式的图片: 由于View转Bitmap.和Bitmap转图片都是耗时操作,(生成一个1M的图片大约500ms ...

  4. win10环境下适应pip安装autobahn提示认证失败的问题

    工作需要看一下websocket的东西,然后使用autobahn三方,但是使用pip install安装怎么也安装不上,问了很多网站,都说的升级pip,可是每一个鸡巴管用的,不过还是谢谢他们,现在我只 ...

  5. ubuntu下多版本OpenCV的共存与使用

    首先,OpenCV历史版本下载:https://www.opencv.org/releases.html 一.把不同版本的OpenCV安装在不同位置 下载好OpenCV源码,在安装之前打开CMakeL ...

  6. 使用Autoencoder进行降维

    #coding=utf-8import tensorflow as tf import matplotlib.pyplot as plt from tensorflow.examples.tutori ...

  7. kylin配置

    hadoop 2.7.4,hive 2.1.1,hbase 1.4.4 配置好的情况下 下载apache-kylin-2.1.0-bin-hbase1x.tar.gz 解压后,配置环境变量 expor ...

  8. QAC静态测试配置及使用教程

    使用前提:安装成功QAC软件. . 1.打开软件如上 . 2.file->Auto-Create-Project,出现如下所示对话框 1-工程名字 2-将要分析的代码路径 3-代码报告输出路径 ...

  9. python3百度设置高级搜索例子

    #=======================================#作者:邓沛友#2018.12.16=============================coding:utf-8f ...

  10. RPM包指令总结

    一.RPM RPM包安装位置 RPM包默认安装路径 /etc/ 配置文件安装目录 /usr/bin/ 可执行的命令安装目录 /usr/lib/ 程序所使用的函数库保存位置 /usr/share/doc ...