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);  
        }  
    }
}

 

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
可以使用 JavaMail API 的 MimeMessage 类和相关类来解析邮件内容并去除引用内容部分。以下是一个示例代码: ```java import javax.mail.*; import javax.mail.internet.*; import java.io.IOException; import java.util.regex.Pattern; public class EmailParser { private static final Pattern QUOTE_PATTERN = Pattern.compile("(?m)^>.*$\n?"); public static String parseEmailContent(Message message) throws MessagingException, IOException { Object contentObject = message.getContent(); if (contentObject instanceof Multipart) { Multipart multipart = (Multipart) contentObject; StringBuilder stringBuilder = new StringBuilder(); for (int i = 0; i < multipart.getCount(); i++) { BodyPart bodyPart = multipart.getBodyPart(i); String disposition = bodyPart.getDisposition(); if (disposition != null && (disposition.equalsIgnoreCase(BodyPart.ATTACHMENT))) { // do nothing, skip attachments } else { String body = (String) bodyPart.getContent(); stringBuilder.append(removeQuotedText(body)); } } return stringBuilder.toString(); } else if (contentObject instanceof String) { return removeQuotedText((String) contentObject); } else { return ""; } } private static String removeQuotedText(String text) { return QUOTE_PATTERN.matcher(text).replaceAll(""); } } ``` 这个示例代码,我们使用 MimeMessage 对象获取邮件内容。如果邮件内容是一个 Multipart 对象,我们就需要遍历它的所有 BodyPart 对象,将它们的内容合并并去除引用内容部分。如果邮件内容是一个字符串,我们就直接去除引用内容部分。最后返回处理后的邮件内容字符串。 在去除引用内容部分时,我们使用了一个正则表达式来匹配邮件的引用部分。这个正则表达式可以匹配以 ">" 开头的行,并将其删除。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值