⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jmail.java

📁 一个功能比较全的JMail程序
💻 JAVA
字号:
package jws.awt.net;

// Copyright 1997, John Webster Small
// All rights Reserved

import java.io.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import jws.net.*;
import jws.awt.event.*;
import jws.awt.*;

public class JMail extends WinFrame
{
  private File saveState;

  private ChoiceCardPanel folderViews;
  private Hashtable folders;
  private SMTPwConfig smtp;
  private POP3wConfig pop3;

  private PreviewEmailPanel preview;
  private SMTPPOP3Config smtpPop3Config;

  private final static String Inbox = "Inbox";
  private final static String Outbox = "Outbox";
  private final static String SentItems = "Sent Items";

  private Button newMsgButton = new Button("New message");
  private Button replyToButton = new Button("Reply to");
  private Button replyToAllButton = new Button("Reply to all");
  private Button forwardButton = new Button("Forward");
  private Button sendXcvButton = new Button("Send & receive");
  private Button deleteButton = new Button("Delete");

  private Mailbox mailbox;
  ItemListener enableButtonsListener;

  final void sendXcv()
  {
    try  {
      Vector outbox = (Vector) folders.get(Outbox);
      if (smtp.sendMail(this,outbox.elements()))  {
        for (int i = 0; i < outbox.size(); i++)
          addToFolder(SentItems,(Email)outbox.elementAt(i));
        outbox.removeAllElements();
        ((List) folderViews.getItem(Outbox)).removeAll();
      }
      Vector incoming = pop3.readMail(this,false);
      for (int i = 0; i < incoming.size(); i++)
        addToFolder(Inbox,(Email)incoming.elementAt(i));
    } catch (Exception e) {
      new WinFrame("Sending and Receiving Email",e);
    }
  }

  private final void enableButton(Button b, boolean enabled)
  {
    if (b.isEnabled() != enabled)
      b.setEnabled(enabled);
  }

  final void enableButtons()
  {
    Email email = getSelectedEmail();
    preview.preview(email);
    if (email == null)  {
      enableButton(replyToButton,false);
      enableButton(replyToAllButton,false);
      enableButton(forwardButton,false);
      enableButton(deleteButton,false);
    }
    else {
      String folder = folderViews.getSelectedItem();
      if (folder.equals(Outbox))  {
        enableButton(replyToButton,false);
        enableButton(replyToAllButton,false);
        enableButton(forwardButton,true);
        enableButton(deleteButton,true);
      }
      else  {
        enableButton(replyToButton,true);
        enableButton(replyToAllButton,true);
        enableButton(forwardButton,true);
        enableButton(deleteButton,true);
      }
    }
    invalidate();
  }

  final public Email getSelectedEmail()
  {
    try  {
      int folderIdx = folderViews.getSelectedIndex();
      List folderList = (List) folderViews.getItem(folderIdx);
      int folderListIdx = folderList.getSelectedIndex();
      String folder = folderViews.getSelectedItem();
      Vector letters = (Vector) folders.get(folder);
      return (Email) letters.elementAt(folderListIdx);
    } catch (Exception e) { }
    return null;
  }

  final public void viewSelectedEmail()
  {
    Email email = getSelectedEmail();
    if (email == null)
      return;
    if (folderViews.getSelectedItem().equals(Outbox))
      new ComposeEmail(email.getSubject(),mailbox,email)
        .setVisible(true);
    else
      new ViewEmail(mailbox,email).setVisible(true);
  }

  final protected void addFolder(String folder)
  {
    if (!folders.containsKey(folder))  {
      List letterList = new List();
      letterList.addActionListener
        (
          new ActionAdapter()
          {
            public void actionPerformed(ActionEvent e)
              { viewSelectedEmail(); }
          }
        );
      letterList.addItemListener(enableButtonsListener);
      folderViews.add(folder, letterList);
      folders.put(folder,new Vector());
    }
  }

  final protected void removeFolder(String folder)
  {
    if (folders.containsKey(folder)
      && !folder.equals(Inbox)
      && !folder.equals(Outbox)
      && !folder.equals(SentItems))  {
      folderViews.remove(folder);
      folders.remove(folders.get(folder));
    }
  }

  private final static String spaces = new String
    ("                                              ");

