У меня есть псевдоним канала в 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 вызывает исполняемый файл, но установил локальную командную оболочку как sh
похоже, не помогло. Я прочитал большую часть документации по postfix (http://www.postfix.org/pipe.8.html, http://www.postfix.org/local.8.html, http://www.postfix.org/aliases.5.htmlи т. д.), но не могу найти способ сделать это.
Выход locale
для 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=
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
Для полноты:
Postfix прочитает /etc/default/postfix
если он существует (по крайней мере, в Debian).
С момента пересылки LANG
уже является частью export_environment
по умолчанию вы можете добавить
LANG=en_US.UTF-8
к /etc/default/postfix
(или, может быть, источник /etc/default/locale
там) вместо изменения export_environment
.