Как отправить специальные символы через почту из сценария оболочки?

У меня есть сценарий, который работает на кроне, что выводы некоторый текст, который мы отправляем в 'почтовую' программу. Общая линия похожа на это:

./command.sh | mail -s "My Subject" destination@address.com -- -F "Sender Name" -f sender@address.com

Проблема состоит в том, что текст, сгенерированный сценарием, имеет некоторые специальные символы - é, ã, ç - так как это не находится на английском языке. Когда электронное письмо получено, каждый символ заменяется??.

Теперь я понимаю, что это происходит, скорее всего, из-за кодирования, которое не установлено правильно. Что самый легкий путь состоит в том, чтобы зафиксировать это?

21
задан JohnWithoutArms 25 June 2010 в 17:44
поделиться

2 ответа

Вероятно, это не проблема командной строки, а проблема с набором символов. Обычно при отправке электронной почты используется набор символов iso-8859-1 . Скорее всего, текст, который вы вводите в процесс, не имеет кодировки iso-8859-1. Проверьте, какая кодировка используется для любого источника данных, из которого вы получаете текст.

Обязательная ссылка на «хорошее чтение»: Абсолютный минимум, каждый разработчик программного обеспечения должен абсолютно точно знать о Unicode и наборах символов (без оправданий!)

По поводу вашего обновления: В этом случае, если вы введите специальные символы вручную, ваш терминал может использовать кодировку UTF-8. У вас должна быть возможность преобразовать набор символов файла, например, с помощью iconv . Альтернативой может быть указание mail использовать кодировку UTF-8, но IIRC это не совсем тривиально.

0
ответ дан 29 November 2019 в 20:24
поделиться

Вы правы, предполагая, что это проблема кодировки. Вам необходимо установить соответствующие переменные среды в начало вашего 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
11
ответ дан 29 November 2019 в 20:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: