Ну ... Попробовав каждое возможное решение / отображение URL, я выбрал быстрый и уродливый вариант.
Суть в том, чтобы иметь один почтовый сервлет "перехватить все", чтобы он работал в качестве диспетчера для других,конкретные, сервлеты.Это как гигант switch
, где параметром является URL-адрес запроса.
Это НЕ то, что я хотел, но он работает и, кажется, единственный, который делает.
У меня есть один сервлет IncomingMail
, который обрабатывает ВСЕ входящие письма.period.
Итак, теперь единственное сопоставление URL-адресов в /_ah/mail/
выглядит следующим образом:
<servlet>
<servlet-name>IncomingMail</servlet-name>
<servlet-class>IncomingMail</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>IncomingMail</servlet-name>
<url-pattern>/_ah/mail/*</url-pattern>
</servlet-mapping>
Кроме того, у меня есть следующий сервлет, отображенный как "plain-old-servlet":
(обратите внимание на <url-pattern>
, а не на сервлет с отображением почты)
<servlet>
<servlet-name>GetUserMail</servlet-name>
<servlet-class>GetUserMail</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>GetUserMail</servlet-name>
<url-pattern>/serv/userMail</url-pattern>
</servlet-mapping>
Универсальный сервлет (в конечном итоге) будет выглядеть как гигантский переключатель:
public class IncomingMail extends HttpServlet {
private final String USER_MAIL_PREFIX="http://appid.appspot.com/_ah/mail/user.";
private final String USER_MAIL_SERVLET="/serv/userMail";
...
public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
String url = req.getRequestURL().toString();
System.out.println("IncomingMail called, with URL: "+url);
String email;
String servlet;
if (url.startsWith(USER_MAIL_PREFIX)) {
email=url.replace(USER_MAIL_PREFIX, "");
servlet=USER_MAIL_SERVLET;
}//userMail
if (url.startsWith(OTHER_PREFIX)) {
//Redirect to OTHER servlet
}
...
System.out.println("forward to '"+servlet+"', with email '"+email+"'");
RequestDispatcher dispatcher=req.getRequestDispatcher(servlet);
try {
req.setAttribute("email", email);
dispatcher.forward(req, resp);
} catch (ServletException e) {
System.err.println(e);
}
}
}
Сервлет-адресат (в данном случае GetUserMail
) делает getRequestParameter("email")
, чтобы увидеть конкретный конечный почтовый ящик.
Он будет получать все письма, отправленные на 'user.%un%@appid.appspotmail.com',где% un% - это имя пользователя в пространстве приложения.
Параметр электронной почты, полученный сервлетом, будет иметь форму «%un%@appid.appspotmail.com» без префиксного имени.
Каждый такой »конкретный «сервлет» получит «свою вырезку» из сервлета диспетчера почты с параметром электронной почты, уже не имеющим префикса распознавания.
Одна заметка, которую я добавлю под защитой:
Если вы беспокоитесь о фальшивкезапросы к «конкретным сервлетам», просто определите их все под общим virtual namespace скажет /servmail/
на вашем сайте и определит новый <security-constraint>
, чтобы запросы могли отправляться только внутри самого приложения.
Примерно так (внутри web.xml
):
<security-constraint>
<web-resource-collection>
<web-resource-name>MailServlets</web-resource-name>
<description>policy for specific mail servlets</description>
<url-pattern>/servmail/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>admin</role-name>
</auth-constraint>
</security-constraint>
БудетЯ до сих пор люблю слышать от кого-то, что пытался и пытался сделать подстановочный знак <url-pattern>
сопоставление почты, кроме универсального.