package org.argeo.app.mail; import java.util.Date; import javax.mail.Address; import javax.mail.Flags; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; /** Utilities around emails. */ public class EmailUtils { public final static String INBOX = "Inbox"; public final static String INBOX_UPPER_CASE = "INBOX"; public final static String MESSAGE_ID = "Message-ID"; public static String getMessageId(Message msg) { try { return msg instanceof MimeMessage ? ((MimeMessage) msg).getMessageID() : ""; } catch (MessagingException e) { throw new IllegalStateException("Cannot extract message id from " + msg, e); } } public static String describe(Message msg) { try { return "Message " + msg.getMessageNumber() + " " + msg.getSentDate().toInstant() + " " + getMessageId(msg); } catch (MessagingException e) { throw new IllegalStateException("Cannot describe " + msg, e); } } static void setHeadersFromFlags(MimeMessage msg, Flags flags) { try { StringBuilder status = new StringBuilder(); if (flags.contains(Flags.Flag.SEEN)) status.append('R'); if (!flags.contains(Flags.Flag.RECENT)) status.append('O'); if (status.length() > 0) msg.setHeader("Status", status.toString()); else msg.removeHeader("Status"); boolean sims = false; String s = msg.getHeader("X-Status", null); // is it a SIMS 2.0 format X-Status header? sims = s != null && s.length() == 4 && s.indexOf('$') >= 0; //status.setLength(0); if (flags.contains(Flags.Flag.DELETED)) status.append('D'); else if (sims) status.append('$'); if (flags.contains(Flags.Flag.FLAGGED)) status.append('F'); else if (sims) status.append('$'); if (flags.contains(Flags.Flag.ANSWERED)) status.append('A'); else if (sims) status.append('$'); if (flags.contains(Flags.Flag.DRAFT)) status.append('T'); else if (sims) status.append('$'); if (status.length() > 0) msg.setHeader("X-Status", status.toString()); else msg.removeHeader("X-Status"); String[] userFlags = flags.getUserFlags(); if (userFlags.length > 0) { status.setLength(0); for (int i = 0; i < userFlags.length; i++) status.append(userFlags[i]).append(' '); status.setLength(status.length() - 1); // smash trailing space msg.setHeader("X-Keywords", status.toString()); } if (flags.contains(Flags.Flag.DELETED)) { s = msg.getHeader("X-Dt-Delete-Time", null); if (s == null) // XXX - should be time msg.setHeader("X-Dt-Delete-Time", "1"); } } catch (MessagingException e) { // ignore it } } protected static String getUnixFrom(MimeMessage msg) { Address[] afrom; String from; Date ddate; String date; try { if ((afrom = msg.getFrom()) == null || !(afrom[0] instanceof InternetAddress) || (from = ((InternetAddress)afrom[0]).getAddress()) == null) from = "UNKNOWN"; if ((ddate = msg.getReceivedDate()) == null || (ddate = msg.getSentDate()) == null) ddate = new Date(); } catch (MessagingException e) { from = "UNKNOWN"; ddate = new Date(); } date = ddate.toString(); // date is of the form "Sat Aug 12 02:30:00 PDT 1995" // need to strip out the timezone return "From " + from + " " + date.substring(0, 20) + date.substring(24); } /** Singleton. */ private EmailUtils() { } }