📄 imapmessage.java
字号:
public void setContentID(String cid) throws MessagingException { throw new IllegalWriteException("IMAPMessage is read-only"); } /** * Get the Content-MD5. */ public String getContentMD5() throws MessagingException { checkExpunged(); loadBODYSTRUCTURE(); return bs.md5; } public void setContentMD5(String md5) throws MessagingException { throw new IllegalWriteException("IMAPMessage is read-only"); } /** * Get the decoded Content-Description. */ public String getDescription() throws MessagingException { checkExpunged(); if (description != null) // cached value ? return description; loadBODYSTRUCTURE(); if (bs.description == null) return null; try { description = MimeUtility.decodeText(bs.description); } catch (UnsupportedEncodingException ex) { description = bs.description; } return description; } public void setDescription(String description, String charset) throws MessagingException { throw new IllegalWriteException("IMAPMessage is read-only"); } /** * Get the Message-ID. */ public String getMessageID() throws MessagingException { checkExpunged(); loadEnvelope(); return envelope.messageId; } /** * Get the "filename" Disposition parameter. (Only available in * IMAP4rev1). If thats not available, get the "name" ContentType * parameter. */ public String getFileName() throws MessagingException { checkExpunged(); String filename = null; loadBODYSTRUCTURE(); if (bs.dParams != null) filename = bs.dParams.get("filename"); if (filename == null && bs.cParams != null) filename = bs.cParams.get("name"); return filename; } public void setFileName(String filename) throws MessagingException { throw new IllegalWriteException("IMAPMessage is read-only"); } /** * Get all the bytes for this message. Overrides getContentStream() * in MimeMessage. This method is ultimately used by the DataHandler * to obtain the input stream for this message. * * @see javax.mail.internet.MimeMessage#getContentStream */ protected InputStream getContentStream() throws MessagingException { InputStream is = null; boolean pk = getPeek(); // get before acquiring message cache lock // Acquire MessageCacheLock, to freeze seqnum. synchronized(getMessageCacheLock()) { try { IMAPProtocol p = getProtocol(); // This message could be expunged when we were waiting // to acquire the lock ... checkExpunged(); if (p.isREV1() && (getFetchBlockSize() != -1)) // IMAP4rev1 return new IMAPInputStream(this, toSection("TEXT"), bs != null ? bs.size : -1, pk); if (p.isREV1()) { BODY b; if (pk) b = p.peekBody(getSequenceNumber(), toSection("TEXT")); else b = p.fetchBody(getSequenceNumber(), toSection("TEXT")); if (b != null) is = b.getByteArrayInputStream(); } else { RFC822DATA rd = p.fetchRFC822(getSequenceNumber(), "TEXT"); if (rd != null) is = rd.getByteArrayInputStream(); } } catch (ConnectionException cex) { throw new FolderClosedException(folder, cex.getMessage()); } catch (ProtocolException pex) { forceCheckExpunged(); throw new MessagingException(pex.getMessage(), pex); } } if (is == null) throw new MessagingException("No content"); else return is; } /** * Get the DataHandler object for this message. */ public synchronized DataHandler getDataHandler() throws MessagingException { checkExpunged(); if (dh == null) { loadBODYSTRUCTURE(); if (type == null) { // type not yet computed // generate content-type from BODYSTRUCTURE ContentType ct = new ContentType(bs.type, bs.subtype, bs.cParams); type = ct.toString(); } /* Special-case Multipart and Nested content. All other * cases are handled by the superclass. */ if (bs.isMulti()) dh = new DataHandler( new IMAPMultipartDataSource(this, bs.bodies, sectionId, this) ); else if (bs.isNested() && isREV1()) /* Nested messages are handled specially only for * IMAP4rev1. IMAP4 doesn't provide enough support to * FETCH the components of nested messages */ dh = new DataHandler( new IMAPNestedMessage(this, bs.bodies[0], bs.envelope, sectionId == null ? "1" : sectionId + ".1"), type ); } return super.getDataHandler(); } public void setDataHandler(DataHandler content) throws MessagingException { throw new IllegalWriteException("IMAPMessage is read-only"); } /** * Write out the bytes into the given outputstream. */ public void writeTo(OutputStream os) throws IOException, MessagingException { InputStream is = null; boolean pk = getPeek(); // get before acquiring message cache lock // Acquire MessageCacheLock, to freeze seqnum. synchronized(getMessageCacheLock()) { try { IMAPProtocol p = getProtocol(); checkExpunged(); // insure this message is not expunged if (p.isREV1()) { BODY b; if (pk) b = p.peekBody(getSequenceNumber(), sectionId); else b = p.fetchBody(getSequenceNumber(), sectionId); if (b != null) is = b.getByteArrayInputStream(); } else { RFC822DATA rd = p.fetchRFC822(getSequenceNumber(), null); if (rd != null) is = rd.getByteArrayInputStream(); } } catch (ConnectionException cex) { throw new FolderClosedException(folder, cex.getMessage()); } catch (ProtocolException pex) { forceCheckExpunged(); throw new MessagingException(pex.getMessage(), pex); } } if (is == null) throw new MessagingException("No content"); // write out the bytes byte[] bytes = new byte[1024]; int count; while ((count = is.read(bytes)) != -1) os.write(bytes, 0, count); } /** * Get the named header. */ public String[] getHeader(String name) throws MessagingException { checkExpunged(); if (isHeaderLoaded(name)) // already loaded ? return headers.getHeader(name); // Load this particular header InputStream is = null; // Acquire MessageCacheLock, to freeze seqnum. synchronized(getMessageCacheLock()) { try { IMAPProtocol p = getProtocol(); // This message could be expunged when we were waiting // to acquire the lock ... checkExpunged(); if (p.isREV1()) { BODY b = p.peekBody(getSequenceNumber(), toSection("HEADER.FIELDS (" + name + ")") ); if (b != null) is = b.getByteArrayInputStream(); } else { RFC822DATA rd = p.fetchRFC822(getSequenceNumber(), "HEADER.LINES (" + name + ")"); if (rd != null) is = rd.getByteArrayInputStream(); } } catch (ConnectionException cex) { throw new FolderClosedException(folder, cex.getMessage()); } catch (ProtocolException pex) { forceCheckExpunged(); throw new MessagingException(pex.getMessage(), pex); } } // if we get this far without "is" being set, something has gone // wrong; prevent a later NullPointerException and return null here if (is == null) return null; if (headers == null) headers = new InternetHeaders(); headers.load(is); // load this header into the Headers object. setHeaderLoaded(name); // Mark this header as loaded return headers.getHeader(name); } /** * Get the named header. */ public String getHeader(String name, String delimiter) throws MessagingException { checkExpunged(); // force the header to be loaded by invoking getHeader(name) if (getHeader(name) == null) return null; return headers.getHeader(name, delimiter); } public void setHeader(String name, String value) throws MessagingException { throw new IllegalWriteException("IMAPMessage is read-only"); } public void addHeader(String name, String value) throws MessagingException { throw new IllegalWriteException("IMAPMessage is read-only"); } public void removeHeader(String name) throws MessagingException { throw new IllegalWriteException("IMAPMessage is read-only"); } /** * Get all headers. */ public Enumeration getAllHeaders() throws MessagingException { checkExpunged(); loadHeaders(); return super.getAllHeaders(); } /** * Get matching headers. */ public Enumeration getMatchingHeaders(String[] names) throws MessagingException { checkExpunged(); loadHeaders(); return super.getMatchingHeaders(names); } /** * Get non-matching headers. */ public Enumeration getNonMatchingHeaders(String[] names) throws MessagingException { checkExpunged(); loadHeaders(); return super.getNonMatchingHeaders(names); } public void addHeaderLine(String line) throws MessagingException { throw new IllegalWriteException("IMAPMessage is read-only"); } /** * Get all header-lines. */ public Enumeration getAllHeaderLines() throws MessagingException { checkExpunged(); loadHeaders(); return super.getAllHeaderLines(); } /** * Get all matching header-lines. */ public Enumeration getMatchingHeaderLines(String[] names) throws MessagingException { checkExpunged(); loadHeaders(); return super.getMatchingHeaderLines(names); } /** * Get all non-matching headerlines. */ public Enumeration getNonMatchingHeaderLines(String[] names) throws MessagingException { checkExpunged(); loadHeaders(); return super.getNonMatchingHeaderLines(names); } /** * Get the Flags for this message. */ public synchronized Flags getFlags() throws MessagingException { checkExpunged(); loadFlags(); return super.getFlags(); } /** * Test if the given Flags are set in this message. */ public synchronized boolean isSet(Flags.Flag flag) throws MessagingException { checkExpunged(); loadFlags(); return super.isSet(flag); } /** * Set/Unset the given flags in this message. */ public synchronized void setFlags(Flags flag, boolean set) throws MessagingException { // Acquire MessageCacheLock, to freeze seqnum. synchronized(getMessageCacheLock()) { try { IMAPProtocol p = getProtocol(); checkExpunged(); // Insure that this message is not expunged p.storeFlags(getSequenceNumber(), flag, set); } catch (ConnectionException cex) { throw new FolderClosedException(folder, cex.getMessage()); } catch (ProtocolException pex) { throw new MessagingException(pex.getMessage(), pex); } } } /** * Set whether or not to use the PEEK variant of FETCH when * fetching message content. * * @since JavaMail 1.3.3 */ public synchronized void setPeek(boolean peek) { this.peek = peek; } /** * Get whether or not to use the PEEK variant of FETCH when * fetching message content. * * @since JavaMail 1.3.3 */ public synchronized boolean getPeek() { return peek; } /** * Invalidate cached header and envelope information for this * message. Subsequent accesses of this information will * cause it to be fetched from the server. * * @since JavaMail 1.3.3 */ public synchronized void invalidateHeaders() { headersLoaded = false; loadedHeaders = null; envelope = null; bs = null; receivedDate = null; size = -1; type = null; subject = null; description = null; } /** * The prefetch method. Called from IMAPFolder.fetch() */ static void fetch(IMAPFolder folder, Message[] msgs, FetchProfile fp) throws MessagingException { /* This class implements the test to be done on each * message in the folder. The test is to check whether the * message has already cached all the items requested in the * FetchProfile. If any item is missing, the test succeeds and * breaks out. */ class FetchProfileCondition implements Utility.Condition { private boolean needEnvelope = false; private boolean needFlags = false; private boolean needBodyStructure = false; private boolean needUID = false; private boolean needHeaders = false; private boolean needSize = false; private String[] hdrs = null; public FetchProfileCondition(FetchProfile fp) { if (fp.contains(FetchProfile.Item.ENVELOPE)) needEnvelope = true; if (fp.contains(FetchProfile.Item.FLAGS)) needFlags = true; if (fp.contains(FetchProfile.Item.CONTENT_INFO)) needBodyStructure = true; if (fp.contains(UIDFolder.FetchProfileItem.UID)) needUID = true; if (fp.contains(IMAPFolder.FetchProfileItem.HEADERS)) needHeaders = true; if (fp.contains(IMAPFolder.FetchProfileItem.SIZE)) needSize = true; hdrs = fp.getHeaderNames(); } // The actual test. public boolean test(IMAPMessage m) { if (needEnvelope && m._getEnvelope() == null) return true; // no envelope if (needFlags && m._getFlags() == null)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -