@Override public void startMessage() throws MimeException { if (stack.isEmpty()) { stack.push(decryptedRootPart); } else { Part part = (Part) stack.peek(); Message innerMessage = new MimeMessage(); part.setBody(innerMessage); stack.push(innerMessage); } }
@Override public void body(BodyDescriptor bd, InputStream inputStream) throws MimeException, IOException { Part part = (Part) stack.peek(); String transferEncoding = bd.getTransferEncoding(); Body body = createBody(inputStream, transferEncoding, fileFactory); part.setBody(body); }
@Override public void startMessage() { if (stack.isEmpty()) { stack.addFirst(MimeMessage.this); } else { expect(Part.class); Part part = (Part) stack.peek(); MimeMessage m = new MimeMessage(); part.setBody(m); stack.addFirst(m); } }
@Override public void startMultipart(BodyDescriptor bd) throws MimeException { Part part = (Part) stack.peek(); String mimeType = bd.getMimeType(); String boundary = bd.getBoundary(); MimeMultipart multipart = new MimeMultipart(mimeType, boundary); part.setBody(multipart); stack.push(multipart); }
@Override public void startMultipart(BodyDescriptor bd) throws MimeException { expect(Part.class); Part e = (Part)stack.peek(); String mimeType = bd.getMimeType(); String boundary = bd.getBoundary(); MimeMultipart multiPart = new MimeMultipart(mimeType, boundary); e.setBody(multiPart); stack.addFirst(multiPart); }
@Override public void endMultipart() { expect(Multipart.class); Multipart multipart = (Multipart) stack.removeFirst(); boolean hasNoBodyParts = multipart.getCount() == 0; boolean hasNoEpilogue = multipart.getEpilogue() == null; if (hasNoBodyParts && hasNoEpilogue) { /* * The parser is calling startMultipart(), preamble(), and endMultipart() when all we have is * headers of a "multipart/*" part. But there's really no point in keeping a Multipart body if all * of the content is missing. */ expect(Part.class); Part part = (Part) stack.peek(); part.setBody(null); } }
@Override public void body(BodyDescriptor bd, InputStream in) throws IOException, MimeException { expect(Part.class); Body body = bodyFactory.createBody(bd.getTransferEncoding(), bd.getMimeType(), in); ((Part)stack.peek()).setBody(body); }
} else if (MimeUtility.isMessage(parentMimeType)) { Message innerMessage = new LocalMimeMessage(getAccountUuid(), message, id); parentPart.setBody(innerMessage); part = innerMessage; } else { part.setBody(multipart); multipart.setPreamble(preamble); multipart.setEpilogue(epilogue); part.setBody(body); } else if (dataLocation == DataLocation.ON_DISK) { String encoding = cursor.getString(7); if (file.exists()) { Body body = new FileBackedBody(file, encoding); part.setBody(body);
@Test public void fetchPart_withTextSection_shouldProcessImapResponses() throws Exception { ImapFolder folder = createFolder("Folder"); prepareImapFolderForOpen(OPEN_MODE_RO); folder.open(OPEN_MODE_RO); ImapMessage message = createImapMessage("1"); Part part = createPlainTextPart("1.1"); setupSingleFetchResponseToCallback(); folder.fetchPart(message, part, null, new DefaultBodyFactory()); ArgumentCaptor<Body> bodyArgumentCaptor = ArgumentCaptor.forClass(Body.class); verify(part).setBody(bodyArgumentCaptor.capture()); Body body = bodyArgumentCaptor.getValue(); Buffer buffer = new Buffer(); body.writeTo(buffer.outputStream()); assertEquals("text", buffer.readUtf8()); }
public static void setBody(Part part, Body body) throws MessagingException { part.setBody(body); if (part instanceof Message) { part.setHeader("MIME-Version", "1.0"); } if (body instanceof Multipart) { Multipart multipart = ((Multipart) body); multipart.setParent(part); String contentType = Headers.contentTypeForMultipart(multipart.getMimeType(), multipart.getBoundary()); part.setHeader(MimeHeader.HEADER_CONTENT_TYPE, contentType); // note: if this is ever changed to 8bit, multipart/signed parts must always be 7bit! setEncoding(part, MimeUtil.ENC_7BIT); } else if (body instanceof TextBody) { MimeValue contentTypeHeader = MimeParameterDecoder.decode(part.getContentType()); String mimeType = contentTypeHeader.getValue(); if (MimeUtility.mimeTypeMatches(mimeType, "text/*")) { String name = contentTypeHeader.getParameters().get("name"); String contentType = Headers.contentType(mimeType, "utf-8", name); part.setHeader(MimeHeader.HEADER_CONTENT_TYPE, contentType); } else { part.setHeader(MimeHeader.HEADER_CONTENT_TYPE, mimeType); } setEncoding(part, MimeUtil.ENC_QUOTED_PRINTABLE); } else if (body instanceof RawDataBody) { String encoding = ((RawDataBody) body).getEncoding(); part.setHeader(MimeHeader.HEADER_CONTENT_TRANSFER_ENCODING, encoding); } }