Subversion Repositories bacoAlunos

Rev

Rev 1306 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

package pt.estgp.estgweb.services.email;

import pt.utl.ist.berserk.logic.serviceManager.IService;
import pt.estgp.estgweb.domain.UserSession;
import pt.estgp.estgweb.domain.UserSessionImpl;
import pt.estgp.estgweb.domain.UserImpl;
import pt.estgp.estgweb.Globals;
import pt.estgp.estgweb.web.utils.DatesUtils;
import pt.estgp.estgweb.services.email.impl.DefaultPopEmail;
import pt.estgp.estgweb.services.email.impl.DefaultAddress;

import com.sun.mail.pop3.POP3SSLStore;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import java.util.List;
import java.util.Properties;
import java.util.ArrayList;
import java.util.Date;
import java.io.InputStream;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.Arrays;
import java.util.Comparator;

import org.apache.log4j.Logger;
import jomm.utils.DesUtils;
import jomm.utils.StringsUtils;

/**
 * @author Jorge Machado
 * @date 20/Mar/2008
 * @time 18:31:00
 * @see pt.estgp.estgweb.services.email
 */

public class ReadEmailService implements IService
{

    private static final boolean POP_SECURE = true; //todo mudar isto
    private static final 1.5.0/docs/api/java/lang/String.html">String POP_MAIL_DATE_KEY = "POP_MAIL_DATE_KEY";
    private static final 1.5.0/docs/api/java/lang/String.html">String POP_MAIL_MESSAGES_KEY = "POP_MAIL_MESSAGES_KEY";
    private static final 1.5.0/docs/api/java/util/logging/Logger.html">Logger logger = 1.5.0/docs/api/java/util/logging/Logger.html">Logger.getLogger(ReadEmailService.class);

   
    private Store getStoreSSL(1.5.0/docs/api/java/lang/String.html">String username,1.5.0/docs/api/java/lang/String.html">String password,1.5.0/docs/api/java/lang/String.html">String host)
    {
        Session session = null;
        Store store = null;
        Folder folder;
        1.5.0/docs/api/java/lang/String.html">String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
         
        1.5.0/docs/api/java/util/Properties.html">Properties pop3Props = new 1.5.0/docs/api/java/util/Properties.html">Properties();
         
        pop3Props.setProperty("mail.pop3.socketFactory.class", SSL_FACTORY);
        pop3Props.setProperty("mail.pop3.socketFactory.fallback", "false");
        pop3Props.setProperty("mail.pop3.port",  "995");
        pop3Props.setProperty("mail.pop3.socketFactory.port", "995");
         
        URLName url = new URLName("pop3", host, 995, "",
                username, password);
         
        session = Session.getInstance(pop3Props, null);
        store = new POP3SSLStore(session, url);
        return store;
    }
   
    private Store getStore(1.5.0/docs/api/java/util/Properties.html">Properties props) throws 1.5.0/docs/api/java/security/NoSuchProviderException.html">NoSuchProviderException
    {
        Session session = Session.getDefaultInstance(props, null);
        Store store = session.getStore("pop3");
        return store;
    }
   
   
   
   
    public List<IPopEmail> run(UserSession userSession)
    {
        if (!((UserImpl) userSession.getUser()).hasPopConfigured())
            return null;

        1.5.0/docs/api/java/util/Properties.html">Properties props = new 1.5.0/docs/api/java/util/Properties.html">Properties();
        5+0%2Fdocs%2Fapi+Date">Date d = (5+0%2Fdocs%2Fapi+Date">Date) ((UserSessionImpl) userSession).get(POP_MAIL_DATE_KEY);
        ArrayList<IPopEmail> oldMessages = (ArrayList<IPopEmail>) ((UserSessionImpl) userSession).get(POP_MAIL_MESSAGES_KEY);
        if (d != null && oldMessages != null)
        {
            if (1.5.0/docs/api/java/lang/System.html">System.currentTimeMillis() - d.getTime() < Globals.POP_REFRESH_TIMEOUT_MILISECONDS)
            {
                return oldMessages;
            }
        }

        1.5.0/docs/api/java/lang/String.html">String host = userSession.getUser().getPop3server();
        1.5.0/docs/api/java/lang/String.html">String username = userSession.getUser().getPop3username();
        1.5.0/docs/api/java/lang/String.html">String password = DesUtils.getInstance().decrypt(userSession.getUser().getPop3password()); //DesUtils.getInstance().decrypt(userSession.getUser().getPop3password());
        1.5.0/docs/api/java/lang/String.html">String provider = "pop3";
        if (host == null || username == null || password == null || host.trim().length() == 0 || password.trim().length() == 0 || username.trim().length() == 0)
        {
            return null;
        }
        try
        {
            Store store;
            if(POP_SECURE)
            {
                store = getStoreSSL(username, password, host);
                store.connect();
            }
            else
            {
                store = getStore(props);
                store.connect(host, username, password);
            }
           
            Folder inbox = store.getFolder("Inbox");
            if (inbox == null)
            {
                logger.warn("No INBOX for user:" + userSession.getUser().getId());
                1.5.0/docs/api/java/lang/System.html">System.exit(1);
            }
            inbox.open(Folder.READ_ONLY);
            List<IPopEmail> popMessages = new ArrayList<IPopEmail>();
            int count = inbox.getMessageCount();
            final 1.5.0/docs/api/java/lang/String.html">String usernameF = username;
            Message[] arrayMessages = inbox.getMessages();
            Comparator<Message> messageComparator = new Comparator<Message>() {
                public int compare(Message m1, Message m2) {
                    try {
                       
                        if (m1.getSentDate() == null || m2.getSentDate() == null)
                          return 0;
                        return m2.getSentDate().compareTo(m1.getSentDate());
                    } catch (MessagingException ex) {
                       logger.error(ex,ex);
                    }
                    return 0;
                   
                }
              };

             1.5.0/docs/api/java/util/Arrays.html">Arrays.sort(arrayMessages, messageComparator);
             if(usernameF.startsWith("jmachado"))
                for(Message m : arrayMessages)
                {
                                1.5.0/docs/api/java/lang/System.html">System.out.println("folder " + m.getFolder().getName() + " - " + m.getFolder().getType() + " - " + m.getSubject());
                               
                }
            1.5.0/docs/api/java/lang/System.html">System.out.println("arrayMessages.length " + arrayMessages.length);
            for (int i = 0; i < Globals.POP_MAX_MESSAGES && i < arrayMessages.length ; i++)
            {

                try
                {
                    1.5.0/docs/api/java/lang/System.html">System.out.println("i" + i);
                    Message message = arrayMessages[i];
                    1.5.0/docs/api/java/lang/System.html">System.out.println("folder " + message.getFolder().getName());
                   
                           
                    DefaultPopEmail popEmail = new DefaultPopEmail();
                    1.5.0/docs/api/java/lang/String.html">String date = DatesUtils.getStringFromDate(message.getSentDate());
                    popEmail.setDate(date);
                    popEmail.setSubject(message.getSubject());
                    popEmail.setSubjectFragment(StringsUtils.getFragment(message.getSubject(), Globals.POP_FRAGMENT_TEXT_SIZE));
                    List<IAddress> addressLst = new ArrayList<IAddress>();
                    for (Address a : message.getFrom())
                    {
                        InternetAddress internetAddress = (InternetAddress) a;
                        DefaultAddress address = new DefaultAddress();
                        address.setEmail(internetAddress.getAddress());
                        address.setName(internetAddress.getPersonal());
                        addressLst.add(address);
                    }
                    popEmail.setFrom(addressLst);
                    Part messagePart = message;

                    5+0%2Fdocs%2Fapi+Object">Object content = null;
                    try
                    {
                        content = messagePart.getContent();
                    }
                    catch (1.5.0/docs/api/java/lang/Throwable.html">Throwable e)
                    {
                        content = "ESTG SITE AVISO: Conteudo possivelmente perigoso";
                    }

                    if (content instanceof Multipart)
                    {
                        messagePart = ((Multipart) content).getBodyPart(0);
                    }
                    1.5.0/docs/api/java/lang/String.html">String contentType = messagePart.getContentType();
                    if (contentType.startsWith("text/plain") || contentType.startsWith("text/html"))
                    {
                        5+0%2Fdocs%2Fapi+InputStream">InputStream is = messagePart.getInputStream();
                        1.5.0/docs/api/java/io/BufferedReader.html">BufferedReader reader = new 1.5.0/docs/api/java/io/BufferedReader.html">BufferedReader(new 1.5.0/docs/api/java/io/InputStreamReader.html">InputStreamReader(is, "ISO-8859-1"));
                        1.5.0/docs/api/java/lang/StringBuilder.html">StringBuilder text = new 1.5.0/docs/api/java/lang/StringBuilder.html">StringBuilder();
                        1.5.0/docs/api/java/lang/StringBuilder.html">StringBuilder textClean = new 1.5.0/docs/api/java/lang/StringBuilder.html">StringBuilder();
                        1.5.0/docs/api/java/lang/String.html">String thisLine = reader.readLine();
                        while (thisLine != null)
                        {
                            1.5.0/docs/api/java/lang/String.html">String thisLineTrim = thisLine.trim();
                            if (thisLineTrim.length() > 0)
                            {
                                textClean.append(thisLineTrim);
                            }
                            text.append("<br>").append(thisLine.trim());
                            thisLine = reader.readLine();
                        }
                        popEmail.setText(text.toString());
                        popEmail.setFragment(StringsUtils.getFragment(textClean.toString(), Globals.POP_FRAGMENT_TEXT_SIZE));
                    }
                    popMessages.add(popEmail);
                }
                catch (1.5.0/docs/api/java/lang/Throwable.html">Throwable e)
                {
                    logger.error(e, e);
                }
            }
            inbox.close(false);
            store.close();

            ((UserSessionImpl) userSession).put(POP_MAIL_DATE_KEY, new 5+0%2Fdocs%2Fapi+Date">Date());
            ((UserSessionImpl) userSession).put(POP_MAIL_MESSAGES_KEY, ((1.5.0/docs/api/java/util/ArrayList.html">ArrayList) popMessages));

            return popMessages;
        }
        catch (MessagingException e)
        {
            logger.info(e);
            logger.debug(e, e);
        }
        return null;
    }
}