Подтвердить что ты не робот

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

У меня есть script, который работает на cron, который выводит текст, который мы отправляем в программу "mail". Общая строка выглядит так:

./command.sh | mail -s "My Subject" [email protected] -- -F "Sender Name" -f [email protected]

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

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

4b9b3361

Ответ 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, которая не является полностью тривиальной.