Обрабатывать умлауты (не-ASCII-символы) в postfix sendmail (отправка почты на консоли) - PullRequest
2 голосов
/ 23 ноября 2011

Я написал приложение на C ++, которое должно отправлять электронные письма.

Это делается путем вызова

/usr/sbin/sendmail -f [sender] -t

и последующей записи заголовков и тела письма на стандартный ввод процесса sendmail..

Все работает нормально - за исключением умлаутов или других символов, не входящих в ASCII.Как я могу заставить их работать правильно?

Я уже пытался установить

Content-Type: plain-text; charset=ISO-8859-1  

в качестве заголовка письма, а также

Content-Type: plain-text; charset=UTF-8

ничего не изменилось.Похоже, этот заголовок игнорируется.

Ответы [ 2 ]

4 голосов
/ 09 декабря 2011

Все что угодно, кроме ASCII, в сообщении электронной почты, как правило, должно быть закодировано как quote-printable или base64 . Заголовки Content-Transfer-Encoding и Content-Type затем устанавливаются соответствующим образом, чтобы получатель знал, как декодировать сообщение обратно в текст, отличный от ASCII.

Вот пример bash, который иллюстрирует, как это можно сделать в командной строке:

#!/bin/bash
message="Hellö ümläüts"
encoded=$(base64 <<< "$message")

/usr/sbin/sendmail -t <<< "From: sender@example.com
To: recipient@example.com
Subject: Dear friend
Content-Transfer-Encoding: base64
Content-Type: text/plain; charset="utf-8"

$encoded"

Необходимо указать, какую кодировку символов использовали для преобразования строки в двоичную, прежде чем данные были закодированы в base64.

В этом примере используется utf-8, поскольку это стандартная платформа по умолчанию, поэтому большинство оболочек будет использовать utf-8 при преобразовании строки в двоичный файл и передаче его в base64 в stdin.

0 голосов
/ 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()

Надеюсь, это поможет вам.

...