Как отправить специальные символы по почте из скрипта оболочки? - PullRequest
19 голосов
/ 25 июня 2010

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

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

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

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

Ответы [ 7 ]

21 голосов
/ 30 ноября 2011

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" me@mail.com

11 голосов
/ 25 июня 2010

Вы правы, полагая, что это проблема кодировки. Вам необходимо установить соответствующие переменные окружения в начале вашего 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 ' в вашей оболочке, а затем сравните с выводом cronjob, который выполняет ту же команду.

Повторное редактирование : Хорошо, так что это не проблема env var.

Я предполагаю, что вы используете mailx, так как это наиболее распространенный в наши дни. Это manpage говорит:

Набор символов для исходящих сообщения не обязательно одинаковы как тот, который используется на терминале. Если исходящее текстовое сообщение содержит символы не представимые в US-ASCII, используемый набор символов должен быть объявлен в своем заголовке. Допустимые значения могут быть объявлены используя переменную sendcharsets,

Итак, попробуйте добавить следующие аргументы при вызове mail:

-S sendcharsets=utf-8,iso-8859-1
4 голосов
/ 03 февраля 2014

Я написал функцию bash для отправки письма получателям. Функция отправляет письма в кодировке utf-8 и работает с символами utf-8 в теме и содержимом, выполняя кодировку base64.

Чтобы отправить текстовое электронное письмо:

send_email "plain" "from@domain.com" "subject" "contents" "to@domain.com" "to2@domain.com" "to3@domain.com" ...

Для отправки электронного письма в формате HTML:

send_email "html" "from@domain.com" "subject" "contents" "to@domain.com" "to2@domain.com" "to3@domain.com" ...

Вот код функции.

# 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()
3 голосов
/ 02 июля 2015

Просто для того, чтобы дать дополнительную информацию для ответа KumZ: если вам нужно указать больше заголовков с помощью ключа -a, не стесняйтесь добавлять их, как показано ниже (обратите внимание на многопользовательский тип -a).

2 голосов
/ 02 июля 2015

Вы можете использовать команду sendmail напрямую без mail wrapper / helper.
Это позволит вам сгенерировать все заголовки, необходимые для "необработанного" тела UTF-8
(UTF-8 упоминается в asker'sкомментарии),

WARNING-1 :
Не 7 бит / ASCII символов в заголовках (например, Subject:, From:, To:) require специальная кодировка
WARNING-2 :
sendmail может разбивать длинные строки (> 990 байт).

SENDER_ADDR=sender@address.com
SENDER_NAME="Sender Name"
RECIPIENT_ADDR=destination@address.com
(
# 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
0 голосов
/ 07 апреля 2018

используйте параметр -o message-charset="utf-8", например:

sendemail -f your_email -t destination_email -o message-charset="utf-8" -u "Subject" -m "Message" -s smtp-mail.outlook.com:587 -xu your_mail -xp your_password
0 голосов
/ 25 июня 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...