I've written an email application in PHP that handles very large mailing lists. Is there a way to find out what emails are opened and by who? Any solution will do as long as it can tell me if the user has actually received and opened the email. I do not want to use email receipts either as it may put off recipients.
If it's relevant, I'm using the codeIgniter framework.
You can accomplish this by including a small tracking image in every email that is sent out.
<img src="http://yourdomain.com/tracking/1x1.gif?cId=12345&uId=56789">
Use mod-rewrite to push everything beyond '/tracking/' into your analytics script, snag the query_string and return a 1x1 gif to the email clients.
From Campaign Monitor:
http://help.campaignmonitor.com/topic.aspx?t=89
When each email is sent out, we
automatically add a piece of code that
requests a tiny, invisible image from
our web servers. So when a reader
opens the email, the image is
downloaded, and we can record that
download as an open for that specific
email.
It is important to understand that the
open rate is not a 100% accurate
measure. Recording an 'open' can only
happen if the reader's email client is
capable of displaying html with
images, and that option is turned on.
So if you are sending text-only
emails, there is no way to record open
rates. Similarly, people reading your
html email without images showing will
not be recorded as opens (unless they
click a link).
Another issue is that your readers may
have a preview pane in their email
client. That preview pane might be
displaying your email automatically
(and therefore downloading the images)
without the reader ever having to
click on it or read it.
So you should never take your open
rate as a hard and fast number,
because you can never know the true
figure. It is much better used as
general guide, and as a way of
measuring the trends on your email
campaigns.
You can put a tiny invisible img in each email, each image named differently to corespond with a specific email. Then you parse your access logs and see which images have been requested and you know which emails have been opened.
It's not fool proof but i've seen some companies use this method.
There's read receipts, but those are only supported by specific clients (ie, Outlook), and even then they are given the option to not notify you of their reading it.
The only other option is to communicate with your server when they read the email. To do this, you can implement a tracking pixel, which is a 1x1 transparent gif. You can intercept the response on your server and log the time, date, ip address, etc.
This still isn't foolproof though, because some clients such as gmail don't show images by default.
You can read more here: http://en.wikipedia.org/wiki/E-mail_tracking
Related
Emails containing requested reminders are sent to users daily. My goal is to create a calendar in each marking days in which they opened the email in green. This requires tracking whether the user opens or does not open their email on a given day.
Mailchimp present their method in a blog post
When you send campaigns through MailChimp, we embed a tiny invisible graphic in the bottom of your HTML email... When someone opens your email and views the images within it, that
graphic is downloaded from our server, and it's recorded as an open on
your campaign report.
To break this process down into steps:
1) Including graphic in each email (sent with chron job) unique to user
2) Writing a script that runs whenever the graphic is downloaded from the server and changes an "email_opened" value in a User History table
So my questions:
·How does #1 work? Furthermore, how can I create a system for automatically generating a unique graphic for each user?
My current idea is to send the image from a table using PHP such as:
<? $img_data = file_get_contents("images/phpimage.png"); header("Content-type: image/png"); echo $img_data; ?>
and then somehow set it up to send a different image depending on the email address.
·Where should script #2 be placed and in which language should it be written? My initial thought was php and within the email, but if it's the moment the graphic is downloaded from the server then surely it should be server-side. How would this work?
To "include" an image in an HTML-format email, what you actually have to do is create an <img> tag where the src attribute contains a URL which points back to an image file on your server. (You can't run PHP "within the email", as you contemplated, btw).
For this purpose though, the image could be invisible (using style properties, or by setting height/width to 0), and the src could actually point to a script on your web server which accepts a user ID and email ID as parameters and renders an empty image. The unique URL could be something like http://www.example.com/logEmail?userID=12345&emailID=6789 for a particular user/email combination. The image content that you return from this script is not important and does not need to be unique - remember, it's invisible anyway. Just return a 1px by 1px white square.
When the script runs, before it renders the image back and completes the request, it simply updates your database at the same time with to indicate that the email with the given ID has been read by the user with the given ID.
As for the language, that's entirely up to you depending on how/where you're planning to host the web application. You can achieve what you want in any of the popular server-side languages.
The MailChimp article you linked to makes an important caveat though - this technique won't work if you send any users emails in plain-text for any reason, and nor will it work if the user's mail client is not set to download images (corporate Outlook installs are often set like this by default, for instance, until the user clicks to allow them to be downloaded, and/or marks the sender as safe). So you can't rely on this data as a 100% accurate guide to whether your users are reading your emails or not. If you get a response for a particular email, you can say with certainty that they opened it (N.B. "opening" and "reading" and "understanding" are absolutely not the same thing!!). But if you don't get a response, you cannot in fact be certain whether they opened the email or not.
I will soon be tasked with making an email campaign manager, and part of it will be a statistics screen that will show how many emails were delivered successfully, how many were not, and how many people actually opened the email.
The main thing I can't get my head around is how to code the part that deals with people opening the email.
I know you could probably do it with a 1x1 white pixel, and then perhaps somehow have the server detect that it was loaded based on the image file name and trigger a script from that. But not all email clients have images enabled and in some cases they are disabled completely etc. I also think this method is quite dated?
I would like to know how the big players do this like Cheetah Mail etc.
What is the best way to do this using PHP/MySQL?
Thanks for your reply.
These are opted in subscribers and there will be afew links in the body of the email that will go to certain places on our websites. Tracking of those is easy because the link will have a string appended to it which will make it easy to detect if they visit the site from an email.
If whitepixel is the way to go at the moment, how do I go about linking the loading of that pixel to a script that is triggered on my server?
Firstly, I'd suggest using an off-the-shelf solution for this, rather than building your own - it's a complicated field, and others have already solved the problems.
As for the specific question, you can create an image tag in each mail along the following lines:
<img src="http://myserver.com/images/transparent.php?emailID=$IDofCurrentCampaign&uid=$emailAddressOfRecipient">
When this image is requested, the query string means it won't be cached, and your php script can store the campaign and email address in a database; you then need to respond with an image mime type, and send back a transparent gif.
Well most people do not like being tracked like that and thus will not load your pixel automatically.
Still, the white pixel "beacon" is the best method at the moment.
You could of course ask your viewers to click a link, but that will also require action from the receiver and will not give you the real number of people that opened the email.
I need to create a PHP Newsletter System which detects when an e-mail is read, forwarded, printed and deleted. The response is then caught and inserted in a database.
How should I approach this?
Thanks!
The only feedback you can get are from pictures loaded by the email client (often called beacon), which can only tell you that this particular client loaded that picture. Some person won't load the images although they read the e-mail, and you cannot do anything about forwarding, printing or deletion afaik.
In email
Web bugs are frequently used in spamming (sending unsolicited commercial email) as a way of "pinging" to find which spam recipients open (and presumably read) before deleting it.
Tracking in email can be disabled by:
Many web bugs can be avoided by turning off HTML display and displaying only the text.
Turning off the display of images while still using HTML may still allow other techniques to be used.
https://en.wikipedia.org/wiki/Web_bug#In_email
I am sending an html email with php and it includes an image. Some email programs, such as gMail have a 'display images' button. The user has to click on that in order for the images in the email to show up.
Is there any way I can force email programs to show images that are sent within html emails generated by php?
As a rule of thumb, email clients are configured to display attached images by default (e.g. those with a cid: URI scheme) and not load remote images (which can include tracking information).
If you attach all the images, then you'll usually get them showing up (while inflating your SMTP bandwidth use along with that of your recipients (which can make you unpopular)).
I'm afraid not. The main reason email programs block images is because images are often used to 'report back' to whoever sent the email that the email has been opened. This is a common tactic used by spammers. Also, malicious code is often attached to images and downloading these images is how such code gets executed. Another reason email programs block images.
No, you can't force programs you didn't write yourself to do anything.
Email is hugely variable, and in general you're going to see different results in different places. That being said: There's no general way to force an email client to display images; this is why most email now includes a link at the top indicating that if it doesn't display correctly the user should click on it (which then takes the user to a standard HTML page outside the email client's image/javascript/everything-else-blocking grasp).
You specifically mention gmail so it's worth pointing out that if you embed (CID URI) the images they won't show inline, they'll show as attachments at the bottom of the message.
Doubt it, it would be a security issue if the 'src' of an image opened up a cross site scripting attack.
Cross site request forgery
Customers of a bank in Mexico were attacked in early 2008 with an
image tag in email and were sent
through their home routers to the
wrong website.
You can, but unfortunatley Trident, which is the IE rendering engine doesn't support it (surprise, surprise), but it is technically possible to include images in the html itself - see http://en.wikipedia.org/wiki/Data_URI_scheme
The last place I worked, we were sending out emails that had images in them that would come up automatically, in outlook at least, without me having to explicitly click a show images button.
When I inquired, another developer explained that they simply copied the encoded block of the image from an already sent email into the body of the email. I think this may be a weird sort of workaround they stumbled upon. I don't know if this adds more weight than an attachment, but I could see how an email reader would see an attachment and then ask the user as opposed to read it already in the body and just show it...
once we send email from php using mail() function, is there any way to check either mail is open or not?
may be any type of database insertion code in email..?
or calling any function from website?
any possibility.........
i search on internet all the day but did't found any ans.
Thanks
Small images - called Web Bugs - are the only direct way as Szere Dyeri points out, but they are increasingly frowned upon and blocked by every major mail client for privacy reasons now. I would not consider them a reliable way to tell whether an E-Mail has been read any more.
There is a legitimate way to request a read receipt by adding the following header to the E-Mail:
Disposition-Notification-To: your#address.com
Sending of this notification can be turned off by the recipient of course.
Add an invisible small sized image to the email content. And, let the image point to a unique url on your website. You will know that email is opened once that url is accessed. But this will not work in email clients that does not show images in the emails by default.
I found this web service called Get Notify. They claim they do this for free but you need to verify for yourself.
The only way to do this would be to include an image in the email that resided on your server which includes a key to match to the user you are sending the email to. For example, I send an email to Joe#mail.com. In my database (or other storage system) I have Joe#mail.com matched to key 0100. In his email I include an image, like
<img src="http://www.myserver.com/image/?key=0100" />
On your server, /image/ needs to return an image, even a 1 pixel .png. Now you have the key that the user was assigned and can act accordingly.
Many people responded that adding a "tracking image" is a "frowned upon" method and 'considered "questionable" activity'.
Out of curiosity lets say we didn't include a separate tracking image but rather we included this method in an existing image like for instance added it onto your companies logo image like:
http://mycompany.com/images/logo.png?track=2742'>
At least with this method your tracking image won't get blocked by any scanning applications.
One legitimate way to do this is to only send textual information in the email asking the user to follow a link which you can then track. Something along the lines of:
//lots of good info to identify yourself/company
Thank you for your request...
Please follow this link: http://somewhere/ for tracking information
Unfortunately this leaves it in the users hands to acknowledge your request. This is considered to be the most respectful way to do it.
If your application is not public facing (i.e. an internal app for your company), then the img src method already posted is a good technique.