package webmail;
import java.io.IOException;
import java.text.SimpleDateFormat;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpUtils;
import org.runningman.mailutilities.BufferedMessage;
import org.runningman.mailutilities.Credentials;
import org.runningman.mailutilities.MailConnector;
@WebServlet(name = "MailServlet", urlPatterns = {"/mail"})
public class MailServlet extends HttpServlet {
private MailConnector connector;
private Message[] messages;
/**
* This method handles the "POST" submission from two forms: the login
* form and the message compose form. The login form has the following
* parameters:
* <code>hostname</code>,
* <code>username</code>, and
* <code>password</code>. The
* <code>send</code> parameter denotes that the method is processing the
* compose form submission.
*/
@Override
public void doPost(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
Credentials credentials = new Credentials();
String host = req.getParameter("hostname");
credentials.setHost(host);
String user = req.getParameter("username");
credentials.setUser(user);
String password = req.getParameter("password");
credentials.setPassword(password);
credentials.setPort(993);
ServletOutputStream out = res.getOutputStream();
res.setContentType("text/html");
res.setCharacterEncoding("UTF-8");
out.println("<html><body bgcolor=\"#CCCCFF\">");
try {
this.connector = new MailConnector();
this.connector.setCredentials(credentials);
this.connector.setFolder("inbox");
this.connector.connect();
this.messages = this.connector.retrieveUnreadMessages();
int totalMessages = messages.length;
// splash
out.print("<center>");
out.print("<font face=\"Arial,Helvetica\" font size=+3>");
out.println("<b>Welcome to JavaMail Demo program!</b></font></center><p>");
// folder table
out.println("<table width=\"50%\" border=0 align=center>");
// folder name column header
out.print("<tr><td width=\"75%\" bgcolor=\"#ffffcc\">");
out.print("<font face=\"Arial,Helvetica\" font size=-1>");
out.println("<b>FolderName</b></font></td><br>");
// msg count column header
out.print("<td width=\"25%\" bgcolor=\"#ffffcc\">");
out.print("<font face=\"Arial,Helvetica\" font size=-1>");
out.println("<b>Messages</b></font></td><br>");
out.println("</tr>");
// folder name
out.print("<tr><td width=\"75%\" bgcolor=\"#ffffff\">");
out.print("<a href=\"" + HttpUtils.getRequestURL(req) + "\">" +
"Inbox" + "</a></td><br>");
// msg count
out.println("<td width=\"25%\" bgcolor=\"#ffffff\">"
+ totalMessages + "</td>");
out.println("</tr>");
out.println("</table");
} catch (Exception ex) {
out.println(ex.toString());
ex.printStackTrace();
} finally {
out.println("</body></html>");
out.close();
}
}
/**
* This method handles the GET requests for the client.
*/
@Override
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
ServletOutputStream out = res.getOutputStream();
// get url parameters
String msgStr = req.getParameter("message");
String logout = req.getParameter("logout");
String part = req.getParameter("part");
int msgNum = -1;
int partNum = -1;
// process url params
if (msgStr != null) {
// operate on message "msgStr"
msgNum = Integer.parseInt(msgStr);
if (part == null) {
// display message "msgStr"
res.setContentType("text/html");
res.setCharacterEncoding("UTF-8");
displayMessage(req, out, msgNum);
}
} else if (logout != null) {
// process logout
try {
this.connector.disconnect();
out.println("<html><body>Logged out OK</body></html>");
} catch (MessagingException mex) {
out.println(mex.toString());
}
} else {
// display headers
displayHeaders(out);
}
}
/* main method to display messages */
private void displayMessage(HttpServletRequest req,
ServletOutputStream out, int msgNum)
throws IOException {
out.println("<html>");
out.println("<HEAD><META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html;CHARSET=utf-8\"><TITLE>JavaMail Servlet</TITLE></HEAD>");
out.println("<BODY bgcolor=\"#ccccff\">");
out.print("<center><font face=\"Arial,Helvetica\" ");
out.println("font size=\"+3\"><b>");
try {
Message msg = this.messages[msgNum];
BufferedMessage buffer = new BufferedMessage();
buffer.setMessage(msg);
displayMessageHeaders(buffer, out);
String content = buffer.getContent();
out.println(content);
} catch (Exception exception) {
out.println(exception.toString());
}
out.println("</BODY></html>");
out.flush();
out.close();
}
/**
* This is a utility message that pretty-prints the message headers for
* message that is being displayed.
*/
private void displayMessageHeaders(BufferedMessage message, ServletOutputStream out)
throws IOException {
try {
out.println("<b>Date:</b> " + message.getReceivedDate() + "<br>");
out.print("<b>From:</b> ");
out.print(message.getSenders());
out.println("<br>");
out.print("<b>To:</b> ");
out.print(message.getRecipients());
out.println("<br>");
out.print("<b>Subject:</b> "
+ message.getSubject()
+ "<br>");
} catch (MessagingException mex) {
out.println(message.toString());
}
}
/**
* This method displays the URL's for the available commands and the
* INBOX headerlist
*/
private void displayHeaders(ServletOutputStream out)
throws IOException {
SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy");
out.println("<html>");
out.println("<HEAD><TITLE>JavaMail Servlet</TITLE></HEAD>");
out.println("<BODY bgcolor=\"#ccccff\"><hr>");
out.print("<center><font face=\"Arial,Helvetica\" font size=\"+3\">");
// URL's for the commands that are available
out.println("<font face=\"Arial,Helvetica\" font size=\"+3\"><b>");
out.println("<a href=\""
+ "?logout=true\">Logout</a>");
out.println("</b></font>");
out.println("<hr>");
// List headers in a table
out.print("<table cellpadding=1 cellspacing=1 "); // table
out.println("width=\"100%\" border=1>"); // settings
// sender column header
out.println("<tr><td width=\"25%\" bgcolor=\"ffffcc\">");
out.println("<font face=\"Arial,Helvetica\" font size=\"+1\">");
out.println("<b>Sender</b></font></td>");
// date column header
out.println("<td width=\"15%\" bgcolor=\"ffffcc\">");
out.println("<font face=\"Arial,Helvetica\" font size=\"+1\">");
out.println("<b>Date</b></font></td>");
// subject column header
out.println("<td bgcolor=\"ffffcc\">");
out.println("<font face=\"Arial,Helvetica\" font size=\"+1\">");
out.println("<b>Subject</b></font></td></tr>");
try {
int msgCount = this.messages.length;
// for each message, show its headers
for (int i = 0; i < msgCount; i++) {
Message m = this.messages[i];
BufferedMessage buffer = new BufferedMessage();
buffer.setMessage(m);
// from
out.println("<tr valigh=middle>");
out.print("<td width=\"25%\" bgcolor=\"ffffff\">");
out.println("<font face=\"Arial,Helvetica\">"
+ buffer.getSenders()
+ "</font></td>");
// date
out.print("<td nowrap width=\"15%\" bgcolor=\"ffffff\">");
out.println("<font face=\"Arial,Helvetica\">"
+ df.format(buffer.getReceivedDate())
+ "</font></td>");
// subject & link
out.print("<td bgcolor=\"ffffff\">");
out.println("<font face=\"Arial,Helvetica\">"
+ "<a href=\""
+ "?message="
+ i + "\">"
+ buffer.getSubject()
+ "</a>"
+ "</font></td>");
out.println("</tr>");
}
} catch (MessagingException mex) {
out.println("<tr><td>" + mex.toString() + "</td></tr>");
}
out.println("</table>");
out.println("</BODY></html>");
out.flush();
out.close();
}
@Override
public String getServletInfo() {
return "A mail reader servlet";
}
}