我在 Postfix 中有一个管道别名,用于将电子邮件传递给一个简单的可执行文件:
test: "|/home/postfix_user/test/test-exe"
此可执行文件所做的就是将一个具有 UTF8 名称的文件写入磁盘。我可以手动运行它:
$ cd /home/postfix_user/test ; ./test-exe ; ls
ACCIÓN.txt
但是,当我通过 Postfix 执行脚本时,收到一条错误消息:
远程服务器返回“<#5.3.0 x-unix; test-exe: /home/postfix_user/test/ACCIN.txt: openFile: 无效参数(无效字符)>”
该错误消息的具体内容(来自 Haskell 程序)告诉我,我的语言环境可能未正确设置为 UTF8。最初,我认为这是因为 Postfix 调用可执行文件的 shell,但将本地命令 shell 设置为 UTF8 似乎没有sh
帮助。我已阅读了大部分 postfix 文档(http://www.postfix.org/pipe.8.html,http://www.postfix.org/local.8.html,http://www.postfix.org/aliases.5.html等),但找不到任何方法来做到这一点。
locale
for的输出postfix_user
确实表明它是 UTF8:
$ locale
LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
答案1
Postfix 默认会导出某些环境变量,可以通过运行找到这些变量postconf -d | grep export_environment
(postconf -d 是 Postfix 实例的所有配置的转储,而不仅仅是你手动设置的配置main.cf
)
至少在我的系统上,默认实例是:
export_environment = TZ MAIL_CONFIG LANG
我不确定该LANG
变量在哪里设置,但 Postfix 是LANG=C
从某个地方获取的。要覆盖此变量,请设置您自己的语言环境。修改该 conf 值以main.cf
指定您要使用的语言环境:
export_environment = TZ MAIL_CONFIG LANG=en_US.UTF-8
答案2
为了完整性:如果存在
,Postfix 将会读取/etc/default/postfix
(至少在 Debian 上)。
由于转发LANG
已经是 的export_environment
默认设置,您可以添加
LANG=en_US.UTF-8
到/etc/default/postfix
(或者可能来源于/etc/default/locale
那里)而不是改变export_environment
。