Search in sources :

Example 21 with ZMimeBodyPart

use of com.zimbra.common.zmime.ZMimeBodyPart in project zm-mailbox by Zimbra.

the class CalendarMailSender method makeICalIntoMimePart.

public static MimeBodyPart makeICalIntoMimePart(ZVCalendar cal) throws ServiceException {
    try {
        MimeBodyPart mbp = new ZMimeBodyPart();
        setCalendarContent(mbp, cal);
        return mbp;
    } catch (MessagingException e) {
        throw ServiceException.FAILURE("Failure creating MimeBodyPart from calendar", e);
    }
}
Also used : ZMimeBodyPart(com.zimbra.common.zmime.ZMimeBodyPart) MessagingException(javax.mail.MessagingException) ZMimeBodyPart(com.zimbra.common.zmime.ZMimeBodyPart) MimeBodyPart(javax.mail.internet.MimeBodyPart)

Example 22 with ZMimeBodyPart

use of com.zimbra.common.zmime.ZMimeBodyPart in project zm-mailbox by Zimbra.

the class TnefConverter method visitMultipart.

@Override
protected boolean visitMultipart(MimeMultipart mmp, VisitPhase visitKind) throws MessagingException {
    // do the decode in the exit phase
    if (visitKind != VisitPhase.VISIT_END)
        return false;
    // proactively ignore already-converted TNEF attachments
    if (MimeConstants.CT_MULTIPART_ALTERNATIVE.equals(mmp.getContentType()))
        return false;
    try {
        boolean found = false;
        for (int i = 0; i < mmp.getCount() && !found; i++) {
            BodyPart bp = mmp.getBodyPart(i);
            found = bp instanceof MimeBodyPart && TNEFUtils.isTNEFMimeType(bp.getContentType());
        }
        if (!found)
            return false;
        // check to make sure that the caller's OK with altering the message
        if (mCallback != null && !mCallback.onModification())
            return false;
    } catch (MessagingException e) {
        ZimbraLog.extensions.warn("exception while traversing multipart; skipping", e);
        return false;
    }
    List<MultipartReplacement> tnefReplacements = new ArrayList<MultipartReplacement>();
    try {
        for (int i = 0; i < mmp.getCount(); i++) {
            BodyPart bp = mmp.getBodyPart(i);
            if (bp instanceof MimeBodyPart && TNEFUtils.isTNEFMimeType(bp.getContentType())) {
                // try to expand the TNEF into a suitable Multipart
                MimeMultipart multi = null;
                try {
                    multi = expandTNEF((MimeBodyPart) bp);
                } catch (Exception e) {
                    ZimbraLog.extensions.warn("exception while decoding TNEF; skipping part", e);
                    continue;
                }
                if (multi == null)
                    continue;
                tnefReplacements.add(new MultipartReplacement(i, (MimeBodyPart) bp, multi));
            }
        }
    } catch (MessagingException e) {
        ZimbraLog.extensions.warn("exception while traversing multipart; skipping", e);
        return false;
    }
    for (MultipartReplacement change : tnefReplacements) {
        // unhitch the old TNEF part from the parent multipart and add it to the new converted one
        mmp.removeBodyPart(change.partIndex);
        change.converted.addBodyPart(change.tnefPart, 0);
        // create a BodyPart to contain the new Multipart (JavaMail bookkeeping)
        MimeBodyPart replacementPart = new ZMimeBodyPart();
        replacementPart.setContent(change.converted);
        // and put the new multipart/alternatives where the TNEF used to be
        mmp.addBodyPart(replacementPart, change.partIndex);
    }
    return !tnefReplacements.isEmpty();
}
Also used : ZMimeBodyPart(com.zimbra.common.zmime.ZMimeBodyPart) MimeBodyPart(javax.mail.internet.MimeBodyPart) BodyPart(javax.mail.BodyPart) MessagingException(javax.mail.MessagingException) ZMimeMultipart(com.zimbra.common.zmime.ZMimeMultipart) MimeMultipart(javax.mail.internet.MimeMultipart) ZMimeBodyPart(com.zimbra.common.zmime.ZMimeBodyPart) ArrayList(java.util.ArrayList) ZMimeBodyPart(com.zimbra.common.zmime.ZMimeBodyPart) MimeBodyPart(javax.mail.internet.MimeBodyPart) MessagingException(javax.mail.MessagingException) ServiceException(com.zimbra.common.service.ServiceException) IOException(java.io.IOException)

Example 23 with ZMimeBodyPart

use of com.zimbra.common.zmime.ZMimeBodyPart in project zm-mailbox by Zimbra.

the class TnefConverter method expandTNEF.

/**
     * Performs the TNEF->MIME conversion on any TNEF body parts that
     * make up the given message.
     * @throws ServiceException
     */
