Uses 590K of libraries. Click here for Pure Java version (436L/4K/11K).
1 | !752 |
2 | !1003225 // JavaMail |
3 | |
4 | import javax.mail.*; |
5 | import javax.mail.event.*; |
6 | import javax.mail.internet.*; |
7 | |
8 | /* |
9 | * Demo app that exercises the Message interfaces. |
10 | * Show information about and contents of messages. |
11 | * |
12 | * @author John Mani |
13 | * @author Bill Shannon |
14 | */ |
15 | |
16 | static String protocol; |
17 | static String host = null; |
18 | static String user = null; |
19 | static String password = null; |
20 | static String mbox = null; |
21 | static String url = null; |
22 | static int port = -1; |
23 | static boolean verbose = false; |
24 | static boolean debug = false; |
25 | static boolean showStructure = false; |
26 | static boolean showMessage = false; |
27 | static boolean showAlert = false; |
28 | static boolean saveAttachments = false; |
29 | static int attnum = 1; |
30 | |
31 | public static void main(String argv[]) { |
32 | int optind; |
33 | InputStream msgStream = System.in; |
34 | |
35 | for (optind = 0; optind < argv.length; optind++) { |
36 | if (argv[optind].equals("-T")) { |
37 | protocol = argv[++optind]; |
38 | } else if (argv[optind].equals("-H")) { |
39 | host = argv[++optind]; |
40 | } else if (argv[optind].equals("-U")) { |
41 | user = argv[++optind]; |
42 | } else if (argv[optind].equals("-P")) { |
43 | password = argv[++optind]; |
44 | } else if (argv[optind].equals("-v")) { |
45 | verbose = true; |
46 | } else if (argv[optind].equals("-D")) { |
47 | debug = true; |
48 | } else if (argv[optind].equals("-f")) { |
49 | mbox = argv[++optind]; |
50 | } else if (argv[optind].equals("-L")) { |
51 | url = argv[++optind]; |
52 | } else if (argv[optind].equals("-p")) { |
53 | port = Integer.parseInt(argv[++optind]); |
54 | } else if (argv[optind].equals("-s")) { |
55 | showStructure = true; |
56 | } else if (argv[optind].equals("-S")) { |
57 | saveAttachments = true; |
58 | } else if (argv[optind].equals("-m")) { |
59 | showMessage = true; |
60 | } else if (argv[optind].equals("-a")) { |
61 | showAlert = true; |
62 | } else if (argv[optind].equals("--")) { |
63 | optind++; |
64 | break; |
65 | } else if (argv[optind].startsWith("-")) { |
66 | System.out.println( |
67 | "Usage: msgshow [-L url] [-T protocol] [-H host] [-p port] [-U user]"); |
68 | System.out.println( |
69 | "\t[-P password] [-f mailbox] [msgnum ...] [-v] [-D] [-s] [-S] [-a]"); |
70 | System.out.println( |
71 | "or msgshow -m [-v] [-D] [-s] [-S] [-f msg-file]"); |
72 | System.exit(1); |
73 | } else { |
74 | break; |
75 | } |
76 | } |
77 | |
78 | try { |
79 | // Get a Properties object |
80 | Properties props = System.getProperties(); |
81 | |
82 | // Get a Session object |
83 | Session session = Session.getInstance(props, null); |
84 | session.setDebug(debug); |
85 | |
86 | if (showMessage) { |
87 | MimeMessage msg; |
88 | if (mbox != null) |
89 | msg = new MimeMessage(session, |
90 | new BufferedInputStream(new FileInputStream(mbox))); |
91 | else |
92 | msg = new MimeMessage(session, msgStream); |
93 | dumpPart(msg); |
94 | System.exit(0); |
95 | } |
96 | |
97 | // Get a Store object |
98 | Store store = null; |
99 | if (url != null) { |
100 | URLName urln = new URLName(url); |
101 | store = session.getStore(urln); |
102 | if (showAlert) { |
103 | store.addStoreListener(new StoreListener() { |
104 | public void notification(StoreEvent e) { |
105 | String s; |
106 | if (e.getMessageType() == StoreEvent.ALERT) |
107 | s = "ALERT: "; |
108 | else |
109 | s = "NOTICE: "; |
110 | System.out.println(s + e.getMessage()); |
111 | } |
112 | }); |
113 | } |
114 | store.connect(); |
115 | } else { |
116 | if (protocol != null) |
117 | store = session.getStore(protocol); |
118 | else |
119 | store = session.getStore(); |
120 | |
121 | // Connect |
122 | if (host != null || user != null || password != null) |
123 | store.connect(host, port, user, password); |
124 | else |
125 | store.connect(); |
126 | } |
127 | |
128 | |
129 | // Open the Folder |
130 | |
131 | Folder folder = store.getDefaultFolder(); |
132 | if (folder == null) { |
133 | System.out.println("No default folder"); |
134 | System.exit(1); |
135 | } |
136 | |
137 | if (mbox == null) |
138 | mbox = "INBOX"; |
139 | folder = folder.getFolder(mbox); |
140 | if (folder == null) { |
141 | System.out.println("Invalid folder"); |
142 | System.exit(1); |
143 | } |
144 | |
145 | // try to open read/write and if that fails try read-only |
146 | try { |
147 | folder.open(Folder.READ_WRITE); |
148 | } catch (MessagingException ex) { |
149 | folder.open(Folder.READ_ONLY); |
150 | } |
151 | int totalMessages = folder.getMessageCount(); |
152 | |
153 | if (totalMessages == 0) { |
154 | System.out.println("Empty folder"); |
155 | folder.close(false); |
156 | store.close(); |
157 | System.exit(1); |
158 | } |
159 | |
160 | if (verbose) { |
161 | int newMessages = folder.getNewMessageCount(); |
162 | System.out.println("Total messages = " + totalMessages); |
163 | System.out.println("New messages = " + newMessages); |
164 | System.out.println("-------------------------------"); |
165 | } |
166 | |
167 | if (optind >= argv.length) { |
168 | // Attributes & Flags for all messages .. |
169 | Message[] msgs = folder.getMessages(); |
170 | |
171 | // Use a suitable FetchProfile |
172 | FetchProfile fp = new FetchProfile(); |
173 | fp.add(FetchProfile.Item.ENVELOPE); |
174 | fp.add(FetchProfile.Item.FLAGS); |
175 | fp.add("X-Mailer"); |
176 | folder.fetch(msgs, fp); |
177 | |
178 | for (int i = 0; i < msgs.length; i++) { |
179 | System.out.println("--------------------------"); |
180 | System.out.println("MESSAGE #" + (i + 1) + ":"); |
181 | dumpEnvelope(msgs[i]); |
182 | // dumpPart(msgs[i]); |
183 | } |
184 | } else { |
185 | while (optind < argv.length) { |
186 | int msgnum = Integer.parseInt(argv[optind++]); |
187 | System.out.println("Getting message number: " + msgnum); |
188 | Message m = null; |
189 | |
190 | try { |
191 | m = folder.getMessage(msgnum); |
192 | dumpPart(m); |
193 | } catch (IndexOutOfBoundsException iex) { |
194 | System.out.println("Message number out of range"); |
195 | } |
196 | } |
197 | } |
198 | |
199 | folder.close(false); |
200 | store.close(); |
201 | } catch (Exception ex) { |
202 | System.out.println("Oops, got exception! " + ex.getMessage()); |
203 | ex.printStackTrace(); |
204 | System.exit(1); |
205 | } |
206 | System.exit(0); |
207 | } |
208 | |
209 | public static void dumpPart(Part p) throws Exception { |
210 | if (p instanceof Message) |
211 | dumpEnvelope((Message)p); |
212 | |
213 | /** Dump input stream .. |
214 | |
215 | InputStream is = p.getInputStream(); |
216 | // If "is" is not already buffered, wrap a BufferedInputStream |
217 | // around it. |
218 | if (!(is instanceof BufferedInputStream)) |
219 | is = new BufferedInputStream(is); |
220 | int c; |
221 | while ((c = is.read()) != -1) |
222 | System.out.write(c); |
223 | |
224 | **/ |
225 | |
226 | String ct = p.getContentType(); |
227 | try { |
228 | pr("CONTENT-TYPE: " + (new ContentType(ct)).toString()); |
229 | } catch (ParseException pex) { |
230 | pr("BAD CONTENT-TYPE: " + ct); |
231 | } |
232 | String filename = p.getFileName(); |
233 | if (filename != null) |
234 | pr("FILENAME: " + filename); |
235 | |
236 | /* |
237 | * Using isMimeType to determine the content type avoids |
238 | * fetching the actual content data until we need it. |
239 | */ |
240 | if (p.isMimeType("text/plain")) { |
241 | pr("This is plain text"); |
242 | pr("---------------------------"); |
243 | if (!showStructure && !saveAttachments) |
244 | System.out.println((String)p.getContent()); |
245 | } else if (p.isMimeType("multipart/*")) { |
246 | pr("This is a Multipart"); |
247 | pr("---------------------------"); |
248 | Multipart mp = (Multipart)p.getContent(); |
249 | level++; |
250 | int count = mp.getCount(); |
251 | for (int i = 0; i < count; i++) |
252 | dumpPart(mp.getBodyPart(i)); |
253 | level--; |
254 | } else if (p.isMimeType("message/rfc822")) { |
255 | pr("This is a Nested Message"); |
256 | pr("---------------------------"); |
257 | level++; |
258 | dumpPart((Part)p.getContent()); |
259 | level--; |
260 | } else { |
261 | if (!showStructure && !saveAttachments) { |
262 | /* |
263 | * If we actually want to see the data, and it's not a |
264 | * MIME type we know, fetch it and check its Java type. |
265 | */ |
266 | Object o = p.getContent(); |
267 | if (o instanceof String) { |
268 | pr("This is a string"); |
269 | pr("---------------------------"); |
270 | System.out.println((String)o); |
271 | } else if (o instanceof InputStream) { |
272 | pr("This is just an input stream"); |
273 | pr("---------------------------"); |
274 | InputStream is = (InputStream)o; |
275 | int c; |
276 | while ((c = is.read()) != -1) |
277 | System.out.write(c); |
278 | } else { |
279 | pr("This is an unknown type"); |
280 | pr("---------------------------"); |
281 | pr(o.toString()); |
282 | } |
283 | } else { |
284 | // just a separator |
285 | pr("---------------------------"); |
286 | } |
287 | } |
288 | |
289 | /* |
290 | * If we're saving attachments, write out anything that |
291 | * looks like an attachment into an appropriately named |
292 | * file. Don't overwrite existing files to prevent |
293 | * mistakes. |
294 | */ |
295 | if (saveAttachments && level != 0 && p instanceof MimeBodyPart && |
296 | !p.isMimeType("multipart/*")) { |
297 | String disp = p.getDisposition(); |
298 | // many mailers don't include a Content-Disposition |
299 | if (disp == null || disp.equalsIgnoreCase(Part.ATTACHMENT)) { |
300 | if (filename == null) |
301 | filename = "Attachment" + attnum++; |
302 | pr("Saving attachment to file " + filename); |
303 | try { |
304 | File f = new File(filename); |
305 | if (f.exists()) |
306 | // XXX - could try a series of names |
307 | throw new IOException("file exists"); |
308 | ((MimeBodyPart)p).saveFile(f); |
309 | } catch (IOException ex) { |
310 | pr("Failed to save attachment: " + ex); |
311 | } |
312 | pr("---------------------------"); |
313 | } |
314 | } |
315 | } |
316 | |
317 | public static void dumpEnvelope(Message m) throws Exception { |
318 | pr("This is the message envelope"); |
319 | pr("---------------------------"); |
320 | Address[] a; |
321 | // FROM |
322 | if ((a = m.getFrom()) != null) { |
323 | for (int j = 0; j < a.length; j++) |
324 | pr("FROM: " + a[j].toString()); |
325 | } |
326 | |
327 | // REPLY TO |
328 | if ((a = m.getReplyTo()) != null) { |
329 | for (int j = 0; j < a.length; j++) |
330 | pr("REPLY TO: " + a[j].toString()); |
331 | } |
332 | |
333 | // TO |
334 | if ((a = m.getRecipients(Message.RecipientType.TO)) != null) { |
335 | for (int j = 0; j < a.length; j++) { |
336 | pr("TO: " + a[j].toString()); |
337 | InternetAddress ia = (InternetAddress)a[j]; |
338 | if (ia.isGroup()) { |
339 | InternetAddress[] aa = ia.getGroup(false); |
340 | for (int k = 0; k < aa.length; k++) |
341 | pr(" GROUP: " + aa[k].toString()); |
342 | } |
343 | } |
344 | } |
345 | |
346 | // SUBJECT |
347 | pr("SUBJECT: " + m.getSubject()); |
348 | |
349 | // DATE |
350 | Date d = m.getSentDate(); |
351 | pr("SendDate: " + |
352 | (d != null ? d.toString() : "UNKNOWN")); |
353 | |
354 | // FLAGS |
355 | Flags flags = m.getFlags(); |
356 | StringBuffer sb = new StringBuffer(); |
357 | Flags.Flag[] sf = flags.getSystemFlags(); // get the system flags |
358 | |
359 | boolean first = true; |
360 | for (int i = 0; i < sf.length; i++) { |
361 | String s; |
362 | Flags.Flag f = sf[i]; |
363 | if (f == Flags.Flag.ANSWERED) |
364 | s = "\\Answered"; |
365 | else if (f == Flags.Flag.DELETED) |
366 | s = "\\Deleted"; |
367 | else if (f == Flags.Flag.DRAFT) |
368 | s = "\\Draft"; |
369 | else if (f == Flags.Flag.FLAGGED) |
370 | s = "\\Flagged"; |
371 | else if (f == Flags.Flag.RECENT) |
372 | s = "\\Recent"; |
373 | else if (f == Flags.Flag.SEEN) |
374 | s = "\\Seen"; |
375 | else |
376 | continue; // skip it |
377 | if (first) |
378 | first = false; |
379 | else |
380 | sb.append(' '); |
381 | sb.append(s); |
382 | } |
383 | |
384 | String[] uf = flags.getUserFlags(); // get the user flag strings |
385 | for (int i = 0; i < uf.length; i++) { |
386 | if (first) |
387 | first = false; |
388 | else |
389 | sb.append(' '); |
390 | sb.append(uf[i]); |
391 | } |
392 | pr("FLAGS: " + sb.toString()); |
393 | |
394 | // X-MAILER |
395 | String[] hdrs = m.getHeader("X-Mailer"); |
396 | if (hdrs != null) |
397 | pr("X-Mailer: " + hdrs[0]); |
398 | else |
399 | pr("X-Mailer NOT available"); |
400 | } |
401 | |
402 | static String indentStr = " "; |
403 | static int level = 0; |
404 | |
405 | /** |
406 | * Print a, possibly indented, string. |
407 | */ |
408 | public static void pr(String s) { |
409 | if (showStructure) |
410 | System.out.print(indentStr.substring(0, level * 2)); |
411 | System.out.println(s); |
412 | } |
download show line numbers debug dex old transpilations
Travelled to 14 computer(s): aoiabmzegqzx, bhatertpkbcr, cbybwowwnfue, cfunsshuasjs, gwrvuhgaqvyk, ishqpsrjomds, lpdgvwnxivlt, mqqgnosmbjvj, onxytkatvevr, pyentgdyhuwx, pzhvpgtvlbxg, tslmcundralx, tvejysmllsmz, vouqrxazstgt
No comments. add comment
Snippet ID: | #1003228 |
Snippet name: | msgshow (JavaMail example) |
Eternal ID of this version: | #1003228/1 |
Text MD5: | ef569ed35fbf1986bd96729df0e714fa |
Transpilation MD5: | a7329e71df9444c9429be723f8b25882 |
Author: | stefan |
Category: | javax |
Type: | JavaX source code |
Public (visible to everyone): | Yes |
Archived (hidden from active list): | No |
Created/modified: | 2016-06-03 04:28:15 |
Source code size: | 11384 bytes / 412 lines |
Pitched / IR pitched: | No / No |
Views / Downloads: | 613 / 608 |
Referenced in: | [show references] |