  private final static void appendField
    (StringBuffer out, String field, int width)
  {
    if (field.length() < width)  {
      out.append(field);
      out.append(spaces.substring(0,width-field.length()));
    }
    else
      out.append(field.substring(0,width));
  }

  final public void addToFolder
    (String folder, Email email)
  {
    if (!folders.containsKey(folder))
      addFolder(folder);
    if (folders.containsKey(folder))  {
      List letterList = (List) folderViews.getItem(folder);
      Vector letters = (Vector) folders.get(folder);
      if (letters.contains(email))  {
        int letterIdx = letters.indexOf(email);
        letters.removeElementAt(letterIdx);
        letterList.remove(letterIdx);
      }
      letters.addElement(email);
      StringBuffer item = new StringBuffer();
      if (folder.equals(Outbox)
        || folder.equals(SentItems))
        appendField(item,email.getToAsString(),30);
      else
        appendField(item,email.getFrom(),30);
      appendField(item,email.getSubject(),30);
      appendField(item,email.getDate(),30);
      letterList.add(item.toString());
    }
  }

  final private void addFolders(Hashtable folders)
  {
    Enumeration folderNames = folders.keys();
    while (folderNames.hasMoreElements())  {
      String folderName = (String) folderNames.nextElement();
      addFolder(folderName);
      Enumeration letters = ((Vector)folders.get(folderName)).elements();
      while (letters.hasMoreElements())
        addToFolder(folderName,(Email)letters.nextElement());
    }
  }


  public void removeFromFolder
    (String folder, Email email)
  {
    if (folders.containsKey(folder))  {
      List letterList = (List) folderViews.getItem(folder);
      Vector letters = (Vector) folders.get(folder);
      if (letters.contains(email))  {
        int letterIdx = letters.indexOf(email);
        letters.removeElementAt(letterIdx);
        letterList.remove(letterIdx);
      }
    }
  }

  public void deleteEmail()
  {
    try  {
      int folderIdx = folderViews.getSelectedIndex();
      List letterList = (List) folderViews.getItem(folderIdx);
      int letterIdx = letterList.getSelectedIndex();
      String folder = folderViews.getSelectedItem();
      Vector letters = (Vector) folders.get(folder);
      letters.removeElementAt(letterIdx);
      letterList.remove(letterIdx);
      enableButtons();
    } catch (Exception e) {
      new WinFrame("Deleting mail",e);
    }
  }

