Integrate Email migration
[gpl/argeo-suite.git] / org.argeo.app.core / src / org / argeo / app / mail / EmailUtils.java
diff --git a/org.argeo.app.core/src/org/argeo/app/mail/EmailUtils.java b/org.argeo.app.core/src/org/argeo/app/mail/EmailUtils.java
new file mode 100644 (file)
index 0000000..694c17c
--- /dev/null
@@ -0,0 +1,118 @@
+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() : "<N/A>";
+               } 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() {
+       }
+}