Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在AppEngine中接收邮件时出现多个请求_Java_Google App Engine_Jakarta Mail - Fatal编程技术网

Java 在AppEngine中接收邮件时出现多个请求

Java 在AppEngine中接收邮件时出现多个请求,java,google-app-engine,jakarta-mail,Java,Google App Engine,Jakarta Mail,第一次尝试appengine邮件api。我构建了一个响应电子邮件的servlet。下面是我的web.xml文件和servlet类的相关摘录。 但是,问题是,在我在testing@[appid].appspotmail.com向应用程序发送了一封电子邮件后,发生了以下两种情况: 1.记录了许多向handler servlet发出的请求的日志条目,并且达到了当天的邮件配额。1/2小时后,我仍然看到新的失败日志条目 Uncaught exception from servlet com.google.

第一次尝试appengine邮件api。我构建了一个响应电子邮件的servlet。下面是我的web.xml文件和servlet类的相关摘录。 但是,问题是,在我在testing@[appid].appspotmail.com向应用程序发送了一封电子邮件后,发生了以下两种情况: 1.记录了许多向handler 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>
<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>

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

您每天可以免费发送100封邮件。很明显,您已达到该配额,因此您现在遇到此错误。但在你达到这个限额之前,你一定得到了另一种例外,对吗?我明白为什么我现在会得到这个错误。问题是为什么发送到appspotmail.com地址的单个消息会导致请求被重复发送到我的处理程序servlet。在这种情况下,配额错误是意料之中的,但这种情况本身毫无意义。有趣的是,我试着对这一行进行评论,以实际发送回复电子邮件并重新上传。之后,我在日志中还有一个条目用于处理消息(发送时没有错误,状态为ok),然后它们停止。并且,为了回答这个问题,没有,在配额问题之前,日志中没有其他错误。某种原因导致一条原始消息被多次处理。。。。我想我只是个白痴,可能发现了问题。。。
@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);
}