  private void init(File saveState)
  {
    this.saveState = saveState;
    enableButtonsListener =
      new ItemListener()
      {
        public void itemStateChanged(ItemEvent e)
          { enableButtons(); }
      };
    folderViews = new ChoiceCardPanel("Folders");
    folderViews.addItemListener(enableButtonsListener);
    folders = new Hashtable();
    boolean restored = false;
    if (saveState.exists())    
      try  {
        FileInputStream fis = new FileInputStream(saveState);
        ObjectInputStream ois = new ObjectInputStream(fis);
        smtp = (SMTPwConfig) ois.readObject();
        pop3 = (POP3wConfig) ois.readObject();
        Hashtable savedFolders = (Hashtable) ois.readObject();
        ois.close();
        addFolders(savedFolders);
        restored = true;
      } catch (Exception e) {
        new WinFrame("Restoring JMail state",e);
      }
    if (!restored)  {
      addFolder(Inbox);
      addFolder(Outbox);
      addFolder(SentItems);
      smtp = new SMTPwConfig();
      pop3 = new POP3wConfig();
    }
    smtpPop3Config = new SMTPPOP3Config(smtp,pop3);
    mailbox = new Mailbox()
      {
        public void post(Email email)
          { addToFolder(Outbox,email); }
        public String getFrom()
          { return smtp.getSenderEmailAddress(JMail.this); }
      };
    Panel p = new Panel();
    p.add(newMsgButton);
    newMsgButton.addActionListener
      (
        new ActionListener()
        {
          public void actionPerformed(ActionEvent e)
          {
            new ComposeEmail
              ("New Message",mailbox).setVisible(true);
          }
        }
      );
    p.add(replyToButton);
    p.add(replyToAllButton);
    p.add(forwardButton);
    p.add(sendXcvButton);
    p.add(deleteButton);
    add("North",p);

    add("Center",new InsetPanel(10,10,10,10,folderViews));
    preview = new PreviewEmailPanel(4,10);
    add("South",new InsetPanel(10,10,10,10,preview));
    pack();
    sendXcvButton.addActionListener
      (
        new ActionListener()
        {
          public void actionPerformed(ActionEvent e)
          {
            sendXcv();
          }
        }
      );
    deleteButton.addActionListener
      (
        new ActionListener()
        {
          public void actionPerformed(ActionEvent e)
            { deleteEmail(); }
        }
      );
    replyToButton.addActionListener
      (
        new ActionListener()
        {
          public void actionPerformed(ActionEvent e)
          {
            Email em = getSelectedEmail()
              .replyTo(JMail.this);
            new ComposeEmail(em.getSubject(),
              mailbox,em).setVisible(true);
          }
        }
      );
    replyToAllButton.addActionListener
      (
        new ActionListener()
        {
          public void actionPerformed(ActionEvent e)
          {
            Email em = getSelectedEmail()
              .replyToAll(JMail.this);
            new ComposeEmail(em.getSubject(),
              mailbox,em).setVisible(true);
          }
        }
      );
    forwardButton.addActionListener
      (
        new ActionListener()
        {
          public void actionPerformed(ActionEvent e)
          {
            Email em = getSelectedEmail()
              .forward();
            new ComposeEmail(em.getSubject(),
              mailbox,em).setVisible(true);
          }
        }
      );
    enableButtons();
    MenuBar mb = new MenuBar();
    Menu m = new Menu("Mail");
    MenuItem mi = new MenuItem("Options");
    mi.addActionListener
      (
        new ActionListener()
        {
          public void actionPerformed(ActionEvent e)
            { smtpPop3Config.configure(JMail.this,"JMail"); }
        }
      );
    m.add(mi);
    mb.add(m);
    m = new Menu("Help");
    mi = new MenuItem("Feedback");
    mi.addActionListener
      (
        new ActionListener()
        {
          public void actionPerformed(ActionEvent e)
          {
            Email em = new Email(
              "To: jsmall@laser.net\n" +
              "Subject: JMail tech support\n\n" +
              "Please send me your questions, comments, suggestions!"); 
            new ComposeEmail(em.getSubject(),
              mailbox,em).setVisible(true);
          }
        }
      );
    m.add(mi);
    mi = new MenuItem("About");
    mi.addActionListener
      (
        new ActionListener()
        {
          public void actionPerformed(ActionEvent e)
          {
            final WinDialog wd =
              new WinDialog(JMail.this,"About",true);
            Panel ap = new Panel();
            ap.setLayout(new GridBagLayout());
            GridBagConstraints c = new GridBagConstraints();
            c.gridwidth = GridBagConstraints.REMAINDER;
            ap.add(new Label("JMail  1.1.3.01"),c);
            ap.add(new Label("100% Pure Java (tm)"),c);
            ap.add(new Label("Mail Client"),c);
            wd.add("Center",new InsetPanel(10,10,10,10,ap));
            Button ok = new Button("Ok");
            ap = new Panel();
            ap.add(ok);
            wd.add("South",ap);
            ok.addActionListener
              (
                new ActionListener()
                {
                  public void actionPerformed(ActionEvent e)
                    { wd.dispose(); }
                }
              );
            wd.pack();
            wd.setVisible(true);
          }
        }
      );
    m.add(mi);
    mb.add(m);
    setMenuBar(mb);
  }

  public JMail(File saveState)
  {
    super(saveState.getName());
    init(saveState);
  }

  public JMail(String pathname)
  {
    this(new File(pathname));
  }

  public void save()
  {
    try  {
      FileOutputStream fos = new FileOutputStream(saveState);
      ObjectOutputStream oos = new ObjectOutputStream(fos);
      oos.writeObject(smtp);
      oos.writeObject(pop3);
      oos.writeObject(folders);
      oos.close();
    } catch (Exception e) {
      new WinFrame("JMail saving state",e);
    }
  }

  public void dispose()
  {
    save();
    super.dispose();
  }
    

  public static void main(String[] args)
  {
    try  {
      new JMail(args[0]).appMainWindow().setVisible(true);
    } catch (Exception e)  {
      new JMail("JMail").appMainWindow().setVisible(true);
    }
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -