我写了一个需要发送电子邮件的C ++应用程序。
通过调用
来完成此操作/usr/sbin/sendmail -f [sender] -t
然后将邮件标题和正文写入sendmail进程的标准输入。
一切正常 - 除了变音符号或其他非ASCII字符。 如何让它们正常工作?
我已经尝试设置
Content-Type: plain-text; charset=ISO-8859-1
作为邮件标题,也是
Content-Type: plain-text; charset=UTF-8
没有改变任何事情。似乎忽略了这个标题。
答案 0 :(得分:4)
电子邮件中除ASCII之外的任何内容通常应编码为quoted-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,因为这是一个常见的平台默认值,因此大多数shell在将字符串转换为二进制文件并将其传递给stdin上的base64
时会使用utf-8。
答案 1 :(得分:0)
在这个问题的答案之后,我写了一个bash函数来向收件人发送电子邮件。该函数通过执行base64编码发送utf-8编码的邮件并在主题和内容中使用utf-8字符。
发送纯文本电子邮件:
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()
希望这可以帮到你。