When I receive mails, open the inbox, and get the messages; how can I compare them to a previous array of messages, so that I know which of them I have already read?
Properties properties = new Properties();
properties.put("mail.imaps.host", host);
properties.put("mail.imaps.port", "993");
Session emailSession = Session.getDefaultInstance(properties);
//2) create the POP3 store object and connect with the pop server
Store emailStore = emailSession.getStore("imaps");
emailStore.connect(user,pw);
//3) create the folder object and open it
Folder emailFolder = emailStore.getFolder("INBOX");
emailFolder.open(Folder.READ_ONLY);
Message[] messages = emailFolder.getMessages();
How to handle this depends on exactly what your requirements are. For example, will other applications and/or users be accessing the mailbox at the same time as your application? Or does your application have dedicated access to the mailbox?
You can use the SEEN flag to find messages that you haven't already read.
You can also save the IMAP UID for the last message you processed (and the UIDVALIDITY for the folder) to later find messages with larger UIDs. See the UIDFolder interface for details.
(The comments in your code talk about pop, but your code is using imap; if you ever have to use the pop3 protocol the answers are quite different.)
Related
I have been trying lot of things from multiple resources like Read Inbox Java2s
and How to get the list of available folders in a mail account using JavaMail
I am sending emails succesfully, but to be sure of mail is sent successfully, i need to read emails from sent items folder Is this possible with smtp? if yes, how?
Currently I am stuck even in connceting with stroe. I am finding no way to pass the steps
Store store = session.getStore(); and store.connect();
I have no idea about imap or pop3. They might not have been even configured at our server, but if smtp does not faicilitate then I am ready to process with those protocols, though I am sending mails using stmp yet. I have tried lot of edits in my following code, but nothing is helping
String host = "mysite.smtp.com";
Properties props = new Properties();
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.host", host);
props.put("mail.smtp.port", "myport");
props.put("mail.smtp.auth", "true");
Session session = Session.getDefaultInstance(props, new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
String user = "myname";
String password = "mypassword";
return new PasswordAuthentication(user, password);
}
});
Store store = session.getStore(); // had tried writing "imaps" here
store.connect(host, null, null);
//store.connect(); also tried this
Folder inbox = store.getFolder("INBOX"); //actually i need "SENT"
if (inbox == null) {
System.out.println("No INBOX");
System.exit(1);
}
inbox.open(Folder.READ_ONLY);
Message[] messages = inbox.getMessages();
for (int i = 0; i < messages.length; i++) {
System.out.println("Message " + (i + 1));
messages[i].writeTo(System.out);
}
inbox.close(false);
store.close();
You can't use smtp to read email, you need to use imap. pop3 won't help because it only lets you read the Inbox.
Depending on what you mean by "sent successfully", a successful return from the send method will tell you what you want to know.
Note also that depending on the mail server you're using, sent messages don't automatically appear in a "Sent Messages" folder; you might need to copy them their yourself after sending the message. (Gmail does this automatically, but not all other servers do.)
If what you really want to know is that the message was successfully delivered to the destination mail server(s) and all the addresses were valid, that's harder. The JavaMail FAQ has more information.
I know that I am answering late. I encountered quite similar problems while maintaining a software using extensively mail sending functionalities. I finally created a JUnit extension to write integration tests with a SMTP server emulation.
Please have a look to github.com/sleroy/fakesmtp-junit-runner/. By the way it's open-source.
Refer this link:
How to save sent items mail using the Java mail API?
Sent Mail Service using JAVAMAIL API
Note also that depending on the mail server you're using, sent messages don't automatically appear in a "Sent Messages" folder; you might need to copy them their yourself after sending the message. (Gmail does this automatically, but not all other servers do.)
I am trying to read the UNREAD mails from gmail account. I tried to filter the messages based on the Flags, but it did not work. I printed the Flags sent on each message, but nothing is set on it, because of which I could not filter the messages. I used the keyword Flags.Flag.SEEN to filter the messages.
After googling, I found out that it is something with the email client. For ex, we need to the change the configuration in gmail or any exchange mail server. Can you please tell me on what to change the configuration to read the UNREAD mails?
Also, end of day, I am going to implement the code into one of the smtp exchange servers. Please let me know if there needs a special configuration. So that I can inform the respective team and then implement my change.
// connects to the message store
Store store = session.getStore("pop3");
store.connect(userName, password);
// opens the inbox folder
Folder folderInbox = store.getFolder("INBOX");
System.out.println("unread count - " + folderInbox.getUnreadMessageCount());
folderInbox.open(Folder.READ_WRITE);
// folderInbox.search(new FlagTerm(new Flags(Flags.Flag.RECENT),
// false));
// fetches new messages from server
Message[] arrayMessages = folderInbox.search(new FlagTerm(new Flags(Flags.Flag.RECENT), false));
The POP3 protocol doesn't support any flags. Use IMAP.
See Retrieving all unread emails using javamail with POP3 protocol.
One comment suggests the use of Flags.Flag.SEEN for Gmail. There's another suggestion about changing settings in your test Gmail account.
I'm trying to write an app that get emails from a POP3 server. The "Strategy" I used eventually is:
Get single message
check if the message is already present in my database
if not, insert it, goto 1
I know that this is not perfect, but ok...let's just face a problem at once :)
apologizing for the ugly style, I'm well trained as Assembly and pure C programmer, just started with Java, my code to get the single message is (I have cut the try/catch statements to make it more readable)
Properties props = new Properties();
Session session = Session.getDefaultInstance(props, null);
Store store = null;
POP3Folder folder = null;
openStaffLabel: {
store = session.getStore(exXContainer.accounts[selectedAccount].accountType.toLowerCase());
store.connect(host, username, password);
folder =(POP3Folder) store.getFolder("INBOX");
folder.open(Folder.READ_WRITE);
int countMsg = 0;
countMsg = folder.getMessageCount();
if (countMsg == 0)
break openStaffLabel;
message = folder.getMessages(countMsg - first + 1);
for(int i = 0;i < messages.length;i++)
{
// do some stuffs with messages
}
} // openStaffLabel:
folder.close(false);
store.close();
That seems to work fine. Then I found over internet this code (here), claimed by the poster to be much more efficient:
URLName url = new URLName("pop3", host, 110, "", user, password);
Session session = Session.getDefaultInstance(System.getProperties(),null);
Store store = session.getStore(url);
store.connect();
POP3Folder inbox = (POP3Folder)store.getFolder("INBOX");
inbox.open(Folder.READ_WRITE);
FetchProfile profile = new FetchProfile();
profile.add(UIDFolder.FetchProfileItem.UID);
Message[] messages = inbox.getMessages();
inbox.fetch(messages,profile);
for(int i = 0;i < messages.length;i++)
{
// do some stuffs with messages
}
The author claims: "The major difference with the previous scenario is that the client downloads new emails only"
but in his code there is a inbox.getMessages() that, if I understood well, actually download all messages. So the point is...what is the real advantage of using fetch(messages,profile) if with getMessages I have already fetched all the headers?
if I only want to download UIDs, how can I do?
and, furthermore, if I only want to download the UIDs of the first N mails...is it possible?
thank you very much to anyone who will help, I'm stuck on this problem since one week.
Cristiano
POP3 isn't the best protocol for this, and you'll understand this better if you understand what the POP3 protocol is capable of doing.
The use of the fetch method that you describe will fetch all the UIDs for all the messages in the mailbox in one operation. If you keep track of which UIDs you've seen, you can then make sure you only fetch the content of the messages that you haven't seen. Use the POP3Folder.getUID method in the loop over all the messages to skip the messages you've already seen. Note that the getMessage methods don't actually fetch the content of the message; the content isn't fetched until you use another method that accesses the content.
Note that the POP3 protocol only lets you fetch the UID for a single message, or the UIDs for all the messages.
Be sure to read the javadocs for the com.sun.mail.pop3 package, and the JavaMail FAQ, especially this item about common mistakes.
I connect to my email box vie POP3 and get unread messages count. There're 10 mails in the box with only 1 in unread state. But Folder.getUnreadMessagesCount() returns 10 instead of 1.
Is this a problem within mail provider settings or I do something wrong?
Here's what I do:
Session session = Session.getDefaultInstance(props, new EMailAuthenticator(getLogin(), getPassword()));
Store store = session.getStore();
store.connect();
Folder inbox = store.getFolder("INBOX");
inbox.open(Folder.READ_ONLY);
inbox.getUnreadMessageCount();
POP3 has no method to track read or unread messages (see RFC1939), so JavaMail will treat all messages as unread. If you want to be able to track read and unread e-mails, then you need to use IMAP.
Hi i am having problem with reading mails from manually created folder.
i can read mails from INBOX. but when i try to read mail from other than inbox it is giving error.
I hope stackoverflow will give solution.
Thanks in advance...
Error Message:
Exception in thread "main" javax.mail.FolderNotFoundException: folder is not INBOX
at com.sun.mail.pop3.POP3Folder.open(POP3Folder.java:183)
at MailPop3.main(MailPop3.java:24)
My Code:
Properties properties = System.getProperties();
Session session = Session.getDefaultInstance(properties);
Store store = session.getStore("pop3");
store.connect(host, user, password);
Folder inbox = store.getFolder("MyPersonalFolder");
inbox.open(Folder.READ_ONLY);
// search for all "unseen" messages
Flags seen = new Flags(Flags.Flag.SEEN);
FlagTerm unseenFlagTerm = new FlagTerm(seen, false);
Message messages[] = inbox.search(unseenFlagTerm);
Hope you are using POP. By default POP points to INBOX only. As per POP3Folder,
A POP3 Folder (can only be "INBOX").
See the com.sun.mail.pop3 package documentation for further information on the POP3 protocol provider.
To access custom folders you require to use IMAPFolder.
This may sound weird, but I guess if you want to make your custome folder and use it in the code then you need to name it "Store", then it will work. Worked for me....took 3 hrs to research...hope works for you too