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;
}
}