Как отправить специальные символы по почте из оболочки script?
У меня есть script, который работает на cron, который выводит текст, который мы отправляем в программу "mail". Общая строка выглядит так:
./command.sh | mail -s "My Subject" [email protected] -- -F "Sender Name" -f [email protected]
Проблема в том, что текст, созданный script, имеет некоторые специальные символы - é, ã, ç - поскольку он не на английском языке. Когда получено электронное письмо, каждый символ заменяется на.
Теперь я понимаю, что это, скорее всего, связано с неправильной настройкой кодировки. Каков самый простой способ исправить это?
Ответы
Ответ 1
My /usr/bin/mail
символически привязан к /etc/alternatives/mail
, который также символически связан с /usr/bin/bsd-mailx
Мне нужно было указать кодировку в заголовке почты. (-S
здесь не поддерживается.)
cat myutf8-file | mail -a "Content-Type: text/plain; charset=UTF-8" -s "My Subject" [email protected]
Ответ 2
Вы правы, полагая, что это проблема с кодировкой. Вам нужно установить соответствующие переменные среды в начало вашего 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 vars установлены в вашей оболочке.
Чтобы проверить, выполните 'locale' в своей оболочке, затем сравните с выходом cronjob, который выполняет ту же команду.
Re-Edit: Хорошо, так что это не проблема env var.
Я предполагаю, что вы используете mailx, так как это самый распространенный в настоящее время. В manpage говорится:
Набор символов для исходящих сообщения не обязательно одинаковы как тот, который используется на терминале. Если Исходящее текстовое сообщение содержит символы, не представимые в US-ASCII, используемый набор символов должен быть объявлен в его заголовке. Допустимые значения могут быть объявлены используя переменную sendcharsets,
Итак, попробуйте добавить следующие аргументы при вызове почты:
-S sendcharsets=utf-8,iso-8859-1
Ответ 3
Я написал функцию bash для отправки электронной почты получателям. Функция отправляет сообщения, закодированные utf-8, и работает с символами utf-8 в теме и контенте, делая кодировку base64.
Чтобы отправить текстовое сообщение электронной почты:
send_email "plain" "[email protected]" "subject" "contents" "[email protected]" "[email protected]" "[email protected]" ...
Чтобы отправить HTML-адрес электронной почты:
send_email "html" "[email protected]" "subject" "contents" "[email protected]" "[email protected]" "[email protected]" ...
Вот код функции.
# Send a email to recipients.
#
# @param string $content_type Email content mime type: 'html' or 'plain'.
# @param string $from_address Sender email.
# @param string $subject Email subject.
# @param string $contents Email contents.
# @param array $recipients Email recipients.
function send_email() {
[[ ${#} -lt 5 ]] && exit 1
local content_type="${1}"
local from_address="${2}"
local subject="${3}"
local contents="${4}"
# Remove all args but recipients.
shift 4
local encoded_contents="$(base64 <<< "${contents}")"
local encoded_subject="=?utf-8?B?$(base64 --wrap=0 <<< "${subject}")?="
for recipient in ${@}; do
if [[ -n "${recipient}" ]]; then
sendmail -f "${from_address}" "${recipient}" \
<<< "Subject: ${encoded_subject}
MIME-Version: 1.0
From: ${from_address}
To: ${recipient}
Content-Type: text/${content_type}; charset=\"utf-8\"
Content-Transfer-Encoding: base64
Content-Disposition: inline
${encoded_contents}"
fi
done
return 0
} # send_message()
Ответ 4
Просто, чтобы дать дополнительную информацию для ответа KumZ:
если вам нужно указать больше заголовков с ключом -a, не стесняйтесь их добавлять, как это (обратите внимание на polyusage -a).
echo /path/to/file | mail -s "Some subject" [email protected] -a "From: Human Name <[email protected]>" -a "Content-Type: text/plain; charset=UTF-8"
Ответ 5
Вы можете использовать команду sendmail
непосредственно без mail
wrapper/helper.
Это позволит вам генерировать все заголовки, необходимые для "сырого" тела UTF-8
(UTF-8 упоминается в комментариях квитанции),
Внимание-1:
Non 7bit/ASCII символы в заголовках (например, Subject:
, From:
, To:)
требуют специальное кодирование
ВНИМАНИЕ-2:
sendmail может сломать длинные строки ( > 990 байт).
[email protected]
SENDER_NAME="Sender Name"
[email protected]
(
# BEGIN of mail generation chain of commands
# "HERE" document with all headers and headers-body separator
cat << END
Subject: My Subject
From: $SENDER_NAME <$SENDER_ADDR>
To: $RECIPIENT_ADDR
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
END
# custom script to generate email body
./command.sh
# END of mail generation chain of commands
) | /usr/sbin/sendmail -i -f$SENDER_ADDR -F"$SENDER_NAME" $RECIPIENT_ADDR
Ответ 6
Это, вероятно, не проблема командной строки, а проблема набора символов. Обычно при отправке E-Mails набор символов будет iso-8859-1
. Скорее всего, текст, который вы вводите в процесс, не кодируется iso-8859-1. Проверьте, что такое кодировка любого источника данных, из которого вы получаете текст.
Обязательная ссылка "хорошее чтение": Абсолютный минимум Каждый разработчик программного обеспечения Абсолютно, положительно должен знать о юникодном и символьном наборах (без отговорок!)
Повторите свое обновление: В этом случае, если вы вводите специальные символы вручную, ваш терминал может использовать кодировку UTF-8. Вы должны иметь возможность преобразовать набор символов файла, используя iconv
, например. Альтернативой было бы сказать mail
использовать кодировку UTF-8, но IIRC, которая не является полностью тривиальной.