Pear Mail,如何发送UTF-8编码的纯文本和HTML格式邮件?

13
我正在尝试发送一封既包含文本又包含HTML的邮件,但我无法正确发送正确的头信息。特别地,我想设置Content-Type头信息,但我找不到如何分别为HTML和文本部分设置它的方法。
这是我的代码:
$headers = array(
  'From'          => 'info@mydomain.com',
  'Return-Path'   => 'info@mydomain.com',
  'Subject'       => 'mysubject',
  'text_encoding' => '7bit',
  'text_charset'  => 'UTF-8',
  'html_charset'  => 'UTF-8',
  'head_charset'  => 'UTF-8',
  'Content-Type'  => 'text/html; charset=UTF-8'
);

$mime = new Mail_mime();

$html = '<html><body><b>my body</b></body></html>';
$text = 'my body';

$mime->setTXTBody($text);
$mime->setHTMLBody($html);

$body = $mime->get();
$headers = $mime->headers($headers);
$mail_object =& Mail::factory('smtp', $GLOBALS['pear_mail_config']);
$mail_object->send('test@mydomain.com', $headers, $body);

这是我收到的电子邮件:

From: info@mydomain.com
Subject: mysubject
text_encoding: 7bit
text_charset: UTF-8
html_charset: UTF-8
head_charset: UTF-8
Content-Type: multipart/alternative;
    boundary="=_7adf2d854b1ad792c802a9db31084520"
Message-Id: <.....cut.....>
Date: Mon,  8 Oct 2012 15:40:54 +0200 (CEST)
To: undisclosed-recipients:;

--=_7adf2d854b1ad792c802a9db31084520
Content-Transfer-Encoding: 7bit
Content-Type: text/plain; charset="ISO-8859-1"

my body

--=_7adf2d854b1ad792c802a9db31084520
Content-Transfer-Encoding: quoted-printable
Content-Type: text/html; charset="ISO-8859-1"

<html><body><b>my body</b></body></html>
--=_7adf2d854b1ad792c802a9db31084520--

看起来我设置的Content-Type标头完全被忽略了。我曾经期望有一些setHTMLHeaders和setTXTHeaders函数,但似乎没有这样的东西。我错过了什么吗?如何将两个Content-Type标头都设置为UTF-8?

1个回答

37

我发现这些标题应该以不同的方式书写,特别是其中一些是mime对象的参数,而不是电子邮件标题。然后,应将mime_params数组传递给get()函数。

这是设置标题的正确方法:

$headers = array(
  'From'          => 'info@mydomain.com',
  'Return-Path'   => 'info@mydomain.com',
  'Subject'       => 'mysubject',
  'Content-Type'  => 'text/html; charset=UTF-8'
);

$mime_params = array(
  'text_encoding' => '7bit',
  'text_charset'  => 'UTF-8',
  'html_charset'  => 'UTF-8',
  'head_charset'  => 'UTF-8'
);

$mime = new Mail_mime();

$html = '<html><body><b>my body</b></body></html>';
$text = 'my body';

$mime->setTXTBody($text);
$mime->setHTMLBody($html);

$body = $mime->get($mime_params);
$headers = $mime->headers($headers);
$mail_object =& Mail::factory('smtp', $GLOBALS['pear_mail_config']);
$mail_object->send('test@mydomain.com', $headers, $body);

请记得添加 require_once 'Mail/mime.php'; - Knu
1
肯定地,编码类型应该通过Mime->get()传递。赞同。 - william.eyidi
1
谢谢,终于在这里找到了解决方案,这个脚本可以发送出色的电子邮件,而不仅仅是纯文本。点赞。 - ddlab
为什么选择 'text_encoding' => '7bit'? - juacala
找到了这篇解释7位和8位编码的文章:https://dev59.com/l18e5IYBdhLWcg3wd6Q6 - juacala

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接