在AppEngine中接收邮件时的多个请求

时间:2013-09-29 23:15:27

标签: java google-app-engine javamail

第一次尝试使用appengine mail api。我构建了一个响应电子邮件的servlet。我的web.xml文件和servlet类的相关摘录包含在下面。 然而,问题是,在我测试@ [appid] .appspotmail.com后发送一封电子邮件到应用程序后,发生了以下两种情况: 1.记录了对处理程序servlet的请求的许多日志条目,并且已达到我当天的邮件配额。 1/2小时后,我仍然看到有失败的新日志条目

Uncaught exception from servlet com.google.apphosting.api.ApiProxy$OverQuotaException: The API call mail.Send() required more quota than is available.

尽管如此,我还没有收到一封电子邮件。

此外,我的servlet中有recordMessage方法,为每个邮件请求保存数据存储区中的实体,因此我可以查看它们。我的查看器servlet包括一个计数器,当我写这个时,它处于109并且仍在攀爬,因此已经为同一封电子邮件发送了超过100个请求。

我做错了什么,我希望每条消息都能调用一次servlet,然后实际收到一封电子邮件!

我的appengine-web.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
  <application>bdl-mail-testing</application>
  <version>testing</version>
  <threadsafe>true</threadsafe>

  <inbound-services>
    <service>mail</service>
  </inbound-services>
</appengine-web-app>

我的web.xml文件中的Servlet部分:

<servlet>
  <servlet-name>mailhandler</servlet-name>
  <servlet-class>com.bdl.appengine.mailtesting.MailHandlerServlet</servlet-class>
</servlet>
<servlet-mapping>
  <servlet-name>mailhandler</servlet-name>
  <url-pattern>/_ah/mail/*</url-pattern>
</servlet-mapping>

<servlet>
  <servlet-name>messageviewer</servlet-name>
  <servlet-class>com.bdl.appengine.mailtesting.MessageViewerServlet</servlet-class>
</servlet>
<servlet-mapping>
  <servlet-name>messageviewer</servlet-name>
  <url-pattern>/*</url-pattern>
</servlet-mapping>

来自我的邮件处理程序servlet的相关方法。

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  Properties props = new Properties();
  Session session = Session.getDefaultInstance(props, null);
  try {
    MimeMessage message = new MimeMessage(session, req.getInputStream());
    String content = message.getContent().toString();
    recordMessage(message.getSubject(), content);
    replyTo(session, getFullPath(req), message);
  } catch (MessagingException ex) {
    log.log(Level.SEVERE, "An error occurred processing the message.", ex);
  }
}

private void replyTo(Session session, String path, Message message) throws MessagingException {
  Message msg = new MimeMessage(session);
  String subject = message.getSubject();
  if (!subject.toLowerCase().startsWith("re: ")) {
    subject = "RE: " + subject;
  }
  msg.setSubject(subject);
  msg.setFrom(new InternetAddress("mail@bdl-mail-testing.appspot.com"));
  msg.addRecipients(Message.RecipientType.TO, message.getFrom());
  Multipart multipart = new MimeMultipart();
  BodyPart part = new MimeBodyPart();
  // Add a response
  part.setText(String.format("I got your message!\n\nReceived at: %s\n\n", path));
  multipart.addBodyPart(part);
  part = new MimeBodyPart();
  part.setDataHandler(message.getDataHandler());
  multipart.addBodyPart(part);
  msg.setContent(multipart);

  log.log(Level.INFO, String.format("Replied to a message: %s", subject));
  Transport.send(message);
}

1 个答案:

答案 0 :(得分:0)

对不起,这是我自己的愚蠢。 最后一行回复是Transport.send(message);而不是正确的Transport.send(msg);因此,它不断向自己重新发送相同的消息,然后重新处理它。