点(。)s在这里缺失&在发送PEAR Mail_Mime电子邮件时,在邮件html中

时间:2015-07-05 05:53:39

标签: php email pear mime

我使用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.pnghttp://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。

3 个答案:

答案 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']);