javamail解析邮件内容中含有图片

有时候邮件正文中含有图片,这类邮件正文该如何保存?话不多说,直接上代码:

大概的实现思想就是:邮件内容中包含图片,则将正文中的图片上传到文件储存服务器(OOS)上,然后将[原图片地址]替换成[上传到OOS上后的地址]

package com.xiaochaojiang.mail.recieve;

import java.io.UnsupportedEncodingException;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
import java.util.Set;

import javax.activation.DataSource;
import javax.mail.Folder;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeUtility;

import org.apache.commons.io.IOUtils;
import org.apache.commons.mail.util.MimeMessageParser;

import com.sun.mail.pop3.POP3Folder;
//解析邮件内容中包含图片的情况  以163企业邮箱为例
/**
 * 方法说明:邮件内容中包含图片,则将正文中的图片上传到文件储存服务器(OOS)上,
 *       然后将[原图片地址]替换成[上传到OOS上后的地址]
 * @author Administrator
 *
 */
public class ContentImageReceive {
	public static void main(String[] args) throws Exception {
		Folder folder = null;
		Store store = null;
		try {
			Properties props = new Properties();
			props.setProperty("mail.store.protocol", "pop3"); // 协议
			props.setProperty("mail.pop3.port", "995"); // 端口 110 995
			props.setProperty("mail.pop3.host", "pop.qiye.163.com"); // pop3服务器
			// 如果设置,则指定实现该javax.net.SocketFactory接口的类的名称 。这个类将被用来创建POP3套接字。
			props.setProperty("mail.pop3.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
			// 如果设置为true,则无法使用指定的套接字工厂类创建套接字将导致使用java.net.Socket该类创建套接字。默认为true。
			props.setProperty("mail.pop3.socketFactory.fallback", "false");
			// 指定在使用指定的套接字工厂时要连接的端口。如果未设置,则将使用默认端口。
			props.setProperty("mail.pop3.socketFactory.port", "995");
			props.setProperty("mail.pop3.ssl.enable", "true");
//          props.setProperty("mail.debug", "true");//打印mail日志
//			props.setProperty("mail.mime.charset","iso8859-1");
			Session session = Session.getInstance(props);
			session.setDebug(false);
			store = session.getStore("pop3");
			store.connect("邮箱", "邮箱密码/授权码");
			// 获得收件箱
			folder = store.getFolder("INBOX");

			POP3Folder inbox = (POP3Folder) folder;
			/*
			 * Folder.READ_ONLY:只读权限
			 * Folder.READ_WRITE:可读可写(可以修改邮件的状态)
			 */
			folder.open(Folder.READ_WRITE); // 打开收件箱
			int messageCount = inbox.getMessageCount();
			if(messageCount <= 0) {
				System.out.println("没有可接受的邮件 ");
			}
			MimeMessageParser parser = null;
			MimeMessage msg = null;
			String contentStr = null;
			String uid = "";
			// 得到收件箱中的所有邮件,并解析
			for(int i = messageCount;i>0;i--) {
				if(!inbox.isOpen()) { //判断是否open  
					inbox.open(Folder.READ_ONLY);
				}
				msg = (MimeMessage) inbox.getMessage(i);
				uid = inbox.getUID(msg);
				parser = new MimeMessageParser(msg).parse();
                contentStr = parser.getHtmlContent();
	    		if(contentStr == null) {
	    	    	contentStr = parser.getPlainContent();
                    if(contentStr == null) {
	    			    contentStr = "";
	    		    }
	    	    }
				//邮件内容中的图片处理
	    		List<DataSource> attachments = parser.getAttachmentList();
	    		//文件预览中无法显示不能包含/ 和-
        	    Set<String> cids =  (Set<String>) parser.getContentIds();
        		Iterator<String> it = cids.iterator();
        	    while (it.hasNext()) {
        	      String cid = it.next();
        	      // contentStr判断是否含有cid,如果含有需要处理,如果不包含,不需要处理
        	      if(contentStr.contains(cid)) {
        	    	  DataSource ds = parser.findAttachmentByCid(cid);
        		      if(ds != null){
        		    	  // to do 将邮件内容中的图片上传到文件存储服务器
        		    	  String replaceStr = "上传到文件存储服务器后的地址";//得到  上传到文件存储服务器后的地址
        		    	  attachments.remove(ds);
        			      contentStr = contentStr.replace("cid:"+cid,replaceStr);
        		      } 
        	      }
        	    }
        	    for(int j=0;j<attachments.size();j++) {
      			  DataSource ds = attachments.get(i);
      			  byte[] bytesfile = IOUtils.toByteArray(ds.getInputStream());
      	          String fileName = decodeText(ds.getName());
      	          //to do 保存附件信息到数据库中
      	          //to do 将附件上传到文件存储服务器上
        	    }
        	    
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			//释放资源  
			if(folder!=null && folder.isOpen()) {
				 folder.close(true);  
			}
			if(store != null) {
				store.close();
			}
		}
	}
	public static String decodeText(String encodeText) throws UnsupportedEncodingException {  
        if (encodeText == null || "".equals(encodeText)) {  
            return "";  
        } else {  
            return MimeUtility.decodeText(encodeText);  
        }  
    }
}

 

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值