0

第一次尝试 appengine 邮件 API。我构建了一个响应电子邮件的 servlet。下面包括我的 web.xml 文件和 servlet 类的相关摘录。然而,问题是,在我通过 testing@[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.

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

此外,recordMessage我的 servlet 中有一个方法可以为每个邮件请求保存数据存储中的一个实体,以便我可以查看它们。我的查看器 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);
}
4

1 回答 1

0

对不起大家,这是我自己的愚蠢。最后一行replyToTransport.send(message);不是正确Transport.send(msg); 的结果,它不断地向自己重新发送相同的消息,然后重新处理它。

于 2013-09-30T16:01:29.160 回答