java eml解析_javamail 收邮件 解析eml文件
内容来自:http://www.oschina.net/bbs/thread/528
以下代码经过测试了的能通过
我在用javaMail做收邮件时怎么邮件内容重复(一种文本格式的,一种html格式的),并且图片无法正常显示:
答:内容重复,因为很多邮件工具在发送HTML邮件的时候,为了防止接收端无法阅读html邮件,都附送了一份纯文本的邮件。解析的时候需要对这种情况进行过滤
这是我用的代码:请高手指教:
package com.espeed.test;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Properties;
import javax.mail.BodyPart;
import javax.mail.Flags;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Part;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeUtility;
public class PraseMimeMessage{
private MimeMessage mimeMessage=null;
private String saveAttachPath="";//附件下载后的存放目录
private StringBuffer bodytext=new StringBuffer();
//存放邮件内容的StringBuffer对象
private String dateformat="yy-MM-dd HH:mm";//默认的日前显示格式
/**
* 构造函数,初始化一个MimeMessage对象
*/
public PraseMimeMessage() {
}
public PraseMimeMessage(MimeMessage mimeMessage) {
this.mimeMessage=mimeMessage;
}
public void setMimeMessage(MimeMessage mimeMessage){
this.mimeMessage=mimeMessage;
}
/**
* 获得发件人的地址和姓名
*/
public String getFrom1()throws Exception{
InternetAddress address[]=(InternetAddress[])mimeMessage.getFrom();
String from=address[0].getAddress();
if(from==null){
from="";
}
String personal=address[0].getPersonal();
if(personal==null){
personal="";
}
String fromaddr=personal+"";
return fromaddr;
}
/**
* 获得邮件的收件人,抄送,和密送的地址和姓名,根据所传递的参数的不同
* "to"----收件人 "cc"---抄送人地址 "bcc"---密送人地址
* @throws Exception */
public String getMailAddress(String type){
String mailaddr="";
try {
String addtype=type.toUpperCase();
InternetAddress []address=null;
if(addtype.equals("TO")||addtype.equals("CC")||addtype.equals("BBC")){
if(addtype.equals("TO")){
address=(InternetAddress[])mimeMessage.getRecipients(Message.RecipientType.TO);
}
else if(addtype.equals("CC")){
address=(InternetAddress[])mimeMessage.getRecipients(Message.RecipientType.CC);
}
else{
address=(InternetAddress[])mimeMessage.getRecipients(Message.RecipientType.BCC);
}
if(address!=null){
for (int i = 0; i < address.length; i++) {
String email=address[i].getAddress();
if(email==null)email="";
else{
email=MimeUtility.decodeText(email);
}
String personal=address[i].getPersonal();
if(personal==null)personal="";
else{
personal=MimeUtility.decodeText(personal);
}
String compositeto=personal+"";
mailaddr+=","+compositeto;
}
mailaddr=mailaddr.substring(1);
}
}
else{
}
} catch (Exception e) {
// TODO: handle exception
}
return mailaddr;
}
/**
* 获得邮件主题
*/
public String getSubject()
{
String subject="";
try {
subject=MimeUtility.decodeText(mimeMessage.getSubject());
if(subject==null)subject="";
} catch (Exception e) {
// TODO: handle exception
}
return subject;
}
/**
* 获得邮件发送日期
*/
public String getSendDate()throws Exception{
Date senddate=mimeMessage.getSentDate();
SimpleDateFormat format=new SimpleDateFormat(dateformat);
return format.format(senddate);
}
/**
* 解析邮件,把得到的邮件内容保存到一个StringBuffer对象中,解析邮件
* 主要是根据MimeType类型的不同执行不同的操作,一步一步的解析
*/
public void getMailContent(Part part)throws Exception{
String contenttype=part.getContentType();
int nameindex=contenttype.indexOf("name");
boolean conname=false;
if(nameindex!=-1)conname=true;
if(part.isMimeType("text/plain")&&!conname){
bodytext.append((String)part.getContent());
}else if(part.isMimeType("text/html")&&!conname){
bodytext.append((String)part.getContent());
}
else if(part.isMimeType("multipart/*")){
Multipart multipart=(Multipart)part.getContent();
int counts=multipart.getCount();
for(int i=0;i
getMailContent(multipart.getBodyPart(i));
}
}else if(part.isMimeType("message/rfc822")){
getMailContent((Part)part.getContent());
}
else{}
}
/**
* 获得邮件正文内容
*/
public String getBodyText(){
return bodytext.toString();
}
/**
* 判断此邮件是否需要回执,如果需要回执返回"true",否则返回"false"
* @throws MessagingException */
public boolean getReplySign() throws MessagingException{
boolean replysign=false;
String needreply[]=mimeMessage.getHeader("Disposition-Notification-To");
if(needreply!=null){
replysign=true;
}
return replysign;
}
/**
* 获得此邮件的Message-ID
* @throws MessagingException */
public String getMessageId() throws MessagingException{
return mimeMessage.getMessageID();
}
/**
* 【判断此邮件是否已读,如果未读返回返回false,反之返回true】
* @throws MessagingException */
public boolean isNew() throws MessagingException{
boolean isnew =false;
Flags flags=((Message)mimeMessage).getFlags();
Flags.Flag[]flag=flags.getSystemFlags();
for (int i = 0; i < flag.length; i++) {
if(flag[i]==Flags.Flag.SEEN){
isnew=true;
break;
}
}
return isnew;
}
/**
* 判断此邮件是否包含附件
* @throws MessagingException */
public boolean isContainAttach(Part part) throws Exception{
boolean attachflag=false;
String contentType=part.getContentType();
if(part.isMimeType("multipart/*")){
Multipart mp=(Multipart)part.getContent();
//获取附件名称可能包含多个附件
for(int j=0;j
BodyPart mpart=mp.getBodyPart(j);
String disposition=mpart.getDescription();
if((disposition!=null)&&((disposition.equals(Part.ATTACHMENT))||(disposition.equals(Part.INLINE)))){
attachflag=true;
}else if(mpart.isMimeType("multipart/*")){
attachflag=isContainAttach((Part)mpart);
}else{
String contype=mpart.getContentType();
if(contype.toLowerCase().indexOf("application")!=-1) attachflag=true;
if(contype.toLowerCase().indexOf("name")!=-1) attachflag=true;
}
}
}else if(part.isMimeType("message/rfc822")){
attachflag=isContainAttach((Part)part.getContent());
}
return attachflag;
}
/**
* 【保存附件】
* @throws Exception
* @throws IOException
* @throws MessagingException
* @throws Exception */
public void saveAttachMent(Part part) throws Exception {
String fileName="";
if(part.isMimeType("multipart/*")){
Multipart mp=(Multipart)part.getContent();
for(int j=0;j
BodyPart mpart=mp.getBodyPart(j);
String disposition=mpart.getDescription();
if((disposition!=null)&&((disposition.equals(Part.ATTACHMENT))||(disposition.equals(Part.INLINE)))){
fileName=mpart.getFileName();
if(fileName.toLowerCase().indexOf("GBK")!=-1){
fileName=MimeUtility.decodeText(fileName);
}
saveFile(fileName,mpart.getInputStream());
}
else if(mpart.isMimeType("multipart/*")){
fileName=mpart.getFileName();
}
else{
fileName=mpart.getFileName();
if((fileName!=null)){
fileName=MimeUtility.decodeText(fileName);
saveFile(fileName,mpart.getInputStream());
}
}
}
}
else if(part.isMimeType("message/rfc822")){
saveAttachMent((Part)part.getContent());
}
}
/**
* 【设置附件存放路径】
*/
public void setAttachPath(String attachpath){
this.saveAttachPath=attachpath;
}
/**
* 【设置日期显示格式】
*/
public void setDateFormat(String format){
this.dateformat=format;
}
/**
* 【获得附件存放路径】
*/
public String getAttachPath()
{
return saveAttachPath;
}
/**
* 【真正的保存附件到指定目录里】
*/
private void saveFile(String fileName,InputStream in)throws Exception{
String osName=System.getProperty("os.name");
String storedir=getAttachPath();
String separator="";
if(osName==null)osName="";
if(osName.toLowerCase().indexOf("win")!=-1){
//如果是window 操作系统
separator="/";
if(storedir==null||storedir.equals(""))storedir="c:\tmp";
}
else{
//如果是其他的系统
separator="/";
storedir="/tmp";
}
File strorefile=new File(storedir+separator+fileName);
BufferedOutputStream bos=null;
BufferedInputStream bis=null;
try {
bos=new BufferedOutputStream(new FileOutputStream(strorefile));
bis=new BufferedInputStream(in);
int c;
while((c=bis.read())!=-1){
bos.write(c);
bos.flush();
}
} catch (Exception e) {
// TODO: handle exception
}finally{
bos.close();
bis.close();
}
}
/**
* PraseMimeMessage类测试
* @throws Exception */
public static void main(String[] args) throws Exception {
String host="mail.21gmail.com";
String username="fjj0@21gmail.com";
String password="123456789";
Properties props=new Properties();
Session session=Session.getDefaultInstance(props,null);
Store store=session.getStore("pop3");
store.connect(host,username,password);
Folder folder=store.getFolder("INBOX");
folder.open(Folder.READ_ONLY);
Message message[]=folder.getMessages();
PraseMimeMessage pmm=null;
for (int i = 0; i < message.length; i++) {
System.out.println("****************************************第"+(i+1)+"封邮件**********************************");
pmm=new PraseMimeMessage((MimeMessage)message[i]);
System.out.println("主题 :"+pmm.getSubject());
pmm.setDateFormat("yy年MM月dd日 HH:mm");
System.out.println("发送时间 :"+pmm.getSendDate());
System.out.println("是否回执 :"+pmm.getReplySign());
System.out.println("是否包含附件 :"+pmm.isContainAttach((Part)message[i]));
System.out.println("发件人 :"+pmm.getFrom1());
System.out.println("收件人 :"+pmm.getMailAddress("TO"));
System.out.println("抄送地址 :"+pmm.getMailAddress("CC"));
System.out.println("密送地址 :"+pmm.getMailAddress("BCC"));
System.out.println("邮件ID :"+i+":"+pmm.getMessageId());
pmm.getMailContent((Part)message[i]); //根据内容的不同解析邮件
pmm.setAttachPath("d:/temp"); //设置邮件附件的保存路径
pmm.saveAttachMent((Part)message[i]); //保存附件
System.out.println("邮件正文 :"+pmm.getBodyText());
System.out.println("*********************************第"+(i+1)+"封邮件结束*************************************");
}
}
}
java eml解析_javamail 收邮件 解析eml文件相关推荐
- java mail 回复邮件_JavaMail - 退回邮件( Bounced Messages)
JavaMail - 退回邮件( Bounced Messages) 由于多种原因,可以退回邮件. rfc1211深入讨论了这个问题. 只有服务器才能确定是否存在特定邮箱或用户名. 当服务器检测到错误 ...
- java收发邮寄_JavaMail收发邮件的一般流程与主要方法
1.Properties属性类 Properties p = new Properties(); p.put(key, value); key-| mail.smtp.host -| mail.smt ...
- 几行 Python 代码实现邮件解析,超赞~
作者 | Yunlor 来源 | CSDN博客 前言 如何通过python实现邮件解析?邮件的格式十分复杂,主要是mime协议,本文主要是从实现出发,具体原理可以自行研究. 一.安装 通过mailgu ...
- 邮件解析引擎FastMail库使用
1 概述 邮件解析库API完全使用面向对象技术设计,使用C++语言开发的用于邮件解析和组装的库.它提供了一些类用来解析和组装Internet邮件,如MimeMessage和MimeB ...
- imap java 接收_javamail实现邮件接收功能IMap和pop3方式
/** * IMAP方式 * */ import java.util.Properties; import javax.mail.Folder; import javax.mail.Message; ...
- python几行代码实现邮件解析
前言 如何通过python实现邮件解析?邮件的格式十分复杂,主要是mime协议,本文主要是从实现出发,具体原理可以自行研究. 一.安装 通过mailgun开源的Flanker库实现邮件解析.该库包含了 ...
- Java多线程之8Lock问题解析
Java多线程之8Lock问题解析 本文目录 1. 8Lock实例: 标准访问的时候,请问先打印邮件还是短信? sendEmail方法暂停4秒钟,请问先打印邮件还是短信? 新增Hello普通方法,请问 ...
- java邮箱格式_JavaMail入门:创建纯文本、HTML格式的邮件
转自:http://haolloyin.blog.51cto.com/1177454/353849/ 在 http://java.sun.com/products/javamail/ 下载了 Java ...
- 邮件解析引擎FastMail库大功告成!
1 概述 邮件解析库API完全使用面向对象技术设计,使用C++语言开发的用于邮件解析和组装的库.它提供了一些类用来解析和组装Internet邮件,如MimeMessage和MimeB ...
最新文章
- SpringMVC详细示例实战教程
- 【操作系统复习】操作系统的概念、功能和目标
- shell脚本 变量
- Fedora17下Firefox安装flashplayer
- 从分析性数据库ADS中导出数据
- centos yum php memcache,Debian|Centos安装memcached和php5-memcache模块
- OpenWrt加入iptables 支持过滤字符串
- 网络安全——C段扫描
- 利用Nginx反向代理解决服务器80端口被封
- 百度地图APIAndroid SDK常见问题
- 虚幻官方文档使用UMG(虚幻运动图像)的用户界面笔记[VS2019]
- 用python画一朵鲜艳欲滴的红玫瑰
- 第十三届蓝桥杯大赛软件赛省赛真题
- 数学学习方法:直观思维的重要性
- 房地产特征价格评估的次市场效应模型: 一种概率方法撰写
- batocera 完整包_Batocera Plus 2.0 中文整合版bt下载 8G和150G
- Linux 终端terminal设置透明化
- c语言验证卡布列卡猜想,西安电子科技大学刘三阳教授为新生作专题讲座
- Excel如何快速对多个不连续区域求和汇总
- 前端html学习记录
热门文章
- echarts鼠标放上去不显示值
- linux 命令启动菜单栏,Linux守护进程的启动方法
- jsp中JAVA代码取select值_jsp获取下拉列表select选择的值 | 学步园
- linux改ip之后恢复出厂设置密码,Linux忘记密码及修改IP地址解决方案
- python如何定义自定义函数_python类中系统自定义函数
- matlab卷积画图,基于MATLAB的卷积演示系统课程设计
- java 拦截html请求参数值_javaweb项目,html文件放在了WebRoot下,如何拦截访问html的请求呀?...
- linux python 操作mysql_python 简单操作MySQL
- java 类型推导_Java10类型推导
- sql2000数据类型对应的数值_Qlikview---数据类型