/* * ReceiveMail.java * * Created on den 13 september 2001, 10:25 */ package ip1.u7.b; import javax.mail.*; import javax.mail.internet.*; import javax.swing.event.EventListenerList; /** Komponent som hämtar e-postmeddelanden från mailservern * * @author Henrik Johansson * @version ht2001 */ public class MailReceiveComponent { private MailServerContent msContent = null; /** */ public MyAuthenticator authenticator = null; private java.util.Properties properties = null; private Session session = null; private Store store = null; private Folder folder = null; private boolean open; private EventListenerList mailReceivedListeners; /** Creates new ReceiveMail */ public MailReceiveComponent() { open = false; mailReceivedListeners = new EventListenerList(); } /** Sätter kontrollerklassen. Gör i denna komponentr ingenting * @param controller Kontrollklassen. */ public void setController(MailReceiverGUI controller) {} /** Låter Lyssnarklasser prenumerera på de MailReceivedEvents som komponenten producerar. * * @param listener Lyssnarklassen som prenumererar. */ public void addMailReceivedListener(MailReceivedListener listener) { mailReceivedListeners.add(MailReceivedListener.class, listener); } /** Låter Lyssnarklasser säga upp prenumerationen på de MailReceivedEvents som komponenten producerar. * * @param listener Lyssnarklassen som säger upp prenumerationen. */ public void removeMailReceivedListener(ServerInfoChangeListener listener) { mailReceivedListeners.remove(MailReceivedListener.class, listener); } /** Skickar MailReceivedEvents till eventuella prenumeranter. * * @param evt det MailReceivedEvent som skall skickas. */ synchronized protected void fireMailReceivedEvent(MailReceivedEvent evt) { Object[] listeners = mailReceivedListeners.getListenerList(); int numListeners = listeners.length; for(int i = 0; i < numListeners; i++) { if (listeners[i] == MailReceivedListener.class) { ((MailReceivedListener)listeners[i + 1]).dispatchMailReceived(evt); } } } /** Används för att be komponenten hämta post från en speciell server. * Komponenten kommer att starta en ny tråd där detta kommer att ske. * * @param msContent Innehåller information om den server som skall användas. * Kommer att fyllas på med de e-postmeddelanden den eventuellt hyser */ public void receiveMail(MailServerContent msContent) { this.msContent = msContent; // Om det finns någon öppen JavamailFolder serdan tidigare, stängs den nu. if(open) closeReceiveMail(); new InternalReceiveMail(); } /** Tråden som hämtar mail från en server implementeras av denna interna klass */ private class InternalReceiveMail implements Runnable { /** Skapar en InternalReceiveMail-tråd */ private InternalReceiveMail() { (new Thread(this)).start(); } /** implementerar Runnable, använder internalReceiveMail-metoden */ public void run() { internalReceiveMail(); } } /** Kallas av den tråd som hämtar mail. Det är här som den verkliga hämtningen sker */ synchronized private void internalReceiveMail() { try { properties = new java.util.Properties(); properties.put("mail.pop3.host", msContent.getServer()); session = Session.getInstance(properties, new MyAuthenticator(msContent.getUsername(), msContent.getPassword())); store = session.getStore("pop3"); store.connect(msContent.getServer(), msContent.getUsername(), msContent.getPassword()); folder = store.getFolder("INBOX"); folder.open(Folder.READ_WRITE); msContent.setMessages(folder.getMessages()); open = true; // Ser till att prenumeranter på MailReceivedEvents får ett sådant sänt till sig. fireMailReceivedEvent(new MailReceivedEvent(msContent)); } catch(NoSuchProviderException e) { System.err.println(e.getMessage()); } catch(MessagingException e) { System.err.println(e.getMessage()); } } /** Stänger en eventuellt öppen Javamail Folder */ synchronized public void closeReceiveMail() { try { folder.close(true); store.close(); open = false; } catch(MessagingException e) { System.err.println(e.getMessage()); } } /** alla komponenter skall ha en startmetod */ public void start() {} /** Ser till att en öppen JavaMail Folder stängs då komponenten avslutas */ public void stop() { if(open) closeReceiveMail(); } }