Próbuję uzyskać dostępu do konta gmail i pobrać informacje o wszystkich nieprzeczytanych e-maili od tego.Odzyskiwanie wszystkie nieprzeczytane wiadomości e-mail przy użyciu JavaMail z protokołem POP3
Napisałem swój kod po poleceniu wielu linków. Daję kilka linków dla odniesienia.
Send & Receive emails through a GMail account using Java
Java Code to Receive Mail using JavaMailAPI
Aby przetestować mojego kodu, stworzyłem jednego konta Gmail. Otrzymałem 4 wiadomości z Gmaila. Uruchamiam moją aplikację po sprawdzeniu liczby wiadomości. To pokazało poprawny wynik. 4 nieprzeczytane wiadomości. Wyświetlane były wszystkie informacje (np. Data, nadawca, treść, temat itp.)
Następnie zalogowałem się na moje nowe konto, przeczytałem jeden z e-maili i ponownie uruchomiłem aplikację. Teraz liczba nieprzeczytanych wiadomości powinna wynosić 3, ale wyświetla "Liczba nieprzeczytanych wiadomości: 0"
Tutaj kopiuję kod.
public class MailReader
{
Folder inbox;
// Constructor of the calss.
public MailReader() {
System.out.println("Inside MailReader()...");
final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
/* Set the mail properties */
Properties props = System.getProperties();
// Set manual Properties
props.setProperty("mail.pop3.socketFactory.class", SSL_FACTORY);
props.setProperty("mail.pop3.socketFactory.fallback", "false");
props.setProperty("mail.pop3.port", "995");
props.setProperty("mail.pop3.socketFactory.port", "995");
props.put("mail.pop3.host", "pop.gmail.com");
try
{
/* Create the session and get the store for read the mail. */
Session session = Session.getDefaultInstance(
System.getProperties(), null);
Store store = session.getStore("pop3");
store.connect("pop.gmail.com", 995, "[email protected]",
"paasword");
/* Mention the folder name which you want to read. */
// inbox = store.getDefaultFolder();
// inbox = inbox.getFolder("INBOX");
inbox = store.getFolder("INBOX");
/* Open the inbox using store. */
inbox.open(Folder.READ_ONLY);
/* Get the messages which is unread in the Inbox */
Message messages[] = inbox.search(new FlagTerm(new Flags(
Flags.Flag.SEEN), false));
System.out.println("No. of Unread Messages : " + messages.length);
/* Use a suitable FetchProfile */
FetchProfile fp = new FetchProfile();
fp.add(FetchProfile.Item.ENVELOPE);
fp.add(FetchProfile.Item.CONTENT_INFO);
inbox.fetch(messages, fp);
try
{
printAllMessages(messages);
inbox.close(true);
store.close();
}
catch (Exception ex)
{
System.out.println("Exception arise at the time of read mail");
ex.printStackTrace();
}
}
catch (MessagingException e)
{
System.out.println("Exception while connecting to server: "
+ e.getLocalizedMessage());
e.printStackTrace();
System.exit(2);
}
}
public void printAllMessages(Message[] msgs) throws Exception
{
for (int i = 0; i < msgs.length; i++)
{
System.out.println("MESSAGE #" + (i + 1) + ":");
printEnvelope(msgs[i]);
}
}
public void printEnvelope(Message message) throws Exception
{
Address[] a;
// FROM
if ((a = message.getFrom()) != null) {
for (int j = 0; j < a.length; j++) {
System.out.println("FROM: " + a[j].toString());
}
}
// TO
if ((a = message.getRecipients(Message.RecipientType.TO)) != null) {
for (int j = 0; j < a.length; j++) {
System.out.println("TO: " + a[j].toString());
}
}
String subject = message.getSubject();
Date receivedDate = message.getReceivedDate();
Date sentDate = message.getSentDate(); // receivedDate is returning
// null. So used getSentDate()
String content = message.getContent().toString();
System.out.println("Subject : " + subject);
if (receivedDate != null) {
System.out.println("Received Date : " + receivedDate.toString());
}
System.out.println("Sent Date : " + sentDate.toString());
System.out.println("Content : " + content);
getContent(message);
}
public void getContent(Message msg)
{
try {
String contentType = msg.getContentType();
System.out.println("Content Type : " + contentType);
Multipart mp = (Multipart) msg.getContent();
int count = mp.getCount();
for (int i = 0; i < count; i++) {
dumpPart(mp.getBodyPart(i));
}
} catch (Exception ex) {
System.out.println("Exception arise at get Content");
ex.printStackTrace();
}
}
public void dumpPart(Part p) throws Exception {
// Dump input stream ..
InputStream is = p.getInputStream();
// If "is" is not already buffered, wrap a BufferedInputStream
// around it.
if (!(is instanceof BufferedInputStream)) {
is = new BufferedInputStream(is);
}
int c;
System.out.println("Message : ");
while ((c = is.read()) != -1) {
System.out.write(c);
}
}
public static void main(String args[]) {
new MailReader();
}
}
Szukałem na google, ale uważam, że należy użyć Flags.Flag.SEEN czytać nieprzeczytane wiadomości e-mail. Ale to nie pokazuje poprawnych wyników w moim przypadku.
Czy ktoś może wskazać, gdzie mogę popełnić jakiś błąd?
Jeśli potrzebujesz cały kod, mogę edytować mój post.
Uwaga: I edycja moje pytanie obejmować cały kod zamiast fragment miałem zamieszczonych wcześniej.
Czy wiadomości 'Message Message [] nie powinny być' Message [] messages'? – berbt
Właściwie oba są prawidłowe. Przeczytaj odpowiedzi powyżej [tutaj] (http://stackoverflow.com/a/1200681/1777090), aby uzyskać szczegółowe wyjaśnienie :) @berbt –
Nowy kawałek nieoczekiwanej wiedzy. Dzięki za link! – berbt