Other than a read receipt (gmail, outlook/live), there is no sure-fire way to track whether an email has been read. One could use a "web bug", but an email client that disables automatic loading of images (as most modern ones do) will defeat this method, as would caching, some firewall settings, etc (for examples, see section "Insensitive Pig").
A long-loading image is possible, but again the accuracy depends on a factor you cannot control -- if the email client cancels its request for the image when the user unloads the message. A client may not do so, it may allow the image to "complete" in the background.
With PHP, one would accomplish a long-loading image by sending the image headers, then sleeping a short time, recording the fact that the request is still open, then sleeping again.
Very roughly, this is what such code would look like:
session_start();
function recordViewTime () {
/*
the difference between $_SESSION['_image_start_time'] and
$_SESSION['_image_active'] is, theoretically, your email view time
*/
}
register_shutdown_function('recordViewTime');
header('Content-Type: image/jpeg');
$_SESSION['_image_start_time'] = microtime();
while (true) {
$_SESSION['_image_active'] = microtime();
sleep(1);
}
Obligatory Disclaimer
Users generally don't appreciate this kind of practice. Especially given the current environment for online privacy that sites like Facebook and Google have created by their policies, users are more sensitive and educated than ever about who collects what information and how it is used. Using any kind of hidden or secret method to track user activity on the client side may have negative repercussions should your user tip to the activity.
The value in knowing the effectiveness of your email marketing is high, so the temptation is great, but just understand that the trends in privacy and security related to privacy are building against using this type of practice.
Documentation