当我在寻呼机中查看消息时,mutt 在日期标题中显示 UTC 时间,而不是我的本地时区。索引视图正确显示当地时间。我发现这个旧的邮件列表帖子它描述了如何获取本地时间以显示在屏幕底部的状态栏中,但这仍然无法“修复”屏幕顶部的日期标题中的时间。有没有办法让寻呼机将日期标题时间转换为本地时间?
答案1
索引中的格式由设置控制index_format
——它是由 mutt 生成的。标Date
头不受 mutt 控制,它是刚刚显示的消息中包含的标头。如果它显示 UTC 时间,那是因为发送服务器决定在生成标头时使用 UTC。更改它的唯一方法是实际更改消息本身,无论是在您收到消息时还是在查看消息时。
更改它意味着向您的邮件传递代理添加一个过滤器,但它需要足够复杂才能解析现有Date
标头并重写它。当您查看消息时,让 mutt 重新格式化消息几乎肯定会更好。您可以设置display_filter
属性到可执行文件,它会在显示之前通过管道传输您通过可执行文件打开的任何消息。
您需要编写一个程序或 shell 脚本来读取消息的每一行并用日期标头替换该行,或者找到一个现有脚本(有一个这里这可能会起作用,尽管看起来确实没有必要涉及临时文件)
答案2
http://www.mail-archive.com/[电子邮件受保护]/msg44341.html
这建议使用“pager_format”,使其显示本地时区的字母日期:
设置 pager_format="%4C %Z %[!%b %e 位于 %I:%M %p] %.20n %s%* -- (%P)"
答案3
在您.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\""
Date:
如果消息头包含有效的 RFC 格式日期,这会将消息中的标题(仅用于显示)更改为您的本地时区。如果提供的日期格式不正确(毕竟我们正在处理不受信任的用户输入),它将被保留。为了对抗可能通过标头注入 shell 代码的尝试,该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"
答案4
根据 Gilles 的建议,这里有一个使用临时文件和formail
.
#!/bin/bash
TMPFILE=$(mktemp)
# save the message to a file
cat - >"$TMPFILE"
# extract the date header
DATE=$( formail -xDate: < "$TMPFILE" )
# convert to the current timezone (defined by TZ)
DATE=$( date -R -d "$DATE" )
# output the modified message
echo "Date: $DATE"
formail -fI Date < "$TMPFILE"
# clean up
rm -f "$TMPFILE"