private MimeMultipart expandTNEF(MimeBodyPart bp) throws MessagingException, IOException {
    if (!TNEFUtils.isTNEFMimeType(bp.getContentType()))
        return null;
    MimeMessage converted = null;
    // convert TNEF to a MimeMessage and remove it from the parent
    InputStream is = null;
    try {
        TNEFInputStream tnefis = new TNEFInputStream(is = bp.getInputStream());
        converted = TNEFMime.convert(JMSession.getSession(), tnefis);
    // XXX bburtin: nasty hack.  Don't handle OOME since JTNEF can allocate a huge byte
    // array when the TNEF file is malformed.  See bug 42649.
    // } catch (OutOfMemoryError e) {
    //    Zimbra.halt("Ran out of memory while expanding TNEF attachment", e);
    } catch (Throwable t) {
        ZimbraLog.extensions.warn("Conversion failed.  TNEF attachment will not be expanded.", t);
        return null;
    } finally {
        ByteUtil.closeStream(is);
    }
    Object convertedContent = converted.getContent();
    if (!(convertedContent instanceof MimeMultipart)) {
        ZimbraLog.extensions.debug("TNEF attachment doesn't contain valid MimeMultiPart");
        return null;
    }
    MimeMultipart convertedMulti = (MimeMultipart) convertedContent;
    // make sure that all the attachments are marked as attachments
    for (int i = 0; i < convertedMulti.getCount(); i++) {
        BodyPart subpart = convertedMulti.getBodyPart(i);
        if (subpart.getHeader("Content-Disposition") == null)
            subpart.setHeader("Content-Disposition", Part.ATTACHMENT);
    }
    // Create a MimeBodyPart for the converted data.  Currently we're throwing
    // away the top-level message because its content shows up as blank after
    // the conversion.
    MimeBodyPart convertedPart = new ZMimeBodyPart();
    convertedPart.setContent(convertedMulti);
    // If the TNEF object contains calendar data, create an iCalendar version.
    MimeBodyPart icalPart = null;
    if (DebugConfig.enableTnefToICalendarConversion) {
        try {
            TnefToICalendar calConverter = new DefaultTnefToICalendar();
            ZCalendar.DefaultContentHandler icalHandler = new ZCalendar.DefaultContentHandler();
            if (calConverter.convert(mMimeMessage, bp.getInputStream(), icalHandler)) {
                if (icalHandler.getNumCals() > 0) {
                    List<ZVCalendar> cals = icalHandler.getCals();
                    Writer writer = new StringWriter(1024);
                    ICalTok method = null;
                    for (ZVCalendar cal : cals) {
                        cal.toICalendar(writer);
                        if (method == null)
                            method = cal.getMethod();
                    }
                    writer.close();
                    icalPart = new ZMimeBodyPart();
                    icalPart.setText(writer.toString());
                    ContentType ct = new ContentType(MimeConstants.CT_TEXT_CALENDAR);
                    ct.setCharset(MimeConstants.P_CHARSET_UTF8);
                    if (method != null)
                        ct.setParameter("method", method.toString());
                    icalPart.setHeader("Content-Type", ct.toString());
                }
            }
        } catch (ServiceException e) {
            throw new MessagingException("TNEF to iCalendar conversion failure: " + e.getMessage(), e);
        } catch (Throwable t) {
            //don't allow TNEF errors to crash server
            ZimbraLog.extensions.warn("Failed to convert TNEF to iCal", t);
            throw new MessagingException("TNEF to iCalendar conversion failure");
        }
    }
    // create a multipart/alternative for the TNEF and its MIME version
    MimeMultipart altMulti = new ZMimeMultipart("alternative");
    //        altMulti.addBodyPart(bp);
    altMulti.addBodyPart(convertedPart);
    if (icalPart != null)
        altMulti.addBodyPart(icalPart);
    return altMulti;
}
Also used : ZMimeBodyPart(com.zimbra.common.zmime.ZMimeBodyPart) MimeBodyPart(javax.mail.internet.MimeBodyPart) BodyPart(javax.mail.BodyPart) ContentType(com.zimbra.common.mime.ContentType) ZMimeBodyPart(com.zimbra.common.zmime.ZMimeBodyPart) MessagingException(javax.mail.MessagingException) TNEFInputStream(net.freeutils.tnef.TNEFInputStream) InputStream(java.io.InputStream) TNEFInputStream(net.freeutils.tnef.TNEFInputStream) DefaultTnefToICalendar(com.zimbra.cs.util.tnef.DefaultTnefToICalendar) ICalTok(com.zimbra.common.calendar.ZCalendar.ICalTok) ZCalendar(com.zimbra.common.calendar.ZCalendar) ZVCalendar(com.zimbra.common.calendar.ZCalendar.ZVCalendar) StringWriter(java.io.StringWriter) ServiceException(com.zimbra.common.service.ServiceException) MimeMessage(javax.mail.internet.MimeMessage) ZMimeMultipart(com.zimbra.common.zmime.ZMimeMultipart) MimeMultipart(javax.mail.internet.MimeMultipart) TnefToICalendar(com.zimbra.cs.util.tnef.TnefToICalendar) DefaultTnefToICalendar(com.zimbra.cs.util.tnef.DefaultTnefToICalendar) ZMimeMultipart(com.zimbra.common.zmime.ZMimeMultipart) ZMimeBodyPart(com.zimbra.common.zmime.ZMimeBodyPart) MimeBodyPart(javax.mail.internet.MimeBodyPart) StringWriter(java.io.StringWriter) Writer(java.io.Writer)

