Sending Timezone-Aware Email with UTL_SMTP
I’m back again with another in what I hope will be a long line of “Quick Tips for Newbies” series.
At The Pythian Group, we have employees all over the globe, from our headquarters in Ottawa to regional offices in Boston, Prague, India and Sydney, and a few scattered remote workers in Seattle, Paris, Kiev, Brazil, South Africa and Wisconsin, among other places. In other words, we are spread across multiple timezones, and since it wasn’t too long ago that everyone was in Ottawa, this is something that still presents little quirks.
One such quirk involved email generated by one of our internal Oracle instances—via a stored procedure that used
UTL_SMTP to send the messages—did not have timezone information in the “Date” email header. As a result, they would be stamped with the hour in Eastern timezone (Ottawa time), but the mail clients would think that hour was local. Depending on where you are relative to Ottawa, this could be many hours in the past or future. Of course, this wouldn’t be noticed if you were in Ottawa or even Boston, both in Eastern. For the rest, it was at the very least, an annoyance—but one that is easily fixed.
Looking at the PL/SQL stored procedure that we used to generate email messages, I saw that the “Date” header was being built with this code:
date_hdr := 'Date: '||to_char(sysdate,'dd Mon yy hh24:mi:ss');
The fix is almost trivial—just use
SYSTIMESTAMP instead of
SYSDATE, and include the timezone in the
date_hdr := 'Date: '||to_char(systimestamp,'dd Mon yy hh24:mi:ss tzhtzm');
Voila! Emails now had a full Date header. And there was much rejoicing from around the world.
Here’s a quick query to highlight the difference:
SQL> select to_char(sysdate,'dd Mon yy hh24:mi:ss') from dual; TO_CHAR(SYSDATE,'D ------------------ 01 Dec 08 18:50:02 SQL> select to_char(systimestamp,'dd Mon yy hh24:mi:ss tzhtzm') from dual; TO_CHAR(SYSTIMESTAMP,'DD ------------------------ 01 Dec 08 18:50:10 -0500
Even if you aren’t sending email to all the ends of the Earth, it won’t hurt to make your messages timezone-aware. I’m sure it will save some confusion and frustration down the line.
Note: I discovered the fix via this blog post, which seems to be invite-only at the time of this writing.