首页 > 解决方案 > 如何使用 java 在 postfix 的 milter 中复制电子邮件

问题描述

我在java中使用jmilter为后缀编写了一个milter代码(队列前过滤器) 。我想从原始电子邮件中复制并将其发送到防病毒服务器以检查电子邮件,然后保留原始电子邮件。

当杀毒软件通知电子邮件是干净的时,原始电子邮件将被释放。复制电子邮件很容易出错,因为我需要检查和解析电子邮件并创建一个 MimeMessage 对象。

有没有办法在不解析原始正文和标题的情况下复制电子邮件?

我不是指always_bcc后缀中的选项。我想发送带有原始数据的电子邮件而不制作Mimemessage.

我将正文和标题保存在 hashMap 中并传递给sendBccEmail方法。sendBccEmail解析正文并制作MimeMessage然后发送电子邮件。

     @Override
 public void envrcpt(MilterContext context, List < String > recipients) throws MilterException {
   // Keep body to append body data in other steps(because the data is sent chunk by chunk
   if (isFirstChunk(context)) {
     contextMap.put(context.id(), new HashMap < > ());
     contextMap.get(context.id()).put("X-body", "");
   }

 }

 @Override
 public void header(MilterContext context, String headerName, String headerValue) throws MilterException {
   logger.debug("<HEADER> headerName= {}, headerValue= {}", headerName, headerValue);
   if (!isBccEmail(context)) {
     contextMap.get(context.id()).put(headerName, headerValue);
   }
   super.header(context, headerName, headerValue);
 }
 @Override
 public void body(MilterContext context, String bodyChunk) throws MilterException {
   logger.debug("<BODY> bodyChunk= {}", bodyChunk);
   if (!isBccEmail(context)) {
     String body = contextMap.get(context.id()).get("X-body");
     body += nullToEmptyString(bodyChunk);
     contextMap.get(context.id()).put("X-body", body);
   }
   super.body(context, bodyChunk);
 }

 @Override
 public void eom(MilterContext context, @Nullable String bodyChunk) throws MilterException {
   logger.debug("<EOM> bodyChunk= {}", bodyChunk);
   if (!isBccEmail(context)) {
     String body = contextMap.get(context.id()).get("X-body");
     body += nullToEmptyString(bodyChunk);
     //send header hashMap and body as  parameters
     sendBccEmail(contextMap.get(context.id()), body);
   }
   super.eom(context, bodyChunk);
 }

标签: javajakarta-mailpostfix-mtamilter

解决方案


推荐阅读