Example 24 with ZMimeBodyPart

use of com.zimbra.common.zmime.ZMimeBodyPart in project zm-mailbox by Zimbra.

the class ParseMimeMessage method attachMessage.

@SuppressWarnings("unchecked")
private static void attachMessage(MimeMultipart mmp, ItemId iid, String contentID, ParseMessageContext ctxt, boolean attachMessageFromCache) throws MessagingException, ServiceException {
    if (!iid.isLocal()) {
        attachRemoteItem(mmp, iid, contentID, ctxt, Collections.EMPTY_MAP, new ContentType(MimeConstants.CT_MESSAGE_RFC822));
        return;
    }
    Mailbox mbox = MailboxManager.getInstance().getMailboxByAccountId(iid.getAccountId());
    Message msg = mbox.getMessageById(ctxt.octxt, iid.getId());
    ctxt.incrementSize("attached message", msg.getSize());
    MimeBodyPart mbp = new ZMimeBodyPart();
    if (attachMessageFromCache && mbox.getAccount().isFeatureSMIMEEnabled() && (Mime.isEncrypted(msg.getMimeMessage(false).getContentType()) || Mime.isPKCS7Signed(msg.getMimeMessage(false).getContentType()))) {
        MimeMessage cachedMimeMessage = msg.getMimeMessage(true);
        mbp.setContent(cachedMimeMessage, MimeConstants.CT_MESSAGE_RFC822);
    } else {
        mbp.setDataHandler(new DataHandler(new MailboxBlobDataSource(msg.getBlob())));
        mbp.setHeader("Content-Type", MimeConstants.CT_MESSAGE_RFC822);
        mbp.setHeader("Content-Disposition", Part.ATTACHMENT);
    }
    mbp.setContentID(contentID);
    mmp.addBodyPart(mbp);
}
Also used : ContentType(com.zimbra.common.mime.ContentType) Mailbox(com.zimbra.cs.mailbox.Mailbox) ZMimeMessage(com.zimbra.common.zmime.ZMimeMessage) Message(com.zimbra.cs.mailbox.Message) MimeMessage(javax.mail.internet.MimeMessage) ZMimeBodyPart(com.zimbra.common.zmime.ZMimeBodyPart) ZMimeMessage(com.zimbra.common.zmime.ZMimeMessage) MimeMessage(javax.mail.internet.MimeMessage) MailboxBlobDataSource(com.zimbra.cs.mime.MailboxBlobDataSource) DataHandler(javax.activation.DataHandler) ZMimeBodyPart(com.zimbra.common.zmime.ZMimeBodyPart) MimeBodyPart(javax.mail.internet.MimeBodyPart)

Aggregations

ZMimeBodyPart (com.zimbra.common.zmime.ZMimeBodyPart)24 MimeBodyPart (javax.mail.internet.MimeBodyPart)22 ZMimeMultipart (com.zimbra.common.zmime.ZMimeMultipart)20 MimeMultipart (javax.mail.internet.MimeMultipart)20 MimeMessage (javax.mail.internet.MimeMessage)16 MessagingException (javax.mail.MessagingException)14 DataHandler (javax.activation.DataHandler)11 JavaMailInternetAddress (com.zimbra.common.mime.shim.JavaMailInternetAddress)7 ZMimeMessage (com.zimbra.common.zmime.ZMimeMessage)7 Date (java.util.Date)7 ContentDisposition (com.zimbra.common.mime.ContentDisposition)6 IOException (java.io.IOException)6 InternetAddress (javax.mail.internet.InternetAddress)6 SMTPMessage (com.sun.mail.smtp.SMTPMessage)5 ContentType (com.zimbra.common.mime.ContentType)5 Account (com.zimbra.cs.account.Account)4 Locale (java.util.Locale)4 ByteArrayDataSource (javax.mail.util.ByteArrayDataSource)4 ServiceException (com.zimbra.common.service.ServiceException)3 Mailbox (com.zimbra.cs.mailbox.Mailbox)3