001 /* 002 * Copyright 2010 the original author or authors. 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 package com.hs.mail.imap.message; 017 018 import java.io.IOException; 019 import java.io.InputStream; 020 import java.util.Date; 021 022 import org.apache.james.mime4j.MimeException; 023 import org.apache.james.mime4j.MimeIOException; 024 import org.apache.james.mime4j.field.AbstractField; 025 import org.apache.james.mime4j.field.AddressListField; 026 import org.apache.james.mime4j.field.DateTimeField; 027 import org.apache.james.mime4j.field.FieldName; 028 import org.apache.james.mime4j.field.MailboxListField; 029 import org.apache.james.mime4j.field.UnstructuredField; 030 import org.apache.james.mime4j.field.address.AddressList; 031 import org.apache.james.mime4j.field.address.Mailbox; 032 import org.apache.james.mime4j.field.address.MailboxList; 033 import org.apache.james.mime4j.io.MaxHeaderLimitException; 034 import org.apache.james.mime4j.message.Header; 035 import org.apache.james.mime4j.parser.AbstractContentHandler; 036 import org.apache.james.mime4j.parser.Field; 037 import org.apache.james.mime4j.parser.MimeEntityConfig; 038 import org.apache.james.mime4j.parser.MimeStreamParser; 039 import org.springframework.util.CollectionUtils; 040 041 /** 042 * 043 * @author Won Chul Doh 044 * @since Mar 8, 2010 045 * 046 */ 047 public class MessageHeader { 048 private Header header = new Header(); 049 050 public MessageHeader(InputStream is) throws MimeIOException, IOException { 051 final MimeStreamParser parser = createMimeParser(); 052 parser.setContentHandler(new AbstractContentHandler() { 053 @Override 054 public void endHeader() { 055 parser.stop(); 056 } 057 @Override 058 public void field(Field field) throws MimeException { 059 Field parsedField = AbstractField.parse(field.getRaw()); 060 header.addField(parsedField); 061 } 062 }); 063 try { 064 parser.parse(is); 065 } catch (MaxHeaderLimitException ex) { 066 // Ignore this exception 067 } catch (MimeException ex) { 068 throw new MimeIOException(ex); 069 } 070 } 071 072 private static MimeStreamParser createMimeParser() { 073 MimeEntityConfig config = new MimeEntityConfig(); 074 config.setMaxLineLen(-1); 075 return new MimeStreamParser(config); 076 } 077 078 public Header getHeader() { 079 return header; 080 } 081 082 public String getSubject() { 083 UnstructuredField field = obtainField(FieldName.SUBJECT); 084 if (field == null) 085 return null; 086 087 return field.getValue(); 088 } 089 090 public Date getDate() { 091 DateTimeField dateField = obtainField(FieldName.DATE); 092 if (dateField == null) 093 return null; 094 095 return dateField.getDate(); 096 } 097 098 public Mailbox getFrom() { 099 MailboxList mailboxList = getMailboxList(FieldName.FROM); 100 if (CollectionUtils.isEmpty(mailboxList)) { 101 Field field = header.getField(FieldName.FROM); 102 return new Mailbox(field.getBody(), null); 103 } else { 104 return mailboxList.get(0); 105 } 106 } 107 108 public Mailbox getReplyTo() { 109 MailboxList mailboxList = getMailboxList(FieldName.REPLY_TO); 110 if (CollectionUtils.isEmpty(mailboxList)) { 111 return null; 112 } else { 113 return mailboxList.get(0); 114 } 115 } 116 117 public AddressList getTo() { 118 return getAddressList(FieldName.TO); 119 } 120 121 public AddressList getCc() { 122 return getAddressList(FieldName.CC); 123 } 124 125 public AddressList getBcc() { 126 return getAddressList(FieldName.BCC); 127 } 128 129 private MailboxList getMailboxList(String fieldName) { 130 MailboxListField field = obtainField(fieldName); 131 if (field == null) 132 return null; 133 134 return field.getMailboxList(); 135 } 136 137 private AddressList getAddressList(String fieldName) { 138 AddressListField field = obtainField(fieldName); 139 if (field == null) 140 return null; 141 142 return field.getAddressList(); 143 } 144 145 <F extends Field> F obtainField(String fieldName) { 146 if (header == null) 147 return null; 148 149 @SuppressWarnings("unchecked") 150 F field = (F) header.getField(fieldName); 151 return field; 152 } 153 154 }