【问题标题】:Apache james mailet endless loopApache james mailet 无限循环
【发布时间】:2013-02-08 13:03:12
【问题描述】:

我尝试将我的第一个示例 mailet 部署到 apache james v2.3.2,但它进入了一个无限循环,即使在重新启动服务器后也会一次又一次地向我发送电子邮件。阻止它的唯一方法是清理 spool 文件夹。

在 config.xml 中,我将我的 mailet 配置如下:

<mailet match="All" class="MyMailet" onMailetException="ignore">
  <supportMailAddress>support@[mydomain].com</supportMailAddress>
</mailet>

我的 mailet 所做的只是从 support@[mydomain].com 向 me@[mydomain].com 邮箱发送电子邮件:

public class MyMailet extends GenericMailet {
  private MailAddress supportMailAddress;

  public void init() throws ParseException {
    supportMailAddress = new MailAddress(getInitParameter("supportMailAddress"));
  }

  public void service(Mail mail) throws MessagingException {
    MailAddress sender = mail.getSender();
    MailAddress realMailbox = new MailAddress("me@[mydomain].com");

    try {
      sendToRealMailbox(mail, realMailbox);
    } catch (MessagingException me) {
      me.printStackTrace();
    } catch (IOException ioe) {
      ioe.printStackTrace();
    }

    mail.setState(Mail.GHOST);
  }


  private void sendToRealMailbox(Mail mail, MailAddress realMailbox) throws MessagingException, IOException {
    Properties props = System.getProperties();
    Session session = Session.getDefaultInstance(props);
    MimeMessage message = new MimeMessage(session);

    message.setFrom(supportMailAddress.toInternetAddress());
    message.setRecipient(Message.RecipientType.TO, realMailbox.toInternetAddress());
    message.setSubject("MyMailet: " + mail.getMessage().getSubject());
    message.setText("MyMailet: message body");
    message.setSentDate(new Date());

    Collection recipients = new Vector();
    recipients.add(realMailbox);
    getMailetContext().sendMail(supportMailAddress, recipients, message);
  }

  public String getMailetInfo() {
    return "MyMailet";
  }
}

我做错了什么?

【问题讨论】:

    标签: loops infinite-loop james


    【解决方案1】:

    你使用了匹配器“All”,即

    &lt;mailet match="All"&gt;

    这告诉 James 为所有电子邮件运行此 mailet。因此,当您向support@[mydomain].com 发送第一封电子邮件时,mailet 会触发并向me@[mydomain].com 发送一封电子邮件。进入me@[mydomain].com 的电子邮件会导致mailet 再次触发并向me@[mydomain].com 发送另一封电子邮件,这会导致mailet 再次触发,等等...

    尝试改用“RecipientIs”匹配器,即

    &lt;mailet match="RecipientIs=support@[mydomain].com"&gt;

    这只会在电子邮件到达 support@[mydomain].com 时触发 mailet。

    看到这个list of James matchers with examples

    【讨论】:

      猜你喜欢
      • 2011-01-24
      • 1970-01-01
      • 1970-01-01
      • 2014-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-24
      • 1970-01-01
      相关资源
      最近更新 更多