如何在Bash邮件脚本中用Linux date命令生成合法邮件日期头
用Linux date命令生成符合规范的邮件日期头
嘿,这个问题我太熟了!写邮件脚本的时候,Date头的格式可是有严格要求的——必须符合RFC 5322规范,不然邮件服务器可能不认,甚至直接扔去垃圾邮件箱。好在Linux的date命令就能直接搞定,给你一步步说:
核心命令(GNU Date,绝大多数Linux发行版适用)
最简单的方式就是直接用date的内置RFC格式输出:
date -R
它会直接输出类似这样的标准结果:
Wed, 15 Nov 2023 14:30:00 +0800
如果你想手动指定格式(更灵活,方便自定义调整),可以用这个命令:
date "+%a, %d %b %Y %T %z"
格式符拆解:
%a:缩写的英文星期几(比如Wed)%d:补零的两位数字日期(比如05)%b:缩写的英文月份名称(比如Nov)%Y:四位完整年份(比如2023)%T:HH:MM:SS格式的时间%z:带符号的时区偏移(比如+0800,对应东八区)
在Bash脚本里的用法
把生成的日期赋值给变量,然后插入到邮件头里就行:
# 生成符合规范的日期 MAIL_DATE=$(date -R) # 写入邮件头(比如追加到邮件文件) echo "Date: $MAIL_DATE" >> my_email.txt
特殊需求处理
- 需要UTC时区的日期:如果你的邮件要求用UTC时间,加上
-u参数即可:date -u -R # 输出示例:Wed, 15 Nov 2023 06:30:00 +0000 - BSD Date(比如macOS环境):如果是在BSD系系统上,
date的参数略有不同,手动格式需要调整时区的输出(去掉冒号):date -j -f "%Y-%m-%d %H:%M:%S" "$(date "+%Y-%m-%d %H:%M:%S")" "+%a, %d %b %Y %T %z" | sed 's/\([+-][0-9][0-9]\):\([0-9][0-9]\)/\1\2/'
关键注意事项
- 一定要严格遵循RFC 5322格式,包括逗号、空格的位置,缩写的星期和月份必须是英文(比如
Wed不能写成周三) - 时区偏移必须准确,
date会自动读取系统时区,如果你需要固定时区,可以先设置TZ环境变量,比如:TZ="America/New_York" date -R
内容的提问来源于stack exchange,提问作者SeamusJ




