Program: MailReaderBean

Example 19-10 shows the complete MailReaderBean program. As the name implies, it can be used as a bean in larger programs, but also has a main method for standalone use. Clicking on a message displays it in the message view part of the window; this is handled by the TreeSelectionListener called tsl.

Example 19-10. MailReaderBean.java

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.tree.*;
import javax.swing.event.*;
import javax.mail.*;
import javax.mail.internet.*;

/**
 * Display a mailbox or mailboxes.
 * This is the generic version in javasrc/email, split off from
 * JabaDex because of the latter's domain-specific "implements module" stuff.

 */
public class MailReaderBean extends JSplitPane {

    private JTextArea bodyText;

    /* Construct a mail reader bean with all defaults.
     */
    public MailReaderBean(  ) throws Exception {
        this("smtp", "mailhost", "user", "nopasswd", "/");
    }

    /* Construct a mail reader bean with all values. */
    public MailReaderBean(
        String protocol,
        String host,
        String user,
        String password,
        String rootName)
    throws Exception {

        super(VERTICAL_SPLIT);

        boolean recursive = false;

        // Start with a Mail Session object
        Session session = Session.getDefaultInstance(
            System.getProperties(  ), null);
        session.setDebug(false);

        // Get a Store object for the given protocol
        Store store = session.getStore(protocol);
        store.connect(host, user, password);

        // Get Folder object for root, and list it
        // If root name = "", getDefaultFolder(  ), else getFolder(root)
        FolderNode top;
        if (rootName.length(  ) != 0) {
            // System.out.println("Getting folder " + rootName + ".");
            top = new FolderNode(store.getFolder(rootName));
        } else {
            // System.out.println("Getting default folder.");
            top = new FolderNode(store.getDefaultFolder(  ));
        }
        if (top == null || !top.f.exists(  )) {
            System.out.println("Invalid folder " + rootName);
            return;
        }

        if (top.f.getType(  ) == Folder.HOLDS_FOLDERS) {
            Folder[] f = top.f.list(  );
            for (int i = 0; i < f.length; i++)
                listFolder(top, new FolderNode(f[i]), recursive);
        } else
                listFolder(top, top, false);

        // Now that (all) the foldernodes and treenodes are in,
        // construct a JTree object from the top of the list down,
        // make the JTree scrollable (put in JScrollPane),
        // and add it as the MailComposeBean's Northern child.
        JTree tree = new JTree(top);
        JScrollPane treeScroller = new JScrollPane(tree);
        treeScroller.setBackground(tree.getBackground(  ));
        this.setTopComponent(treeScroller);

        // The Southern (Bottom) child is a textarea to display the msg.
        bodyText = new JTextArea(15, 80);
        this.setBottomComponent(new JScrollPane(bodyText));

        // Add a notification listener for the tree; this will
        // display the clicked-upon message
        TreeSelectionListener tsl = new TreeSelectionListener(  ) {
            public void valueChanged(TreeSelectionEvent evt) {
                Object[] po = evt.getPath().getPath(  );    // yes, repeat it.
                Object o = po[po.length - 1];    // last node in path
                if (o instanceof FolderNode) {
                    // System.out.println("Select folder " + o.toString(  ));
                    return;
                }
                if (o instanceof MessageNode) {
                    bodyText.setText("");
                    try {
                        Message m = ((MessageNode)o).m;

                        bodyText.append("To: ");
                        Object[] tos = m.getAllRecipients(  );
                        for (int i=0; i<tos.length; i++) {
                            bodyText.append(tos[i].toString(  ));
                            bodyText.append(" ");
                        }
                        bodyText.append("
");

                        bodyText.append("Subject: " + m.getSubject(  ) + "
");
                        bodyText.append("From: ");
                        Object[] froms = m.getFrom(  );
                        for (int i=0; i<froms.length; i++) {
                            bodyText.append(froms[i].toString(  ));
                            bodyText.append(" ");
                        }
                        bodyText.append("
");

                        bodyText.append("Date: " + m.getSentDate(  ) + "
");
                        bodyText.append("
");

                        bodyText.append(m.getContent().toString(  ));

                        // Start reading at top of message(!)
                        bodyText.setCaretPosition(0);
                    } catch (Exception e) {
                        bodyText.append(e.toString(  ));
                    }
                } else 
                    System.err.println("UNEXPECTED SELECTION: " + o.getClass(  ));
            }
        };
        tree.addTreeSelectionListener(tsl);
    }

    static void listFolder(FolderNode top, FolderNode folder, boolean recurse)
    throws Exception {
        // System.out.println(folder.f.getName() + folder.f.getFullName(  ));
        if ((folder.f.getType(  ) & Folder.HOLDS_MESSAGES) != 0) {
            Message[] msgs = folder.f.getMessages(  );
            for (int i=0; i<msgs.length; i++) {
                MessageNode m = new MessageNode(msgs[i]);
                Address from = m.m.getFrom(  )[0];
                String fromAddress;
                if (from instanceof InternetAddress)
                    fromAddress = ((InternetAddress)from).getAddress(  );
                else
                    fromAddress = from.toString(  );
                top.add(new MessageNode(msgs[i]));
            }
        }
        if ((folder.f.getType(  ) & Folder.HOLDS_FOLDERS) != 0) {
            if (recurse) {
                Folder[] f = folder.f.list(  );
                for (int i=0; i < f.length; i++)
                    listFolder(new FolderNode(f[i]), top, recurse);
                }
        }
    }

    /* Test unit - main program */
    public static void main(String[] args) throws Exception {
        final JFrame jf = new JFrame("MailReaderBean");
        String mbox = "/var/mail/ian";
        if (args.length > 0)
            mbox = args[0];
        MailReaderBean mb = new MailReaderBean("mbox", "localhost",
            "", "", mbox);
        jf.getContentPane(  ).add(mb);
        jf.setSize(640,480);
        jf.setVisible(true);
        jf.addWindowListener(new WindowAdapter(  ) {
            public void windowClosing(WindowEvent e) {
            jf.setVisible(false);
            jf.dispose(  );
            System.exit(0);
            }
        });
    }
}

It’s a minimal, but working, mail reader. I’ll merge it with a mail sender in Section 19.10 to make a complete mail client program.

..................Content has been hidden....................

You can't read the all page of ebook, please click here login for view all page.
Reset
18.223.170.223