要接收电子邮件退信通知,您需要将应用配置为启用退信通知,并需要在应用中处理传入通知。
配置应用以接收电子邮件退信通知
默认情况下,应用不接收无法递送的电子邮件的退信通知。要启用传入退信通知服务,您需要修改应用的 appengine-web.xml
和 web.xml
配置文件。
通过添加 inbound-services
部分修改 appengine-web.xml
,以启用传入退信服务:
<inbound-services>
<!-- Used to handle incoming mail. -->
<service>mail</service>
<!-- Used to handle bounced mail notifications. -->
<service>mail_bounce</service>
</inbound-services>
通过将退信网址 /_ah/bounce
映射到退信处理 Servlet 来修改 web.xml
,如下所示:
<servlet>
<servlet-name>bouncehandler</servlet-name>
<servlet-class>com.example.appengine.mail.BounceHandlerServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>bouncehandler</servlet-name>
<url-pattern>/_ah/bounce</url-pattern>
</servlet-mapping>
<security-constraint>
<web-resource-collection>
<web-resource-name>bounce</web-resource-name>
<url-pattern>/_ah/bounce</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>admin</role-name>
</auth-constraint>
</security-constraint>
处理退信通知
JavaMail API 包含 BounceNotificationParser 类,此类用于解析如下所示的传入退信通知:
import com.google.appengine.api.mail.BounceNotification;
import com.google.appengine.api.mail.BounceNotificationParser;
import java.io.IOException;
import java.util.logging.Logger;
import javax.mail.MessagingException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class BounceHandlerServlet extends HttpServlet {
private static final Logger log = Logger.getLogger(BounceHandlerServlet.class.getName());
@Override
public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
try {
BounceNotification bounce = BounceNotificationParser.parse(req);
log.warning("Bounced email notification.");
// The following data is available in a BounceNotification object
// bounce.getOriginal().getFrom()
// bounce.getOriginal().getTo()
// bounce.getOriginal().getSubject()
// bounce.getOriginal().getText()
// bounce.getNotification().getFrom()
// bounce.getNotification().getTo()
// bounce.getNotification().getSubject()
// bounce.getNotification().getText()
// ...
} catch (MessagingException e) {
// ...
}
}
}