I was trying to see if there was a way to search an email inbox from javax.mail. Say I wanted to send a query and have the it return emails to us. Can we parse returned HTML and extract data. Also, if the above is possible how would I "translate" those messages returned by that server to POP3 messages? E.g. we have extracted:
Subject: Foo
Body: Bar
but to open same message using POP3 I need to know it's POP3 uid, or number. I don't think we'll be able to get UID but perhaps we can figure out the number.
I guess the question is:
Can I send a query to email server (such as Hotmail or Yahoo) and get returned emails?
Unfortunately, the POP3 protocol doesn't support that. It is not like SQL or so. You need to mirror the complete mailbox yourself in some kind of a datastore (SQL database?) and execute the search on that. You can eventually keep/cache the data so that you don't need to retrieve the whole inbox everytime, but only the unread items.
Related
I am fetching the emails from the POP server.
I am using the following logic to find the mail which is received newly.
if(currentMail.getSentTime() > lastMailFetchedTime)
{
//Processing the email
}
else
{
System.out.println("Mail sent earlier. It might be fetched already");
}
At regular time interval , Some emails are missed from the POP mail fetcher(For Google Apps account). I have analyzed the mail fetching process and identified that, POP server is giving the older emails which is not given in the previous mail fetching.
Is Gmail POP server provides the mail based on the mail sent time(I am not getting it in proper order)?
If it is not given using the mail sent time means, How can I fetch the newly created emails without using IMAP ?
Think of the POP3 server as storing messages in a sequential list where the last message in the list is always the most recently received message.
So essentially it "sorts" them in order of arrival, but this might not be the same as "Date Sent".
POP3 server is automatically sorted messages, but only up to minutes.
This question is out of curiosity, JavaMail API provides POP3 protocol provider to access POP3 messages. There is a method POP3Folder.getUID(message) available that return unique ID string for a message. It returns, for example, in the following format:
Example UID: 1322488254.15180.1.dummy1,S=703
My questions are:
Is there any logic/pattern/algorithm behind in generating this UID uniquely for each messages?
Are there any probabilities/chances of having the same UID for multiple messages? In other words, is this truly unique?
Is this UID is generated by POP3 provider (JavaMail API) or returned by POP3 server?
JavaMail API doc says:
Return the unique ID string for this message, or null if not available. Uses the POP3 UIDL command.
It's generated by the POP3 server. Every server does it differently.
How perfectly it does it depends on the server, but generally I wouldn't
worry about getting the same UID for two different messages.
Depending on anything about the content or structure of the UID would be a mistake.
In particular, don't assume that they're sorted.
I tried to send emails with Amazon SES, with the Java AWS SDK, and it worked. I would like to be able to check (at a later time) whether the delivery was successful. I will define it successful if the final mailserver accepted the mail for delivery.
I saw that when you send an email you can get a messageId that uniquely identifies your email:
SendEmailRequest request = new SendEmailRequest(from, destination, message);
SendEmailResult result = service.sendEmail(request);
String messageId = result.getMessageId();
However I saw that you can get only aggregated statistics, for example with SendDataPoint (Represents sending statistics data. Each SendDataPoint contains statistics for a 15-minute period of sending activity).
I'm not using SES to send bulk emails, but personalized notifications on a very low volume and I'd be interested to check every single message.
Did I overlook something? Is it possible to do this type of check with SES?
Amazon does provide a mechanism for you to capture bounces, which provides you with contrapositive verification.
You can create a mailbox to receive bounce notifications, then tell SES to forward bounce notifications there. e.g.:
request.setReturnPath("bounces#example.com");
You can then write code to periodically check that mailbox, and parse the messages for the destination email address.
Amazon provides a brief explanation of how they handle bounces & complaints here:
http://aws.amazon.com/ses/faqs/#37
However, if you want to check if the message avoided the spam filter or was read by the end user, that is beyond the scope of SES (although they work hard to ensure deliverability).
We use Bouncely.com. You simply set the ReturnPath to bounces#bouncely.com and it tracks all the bounces and spam reports. It also has an API that allows us to unsubscribe users automatically.
Use Amazon Simple Notification Service and define an HTTP endpoint to receive notification in case of email bounces. Works perfectly.
Hi
I have to send am mail(like an notification) to all the persons who fulfill some criteria.
The mail id will be taken from the database and sent the mail
Where should I look for the implementation in JAVA so that I can sent the a mail to many person.
Thanks
Have a look at the javax.mail Package
Links:
http://java.sun.com/products/javamail/javadocs/javax/mail/Message.html#addRecipient%28javax.mail.Message.RecipientType,%20javax.mail.Address%29
And as Message.RecipientType you should use Message.RecipientType.BCC to not showing the every address to every recipient
Google Keywords: Java Mail BCC
This is how to send email using Java: http://www.javabeat.net/tips/33-sending-mail-from-java.html
To send email to many addresses, just send the same email with different 'to' address
There are several ways to go about this. Assuming you know how to query the database to get the mail and recipients and how to actually send (a single) mail - it's really up to preferences.
Personally I prefer to simply put all recipients in "the BCC-field" and then actually send the mail to a dummy address or my own. That way none of the recipients will be disclosed to the others. If that is not an issue - just put 'em all in the "To-field".
(if in fact querying database and sending mail is the real issue - I'm sure there are quite a few references on this site)
The Apache Commons Email library in an excellent Java API for sending Email. You can use the approach taken by #mbanzon to send the list by adding Bcc fields.
How I can track an email?
I' m using java on the server side for sending emails. I want to track whether it is delivered , opened, etc... How I can do that ?
This is not a Java specific issue.
You can create an HTML email, and embed an invisible gif which will report back to your server. Some software like Outlook and some web mail programs will block this for untrusted emails.
You can request a return receipt. Many mail programs ignore this entirely, and the ones which don't usually ask the user if they want to send it.
Example:
email.AddHeaderField("Disposition-Notification-To","<g.revolution#stackoverflow.com>")
There is no way to ensure that you always get the delivery or open-message notification.
Mailservers may accept the mail and drop it afterwards.
users may read the mail but dismiss the notification.
"Webbugs" (aka images in the html source of the mail that include a special token that allows the mail to be recognized) don't work in most email programs.
As a matter of fact it's very unlikely that you can see that someone got the message.
What you could do is to keep the message on your server and only send a link. If the user clicks that you can be pretty sure that he got the message. But thankfully many users would not click on such links because it's used in fraud and spam.
I suppose you're sending it through SMTP. Whenever your mail is sent to your SMTP server, your java program has no control of it:
1) If you want to know if your mail has been delivered, you should contact your SMTP server somehow (if the SMTP server is outside your control then forget that) and see if your mail has been sent.
2) You can't know if a mail has been opened by its receiver. The maximum you can do is set a flag that the mail requires acknowledgement, but that depends if the user explicitly wants to send that acknowledgment. Other possibility is set some link to your site within the mail that should be clicked to see the content. You will be able to track if the user clicked that link.
what you can do is -
you have to embed an invisible image in the body in which the src will call the page in server and log that event, you can only do it in HTML encoding.
example -
<img src="ImageServer.aspx?imageID=track.jpg& custID=134ghxx34343ai& campID=32434"/>
and then in ImageServer.aspx there will a handling code which will log that event or save it to database.
example -
private void Page_Load(object sender, System.EventArgs e)
{
// content type should be resolved programmatically
Response.ContentType = "image/jpeg";
if (!IsPostBack) Track();
Response.WriteFile(GetImageFileByID());
}
In case you send HTML email, you could add a 1x1 pixel image with some tracking parameters, that calls back to your webserver. It's not 100% reliable since some email clients (and users) block images in emails.
You can add something like
<span style="display:none">Tracking no: ${TRACK_NO}</span>
to the body of the email. This should always be in the response unless the email client strips it out.