2013-09-29 21 views
0

首次嘗試使用appengine郵件API。我構建了一個響應電子郵件的servlet。下面包含了我的web.xml文件和servlet類的相關摘錄。 然而,這個問題是我在測試@ [appid] .appspotmail.com發送一封電子郵件到應用程序後發生以下兩種情況: 1.記錄了許多日誌條目,用於處理servlet的請求,我的郵件配額已經達到了。 1/2小時後,我仍然看到有失敗的新日誌條目在AppEngine中收到郵件時的多個請求

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的部分從我的web.xml文件:

<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("[email protected]")); 
    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

你有一個免費的配額每天發送100封郵件。您顯然已達到該配額,因此您現在正在收到此錯誤。但在你達到配額之前,你必須得到一種不同的例外,對吧? –

+0

我明白我爲什麼現在得到這個錯誤。問題是爲什麼發送到appspotmail.com地址的單個消息導致請求被重複發送到我的處理程序servlet。在這種情況下預計配額錯誤,但情況本身是沒有意義的。有趣的是,我試着發表評論以實際發送回覆郵件並重新上傳。之後,我在日誌中再添加一個條目來處理一條消息(由於發送時沒有錯誤,它以ok狀態結束),然後停止。 –

+0

,並回答這個問題,不,在配額問題之前,日誌中沒有其他錯誤。有些東西只是導致一個原始的消息被處理很多次......我想我只是一個白癡,可能已經找到了問題...... –

回答

0

對不起,這是我自己的愚蠢。 replyTo的最後一行是Transport.send(message);而不是正確的Transport.send(msg);因此,它不斷地重發相同的消息給自己,然後重新處理它。

相關問題