Subversion Repositories bacoAlunos

Rev

Rev 165 | 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 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 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 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);

    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());
        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
        {
            Session session = Session.getDefaultInstance(props, null);
            Store store = session.getStore(provider);
            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();

            for (int i = count; i > count - Globals.POP_MAX_MESSAGES && i > 0; i--)
            {

                Message message = inbox.getMessage(i);
                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 = messagePart.getContent();
                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);
            }
            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.error(e, e);
        }
        catch (1.5.0/docs/api/java/io/IOException.html">IOException e)
        {
            logger.error(e, e);
        }
        return null;
    }
}