Search in sources :

Example 6 with BlobInputStream

use of com.zimbra.cs.store.BlobInputStream in project zm-mailbox by Zimbra.

the class ZimbraLmtpBackend method deliver.

@Override
public void deliver(LmtpEnvelope env, InputStream in, int sizeHint) throws UnrecoverableLmtpException {
    CopyInputStream cis = null;
    Blob blob = null;
    try {
        int bufLen = Provisioning.getInstance().getLocalServer().getMailDiskStreamingThreshold();
        cis = new CopyInputStream(in, sizeHint, bufLen, bufLen);
        in = cis;
        //            MimeParserInputStream mpis = null;
        //            if (ZMimeMessage.usingZimbraParser()) {
        //                mpis = new MimeParserInputStream(in);
        //                in = mpis;
        //            }
        Rfc822ValidationInputStream validator = null;
        if (LC.zimbra_lmtp_validate_messages.booleanValue()) {
            validator = new Rfc822ValidationInputStream(in, LC.zimbra_lmtp_max_line_length.longValue());
            in = validator;
        }
        try {
            blob = StoreManager.getInstance().storeIncoming(in);
        } catch (IOException ioe) {
            throw new UnrecoverableLmtpException("Error in storing incoming message", ioe);
        }
        if (validator != null && !validator.isValid()) {
            try {
                StoreManager.getInstance().delete(blob);
            } catch (IOException e) {
                ZimbraLog.lmtp.warn("Error in deleting blob %s", blob, e);
            }
            setDeliveryStatuses(env.getRecipients(), LmtpReply.INVALID_BODY_PARAMETER);
            return;
        }
        BufferStream bs = cis.getBufferStream();
        byte[] data = bs.isPartial() ? null : bs.getBuffer();
        BlobInputStream bis = null;
        MimeMessage mm = null;
        try {
            deliverMessageToLocalMailboxes(blob, bis, data, mm, env);
        } catch (Exception e) {
            ZimbraLog.lmtp.warn("Exception delivering mail (temporary failure)", e);
            setDeliveryStatuses(env.getLocalRecipients(), LmtpReply.TEMPORARY_FAILURE);
        }
        try {
            deliverMessageToRemoteMailboxes(blob, data, env);
        } catch (Exception e) {
            ZimbraLog.lmtp.warn("Exception delivering remote mail", e);
            setDeliveryStatuses(env.getRemoteRecipients(), LmtpReply.TEMPORARY_FAILURE);
        }
    } catch (ServiceException e) {
        ZimbraLog.lmtp.warn("Exception delivering mail (temporary failure)", e);
        setDeliveryStatuses(env.getRecipients(), LmtpReply.TEMPORARY_FAILURE);
    } finally {
        if (cis != null) {
            cis.release();
        }
        if (blob != null) {
            try {
                // clean up the incoming blob
                StoreManager.getInstance().delete(blob);
            } catch (IOException e) {
                ZimbraLog.lmtp.warn("Error in deleting blob %s", blob, e);
            }
        }
    }
}
Also used : BufferStream(com.zimbra.common.util.BufferStream) Blob(com.zimbra.cs.store.Blob) MailboxBlob(com.zimbra.cs.store.MailboxBlob) ServiceException(com.zimbra.common.service.ServiceException) DeliveryServiceException(com.zimbra.common.service.DeliveryServiceException) MailServiceException(com.zimbra.cs.mailbox.MailServiceException) MimeMessage(javax.mail.internet.MimeMessage) CopyInputStream(com.zimbra.common.util.CopyInputStream) Rfc822ValidationInputStream(com.zimbra.common.mime.Rfc822ValidationInputStream) IOException(java.io.IOException) BlobInputStream(com.zimbra.cs.store.BlobInputStream) MessagingException(javax.mail.MessagingException) LmtpProtocolException(com.zimbra.common.lmtp.LmtpProtocolException) ServiceException(com.zimbra.common.service.ServiceException) IOException(java.io.IOException) DeliveryServiceException(com.zimbra.common.service.DeliveryServiceException) MailServiceException(com.zimbra.cs.mailbox.MailServiceException)

Aggregations

BlobInputStream (com.zimbra.cs.store.BlobInputStream)6 Blob (com.zimbra.cs.store.Blob)3 MailboxBlob (com.zimbra.cs.store.MailboxBlob)3 IOException (java.io.IOException)3 InputStream (java.io.InputStream)3 Mailbox (com.zimbra.cs.mailbox.Mailbox)2 ThreaderTest (com.zimbra.cs.mailbox.ThreaderTest)2 ParsedMessage (com.zimbra.cs.mime.ParsedMessage)2 AbstractStoreManagerTest (com.zimbra.cs.store.AbstractStoreManagerTest)2 StagedBlob (com.zimbra.cs.store.StagedBlob)2 StoreManager (com.zimbra.cs.store.StoreManager)2 Test (org.junit.Test)2 LmtpProtocolException (com.zimbra.common.lmtp.LmtpProtocolException)1 Rfc822ValidationInputStream (com.zimbra.common.mime.Rfc822ValidationInputStream)1 DeliveryServiceException (com.zimbra.common.service.DeliveryServiceException)1 ServiceException (com.zimbra.common.service.ServiceException)1 BufferStream (com.zimbra.common.util.BufferStream)1 CopyInputStream (com.zimbra.common.util.CopyInputStream)1 MailServiceException (com.zimbra.cs.mailbox.MailServiceException)1 File (java.io.File)1