How do I configure mutt to display the date header in my local time zone in the pager?
The formatting in the index is controlled by the index_format
setting -- it's generated by mutt. The Date
header isn't controlled by mutt, it's a header included with the message that just gets displayed. If it shows UTC time it's because the sending server decided to use UTC when generating the header. The only way to change it is to actually change the message itself, either when you receive it or when you view it.
Changing it as it comes in means adding a filter to your mail delivery agent, but it needs to be sophisticated enough to parse the existing Date
header and rewrite it. It's almost certainly better to just have mutt reformat the message when you look at it. You can set the display_filter
property to an executable file, and it will pipe any message you open through the executable before displaying it.
You'll need to write a program or shell script that reads each line of the message and replaces the one with the Date header, or find an existing script (there's one here that might work, although it doesn't seem like it should really be necessary to involve a temporary file)
http://www.mail-archive.com/[email protected]/msg44341.html
This suggests using the 'pager_format', to make it show the letter date in the local timezone:
set pager_format="%4C %Z %[!%b %e at %I:%M %p] %.20n %s%* -- (%P)"
In your .muttrc
add the following line:
set display_filter="exec sed -r \"s/^Date:\\s*(([F-Wa-u]{3},\\s*)?[[:digit:]]{1,2}\\s+[A-Sa-y]{3}\\s+[[:digit:]]{4}\\s+[[:digit:]]{1,2}:[[:digit:]]{1,2}(:[[:digit:]]{1,2})?\\s+[+-][[:digit:]]{4})/date +'Date: %a, %d %b %Y %H:%M:%S %z' -d '\\1'/e\""
This will change the Date:
header in the message (for display only) to your local timezone if the header contained a valid RFC formatted date. If the provided date format was incorrect (we are dealing with untrusted user input after all) it will be preserved. To combat a possible attempt to inject the shell code through the header the sed
pattern implements a whitelist based on RFC 5322 (this RFC defines the format of the Date:
field).
Note that mutt
limits the command line to be no more than 255 character long, hence I optimised the original sed
command that had stricter whitelist to fit into 255 bytes. If you plan to do other things with the message, then the full sed
command you can put in a script is:
sed -r "s/^Date:\s*(((Mon|Tue|Wed|Thu|Fri|Sat|Sun),\s*)?[[:digit:]]{1,2}\s+(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s+[[:digit:]]{4}\s+[[:digit:]]{1,2}:[[:digit:]]{1,2}(:[[:digit:]]{1,2})?\s+[+-][[:digit:]]{4})/date +'Date: %a, %d %b %Y %H:%M:%S %z' -d '\1'/e"