use of com.zimbra.common.util.BufferStream 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);
}
}
}
}
use of com.zimbra.common.util.BufferStream in project zm-mailbox by Zimbra.
the class SpamExtract method extractMessages.
private static List<String> extractMessages(HttpClient hc, GetMethod gm, String path, File outdir, boolean raw) throws HttpException, IOException {
List<String> extractedIds = new ArrayList<String>();
gm.setPath(path);
if (LOG.isDebugEnabled()) {
LOG.debug("Fetching " + path);
}
HttpClientUtil.executeMethod(hc, gm);
if (gm.getStatusCode() != HttpStatus.SC_OK) {
throw new IOException("HTTP GET failed: " + gm.getPath() + ": " + gm.getStatusCode() + ": " + gm.getStatusText());
}
ArchiveInputStream tgzStream = null;
try {
tgzStream = new TarArchiveInputStream(new GZIPInputStream(gm.getResponseBodyAsStream()), Charsets.UTF_8.name());
ArchiveInputEntry entry = null;
while ((entry = tgzStream.getNextEntry()) != null) {
LOG.debug("got entry name %s", entry.getName());
if (entry.getName().endsWith(".meta")) {
ItemData itemData = new ItemData(readArchiveEntry(tgzStream, entry));
UnderlyingData ud = itemData.ud;
//.meta always followed by .eml
entry = tgzStream.getNextEntry();
if (raw) {
// Write the message as-is.
File file = new File(outdir, mOutputPrefix + "-" + mExtractIndex++);
OutputStream os = null;
try {
os = new BufferedOutputStream(new FileOutputStream(file));
byte[] data = readArchiveEntry(tgzStream, entry);
ByteUtil.copy(new ByteArrayInputStream(data), true, os, false);
if (verbose) {
LOG.info("Wrote: " + file);
}
extractedIds.add(ud.id + "");
} catch (java.io.IOException e) {
String fileName = outdir + "/" + mOutputPrefix + "-" + mExtractIndex;
LOG.error("Cannot write to " + fileName, e);
} finally {
if (os != null) {
os.close();
}
}
} else {
// Write the attached message to the output directory.
BufferStream buffer = new BufferStream(entry.getSize(), MAX_BUFFER_SIZE);
buffer.setSequenced(false);
MimeMessage mm = null;
InputStream fis = null;
try {
byte[] data = readArchiveEntry(tgzStream, entry);
ByteUtil.copy(new ByteArrayInputStream(data), true, buffer, false);
if (buffer.isSpooled()) {
fis = new ZSharedFileInputStream(buffer.getFile());
mm = new ZMimeMessage(mJMSession, fis);
} else {
mm = new ZMimeMessage(mJMSession, buffer.getInputStream());
}
writeAttachedMessages(mm, outdir, entry.getName());
extractedIds.add(ud.id + "");
} catch (MessagingException me) {
LOG.warn("exception occurred fetching message", me);
} finally {
ByteUtil.closeStream(fis);
}
}
}
}
} finally {
Closeables.closeQuietly(tgzStream);
}
return extractedIds;
}
Aggregations