У меня есть сценарий, который работает на кроне, что выводы некоторый текст, который мы отправляем в 'почтовую' программу. Общая линия похожа на это:
./command.sh | mail -s "My Subject" destination@address.com -- -F "Sender Name" -f sender@address.com
Проблема состоит в том, что текст, сгенерированный сценарием, имеет некоторые специальные символы - é, ã, ç - так как это не находится на английском языке. Когда электронное письмо получено, каждый символ заменяется??.
Теперь я понимаю, что это происходит, скорее всего, из-за кодирования, которое не установлено правильно. Что самый легкий путь состоит в том, чтобы зафиксировать это?
Вероятно, это не проблема командной строки, а проблема с набором символов. Обычно при отправке электронной почты используется набор символов iso-8859-1
. Скорее всего, текст, который вы вводите в процесс, не имеет кодировки iso-8859-1. Проверьте, какая кодировка используется для любого источника данных, из которого вы получаете текст.
Обязательная ссылка на «хорошее чтение»: Абсолютный минимум, каждый разработчик программного обеспечения должен абсолютно точно знать о Unicode и наборах символов (без оправданий!)
По поводу вашего обновления: В этом случае, если вы введите специальные символы вручную, ваш терминал может использовать кодировку UTF-8. У вас должна быть возможность преобразовать набор символов файла, например, с помощью iconv
. Альтернативой может быть указание mail
использовать кодировку UTF-8, но IIRC это не совсем тривиально.
Вы правы, предполагая, что это проблема кодировки. Вам необходимо установить соответствующие переменные среды в начало вашего crontab.
Должно получиться что-то вроде этого:
LANG=en_US.UTF-8
LC_CTYPE=en_US.UTF-8
При желании используйте LC_ALL вместо LC_CTYPE.
Ссылка: http://opengroup.org/onlinepubs/007908799/xbd/envvar.html
Изменить: Причина, по которой он отображается нормально, когда вы запускаете его в своей оболочке, вероятно, связана с указанным выше Переменные env устанавливаются в вашей оболочке.
Для проверки выполните ' locale ' в своей оболочке, затем сравните с выводом задания cron, которое выполняет ту же команду.
Re-Edit : Хорошо, значит, это не проблема env var.
Я предполагаю, что вы используете mailx, поскольку он сейчас наиболее распространен. На странице руководства сказано:
Набор символов для исходящих сообщения не обязательно совпадают как тот, который используется на терминале. Если исходящее текстовое сообщение содержит символы, не представимые в US-ASCII, используемый набор символов должен быть объявлен в его заголовке. Допустимые значения могут быть объявлены используя переменную sendcharsets,
Итак, попробуйте добавить следующие аргументы при вызове почты:
-S sendcharsets=utf-8,iso-8859-1