我使用PEAR的mail和mail_mime包发送邮件,示例代码如下:
$sendStart=array();
require_once('Mail.php');
require_once('Mail/mime.php');
$sendStart['mail'] =& Mail::factory('mail');
$sendStart['mime'] = new Mail_mime("\n");
$sendStart['mime']->setHTMLBody($html);
$sendStart['headers']['Subject']=$title;
$sendStart['headers']['X-SMTPAPI']='{"category": ["MailID-XXX"]}';
$body=$sendStart['mime']->get(array(
'html_charset'=>'UTF-8',
'text_charset'=>'UTF-8',
'head_charset'=>'UTF-8'
));
//echo ($sendStart['mime']->_htmlbody); exit;
$sendStart['mail']->send('xxx@example.com',$sendStart['mime']->headers($sendStart['headers']),$body);
通过此代码发送邮件时,我遇到了一个奇怪的问题。我在电子邮件正文中有图像,有时图像不显示。当我调试问题时,我发现图片网址中缺少.
。但是,如果我在发送行之前打印邮件(因为我在代码中注释掉),它会完美地打印出图像。
正确的图片网址:http://www.domain.com/image.png
:http://www.domaincom/image.png
或http://www.domain.com/imagepng
...等。
HTML代码的一部分,其中包含如下图像:
<table cellpadding="0" cellspacing="0" border="0" class="image-table image-2" align="center" style="float:none;margin-left:auto;margin-right:auto;text-align:left;">
<tbody>
<tr>
<td class="element" style="text-align: left;height: auto;overflow: hidden;-webkit-text-size-adjust: none;">
<!--[if gte mso 9]><img alt="Placeholder Image" src="http://www.domain.com/image.png" style="outline: none; text-decoration: none; display: block; clear: none; float: none; margin-left: auto; margin-right: auto;display:none; mso-hide: none;" align="center" width="394"><![endif]--><![if !mso]><!-- --><img alt="Placeholder Image" src="http://www.domain.com/image.png" style="outline: none;text-decoration: none;display: block;clear: none;float: none;width: 100%;height: auto;max-width: 394px;margin-left: auto;margin-right: auto;*width: 394px;-ms-interpolation-mode: bicubic;" align="center"><!--<![endif]-->
</td>
</tr>
</tbody>
</table>
非常奇怪的是它在outlook中正确显示但在其他客户端中没有显示,因为我有单独的代码(根据代码)。
是否有人知道如何调试此问题或对此问题发表任何评论。
编辑:
这个问题与任何特定标签无关(虽然我使用图片标签解释),我在几个地方体验过它,例如风格。
示例:line-heigth:1.5;
是原始版本,发送时会更改为line-heigth:15;
。
基本上它只是移除.
这里&amp;那里有电子邮件HTML。
答案 0 :(得分:6)
我很确定这是由点填充引起的;因为点被用作电子邮件中的特殊指示符。您可以在the rfc中阅读(强调添加):
要允许透明传输所有用户撰写的文本,请使用以下步骤:
- 在发送一行邮件文本之前,SMTP客户端会检查该行的第一个字符。如果是期间,则在行的开头插入一个额外的期间。
- 当SMTP服务器收到一行邮件文本时,它会检查该行。如果该行由单个句点组成,则将其视为邮件结尾指示符。 如果第一个字符是句点,并且该行中还有其他字符,则会删除第一个字符。
您用来撰写这些电子邮件的客户似乎不实施第一个程序,而发送邮件的服务器确实实施它;导致点消失。
修复方法是让客户端实现填充。
答案 1 :(得分:2)
使用PHPMailer,它会让生活变得更轻松。
答案 2 :(得分:0)
以下是它的例子 -
// Set up the headers that will be included in the email.
$recipient = 'someemail@gmail.com';
$from = 'someemail1@gmail.com';
$headers = array(
'To' => $recipient,
'From' => $from,
'Return-Path' => $from,
'Reply-To' => $replyto, //based on your need
'Subject' => $subject,
'Errors-To' => '<<a href="mailto:errors@example.com">errors@example.com</a>>',
'MIME-Version' => '1.0',
);
// Set up parameters for both the HTML and plain text mime parts.
$textparams = array(
'charset' => 'utf-8',
'content_type' => 'text/plain',
'encoding' => 'quoted/printable',
);
$htmlparams = array(
'charset' => 'utf-8',
'content_type' => 'text/html',
'encoding' => 'quoted/printable',
);
// Create the email itself. The content is blank for now.
$email = new Mail_mimePart('', array('content_type' => 'multipart/alternative'));
// Add the text and HTML versions as parts within the main email.
$textmime = $email->addSubPart($textbody, $textparams);
$htmlmime = $email->addSubPart($htmlbody, $htmlparams);
// Get back the body and headers from the MIME object. Merge the headers with
// the ones we defined earlier.
$final = $email->encode();
$final['headers'] = array_merge($final['headers'], $headers);
// Perform the actual send.
$smtp_params = array();
$smtp_params['host'] = '127.0.0.1';
$smtp_params['port'] = '25';
$smtp_params['persist'] = TRUE;
$mail =& Mail::factory('smtp', $smtp_params);
$status = $mail->send($recipient, $final['headers'], $final['body']);