Назад | Перейти на главную страницу

Как я могу установить языковой стандарт для скрипта, запускаемого Postfix?

У меня есть псевдоним канала в 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.