]> git.argeo.org Git - gpl/argeo-slc.git/blob - org.argeo.slc.mail/src/org/argeo/slc/mail/EmailUtils.java
Introduce email migration tool
[gpl/argeo-slc.git] / org.argeo.slc.mail / src / org / argeo / slc / mail / EmailUtils.java
1 package org.argeo.slc.mail;
2
3 import java.util.Date;
4
5 import javax.mail.Address;
6 import javax.mail.Flags;
7 import javax.mail.Message;
8 import javax.mail.MessagingException;
9 import javax.mail.internet.InternetAddress;
10 import javax.mail.internet.MimeMessage;
11
12 /** Utilities around emails. */
13 public class EmailUtils {
14 public final static String INBOX = "Inbox";
15 public final static String MESSAGE_ID = "Message-ID";
16
17 public static String getMessageId(Message msg) {
18 try {
19 return msg instanceof MimeMessage ? ((MimeMessage) msg).getMessageID() : "<N/A>";
20 } catch (MessagingException e) {
21 throw new IllegalStateException("Cannot extract message id from " + msg, e);
22 }
23 }
24
25 public static String describe(Message msg) {
26 try {
27 return "Message " + msg.getMessageNumber() + " " + msg.getSentDate().toInstant() + " " + getMessageId(msg);
28 } catch (MessagingException e) {
29 throw new IllegalStateException("Cannot describe " + msg, e);
30 }
31 }
32
33 static void setHeadersFromFlags(MimeMessage msg, Flags flags) {
34 try {
35 StringBuilder status = new StringBuilder();
36 if (flags.contains(Flags.Flag.SEEN))
37 status.append('R');
38 if (!flags.contains(Flags.Flag.RECENT))
39 status.append('O');
40 if (status.length() > 0)
41 msg.setHeader("Status", status.toString());
42 else
43 msg.removeHeader("Status");
44
45 boolean sims = false;
46 String s = msg.getHeader("X-Status", null);
47 // is it a SIMS 2.0 format X-Status header?
48 sims = s != null && s.length() == 4 && s.indexOf('$') >= 0;
49 //status.setLength(0);
50 if (flags.contains(Flags.Flag.DELETED))
51 status.append('D');
52 else if (sims)
53 status.append('$');
54 if (flags.contains(Flags.Flag.FLAGGED))
55 status.append('F');
56 else if (sims)
57 status.append('$');
58 if (flags.contains(Flags.Flag.ANSWERED))
59 status.append('A');
60 else if (sims)
61 status.append('$');
62 if (flags.contains(Flags.Flag.DRAFT))
63 status.append('T');
64 else if (sims)
65 status.append('$');
66 if (status.length() > 0)
67 msg.setHeader("X-Status", status.toString());
68 else
69 msg.removeHeader("X-Status");
70
71 String[] userFlags = flags.getUserFlags();
72 if (userFlags.length > 0) {
73 status.setLength(0);
74 for (int i = 0; i < userFlags.length; i++)
75 status.append(userFlags[i]).append(' ');
76 status.setLength(status.length() - 1); // smash trailing space
77 msg.setHeader("X-Keywords", status.toString());
78 }
79 if (flags.contains(Flags.Flag.DELETED)) {
80 s = msg.getHeader("X-Dt-Delete-Time", null);
81 if (s == null)
82 // XXX - should be time
83 msg.setHeader("X-Dt-Delete-Time", "1");
84 }
85 } catch (MessagingException e) {
86 // ignore it
87 }
88 }
89
90 protected static String getUnixFrom(MimeMessage msg) {
91 Address[] afrom;
92 String from;
93 Date ddate;
94 String date;
95 try {
96 if ((afrom = msg.getFrom()) == null ||
97 !(afrom[0] instanceof InternetAddress) ||
98 (from = ((InternetAddress)afrom[0]).getAddress()) == null)
99 from = "UNKNOWN";
100 if ((ddate = msg.getReceivedDate()) == null ||
101 (ddate = msg.getSentDate()) == null)
102 ddate = new Date();
103 } catch (MessagingException e) {
104 from = "UNKNOWN";
105 ddate = new Date();
106 }
107 date = ddate.toString();
108 // date is of the form "Sat Aug 12 02:30:00 PDT 1995"
109 // need to strip out the timezone
110 return "From " + from + " " +
111 date.substring(0, 20) + date.substring(24);
112 }
113
114 /** Singleton. */
115 private EmailUtils() {
116 }
117 }