Ben*_*ams 16 bash configuration email mutt shell-script
当我在寻呼机中查看消息时,mutt 以 UTC 而不是我的本地时区显示日期标头中的时间。索引视图正确显示本地时间。我发现这个旧的邮件列表帖子描述了如何让本地时间显示在屏幕底部的状态栏中,但这仍然没有“修复”屏幕顶部日期标题中的时间。有什么方法可以让寻呼机将日期标题时间转换为本地时间?
Mic*_*zek 12
索引中的格式由index_format设置控制——它是由 mutt 生成的。该Date头不受狗控制,它包括与只是获取显示的消息标题。如果它显示 UTC 时间,那是因为发送服务器在生成标头时决定使用 UTC。更改它的唯一方法是实际更改消息本身,无论是在您收到它时还是在您查看它时。
在它进来时更改它意味着向您的邮件传递代理添加一个过滤器,但它需要足够复杂才能解析现有的Date标头并重写它。几乎可以肯定的是,当您查看消息时,只让 mutt 重新格式化消息会更好。您可以将该display_filter属性设置为一个可执行文件,它会在显示之前通过管道传输您通过该可执行文件打开的任何消息。
你需要编写一个程序或shell脚本读取消息的每一行,并取代了一个与Date头部,或找到一个现有的脚本(有一个在这里可能的工作,但它似乎并不像它应该需要涉及一个临时文件)
小智 8
http://www.mail-archive.com/mutt-users@mutt.org/msg44341.html
这建议使用“pager_format”,使其显示本地时区中的字母日期:
set pager_format="%4C %Z %[!%b %e at %I:%M %p] %.20n %s%* -- (%P)"
强制性 Perl 解决方案保留“Date”标头,同时添加额外的“Local-Date”标头以包含本地时间版本:
#!/usr/bin/perl -n
use Date::Parse;
use POSIX;
use strict;
if (/^Date: (.*)$/) {
my $datestr = $1;
my $date = strftime ("%a, %d %b %Y %H:%M:%S",
localtime (str2time ($datestr)));
print "Local-Date: $date\n";
}
print;
Run Code Online (Sandbox Code Playgroud)
在您.muttrc添加以下行:
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\""
Run Code Online (Sandbox Code Playgroud)
Date:如果标题包含有效的 RFC 格式日期,这会将消息中的标题(仅用于显示)更改为您的本地时区。如果提供的日期格式不正确(毕竟我们正在处理不受信任的用户输入),它将被保留。以对抗可能试图通过头部中的注入壳代码sed图案器具白名单基于RFC 5322(该RFC定义的格式Date:字段)。
注意,mutt限制了命令行不超过255个字符的长,因此,我优化原始sed命令有更严格的白名单以适应255个字节。如果您打算对消息执行其他操作,则sed可以放入脚本的完整命令是:
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"
Run Code Online (Sandbox Code Playgroud)