Read sent mails using smtp java - java

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.)

Related

Java Mail: How to Recognize New Mails

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.)

Javamail error: SMTPAddressFailedException: 450 too many connections from your IP (rate controlled)

I have a Spring 4.1.1 web application in which the user can set some scheduled tasks. When these tasks complete the administrator will receive an automatic email sent with the SMTP method.
For the email I use the jars: javax.mail-api-1.5.2.jar and mail-1.5.0-b01.jar
The email are sent correctly at first, but when the frequency of the tasks goes up eventually I start to get the following exception and all subsequent emails fails. I can send about 30 emails in a 10 minutes window.
com.sun.mail.smtp.SMTPAddressFailedException: 450 too many connections from your IP (rate controlled)
at com.sun.mail.smtp.SMTPTransport.rcptTo(SMTPTransport.java:1862)
at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:1118)
at com.synaptic.email.MessageMail.sendMessage(MessageMail.java:152)
at com.synaptic.email.EmailManagerImpl.sendGeneralEmail(EmailManagerImpl.java:423)
The code snippet from which I send the emails is:
public void sendMessage(Brand brand, String timeout) throws MessagingException
{
try {
// Prepare message
Properties props = new Properties();
props.put("mail.smtp.host", mailHost);
props.put("mail.smtp.connectiontimeout", timeout);
props.put("mail.smtp.timeout", timeout);
props.put("mail.smtp.writetimeout", timeout);
props.put("mail.smtp.port", Integer.parseInt(brand.getBrandProperties().getEmailPort()));
Session session = Session.getInstance(props);
message = new MimeMessage(session);
createMessage();
if (brand.getBrandProperties().getEmailUsername().isEmpty() && brand.getBrandProperties().getEmailPassword().isEmpty()) {
// Send email message to SMTP server without auth
Transport.send(message);
} else {
// Send message with auth
Transport.send(message,brand.getBrandProperties().getEmailUsername(),brand.getBrandProperties().getEmailPassword());
}
} catch (MessagingException e) {
log.error("Failed to send email message.", e);
throw e;
}
}
From the javamail documentation and source code seems clear that the transport connection are closed on a finally statement, so no connection should be hanging open, but still I hit this exception.
I checked online but I can't find a way to increase this limit.
Am I doing something wrong sending the message? is there a way to monitor the email connections? or is an email server issue?
Your server is telling you that you're making too many connections in too short a time. It's rate-limiting you to prevent you from abusing the server. You may need to pay for a higher quality of service to be allowed to send more messages. Contact your ISP for details.
BTW, you say you're using javax.mail-api-1.5.2.jar and mail-1.5.0-b01.jar. You should not mix and match versions like that. You only need one jar file - the javax.mail-1.5.2.jar file. You can get it on the JavaMail project page.

How to read the UNREAD email using java mail api

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.

Gmail SMTP Suitable For Production Messaging

I have some automated emailing tasks set up in my application. That is every day I send application specific email to customers to remind them of appointments etc. Is using Gmail's smtp suitable for production tasks beyond just a simple message here any there? Is there any benefit to implementing my own smtp server such as Apache James?
I agree with #Richthofen - Using gmail to send emails in a production environment is a bad (and unethical) idea; Amazon SES or Sendgrid are the best solutions here. If you want to run your own SMTP server then please keep in mind that it will share resources with your application and will probably slow it down.
However I use gmail to test development/testing environments using javamail API. Here's the code:
public class EmailSender{
public void send(){
//javamail code
Session mailSession = createSmtpSession();
//javamail code
}
private Session createSmtpSession() {
final Properties props = new Properties();
props.setProperty ("mail.host", "smtp.gmail.com");
props.setProperty("mail.smtp.auth", "true");
props.setProperty("mail.smtp.port", "" + 587);
props.setProperty("mail.smtp.starttls.enable", "true");
props.setProperty ("mail.transport.protocol", "smtp");
// props.setProperty("mail.debug", "true");
return Session.getDefaultInstance(props, new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(
"<gmail ID in user#domain format goes here>",
"<password goes here>");
}
});
}
}
Gmail TOS prohibits unsolicited commercial emails. In general I wouldn't deploy any service that relies on Gmail to the public. I think Gmail caps an email recipient list to 100 anyways so it would probably fail if you tried to send the same message to more than 100 people.
Usually you want your own IP for outgoing mail for reputation reasons. For most of my clients when I do freelance work I recommend affordable partner services like http://sendgrid.com/ ... Having your own IP means that you can manage your reputation as a bulk email sender legitimately. And you won't have to worry about Gmail shutting you down for breaking the TOS. Gmail also won't give you metrics about deliverability so you won't have any idea if you're being successful in sending these.
Having worked for a major email marketer, I can tell you that just sending a message to an SMTP server is not enough these days. All major mail service providers do things like require sender identification keys for bulk mail. They also meter messages and flag senders who end up submitting too many messages in a specific amount of time. If you want your mail delivered and not in the SPAM folder you need to do either a lot of work and spin up a dedicated server w/ a dedicated IP, or you should use a vendor who can do some of that work for you.

IMAP for Hotmail equivalent

We need to build a client for Hotmail, which doesn't support IMAP. To my understanding you have to use exchange w/ POP3 but POP3 doesn't support moving mail from one folder to another. We need the features:
be able to read mail without marking it as "read"
be able to delete mail
be able to move mail out of inbox to another folder and mark as read
Any way to get this to work?
Short answer, No.
License the ActiveSync protocol from Microsoft.
There is an Outlook connector for Hotmail. Maybe with a ton of JNI but check the license first.
Update: Outlook now supports IMAP. Hotmail uses the same servers.
You can do everything you need with JavaMail. Here is the API
Here is an example of getting all unread messages from an inbox and marking them as read. Take a look at the folder class (specifically the copyMessages() method) to move messages to a new folder.
import java.util.Properties;
import javax.mail.*;
import javax.mail.search.FlagTerm;
public class Driver {
public static void main(String[] args){
// Create properties (disable security checks on server)
Properties props = new Properties();
// Get session
Session session = Session.getDefaultInstance(props, null);
try{
// Get the store
Store store = session.getStore("pop3");
store.connect("servername", "username", "password");
//connection configuration
Folder folder = store.getFolder("INBOX");
folder.open(Folder.READ_WRITE);
//get all unread messages in the inbox
FlagTerm ft = new FlagTerm(new Flags(Flags.Flag.SEEN), true);
Message[] messages = folder.search(ft);
for (int i = messages.length -1; i>=0; i--) {
messages[i].setFlag(Flags.Flag.SEEN, true);
}
// Close connection
folder.close(false);
store.close();
}
catch(Exception e){
e.printStackTrace();
}
}

Categories