第一次尝试使用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);
}
答案 0 :(得分:0)
对不起,这是我自己的愚蠢。
最后一行回复是Transport.send(message);
而不是正确的Transport.send(msg);
因此,它不断向自己重新发送相同的消息,然后重新处理它。