2015-07-05 70 views
13

我送使用PEAR的郵件和mail_mime包和下面的示例代碼郵件:點S是缺少在這裏和那裏的郵件的HTML在發送PEAR 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('[email protected]',$sendStart['mime']->headers($sendStart['headers']),$body); 

我面臨着一個通過此代碼發送郵件時出現的奇怪問題。我在電子郵件正文內有圖片,有時圖片不顯示。當我調試該問題時,我發現圖像url中缺少.。但是如果我在發送行之前打印郵件(正如我在代碼中註釋的那樣),它會完美地打印圖像。

正確的圖片網址: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中正確顯示,但在其他客戶端中卻沒有顯示,因爲Outlook中有單獨的代碼(按照代碼)。

有沒有人有任何想法如何調試問題或對這個問題的任何評論。

編輯:

這個問題是沒有與任何特定的標籤做的(雖然我使用圖像標記解釋),我體驗到它在幾個地方,如樣式。

例如:line-heigth:1.5;是原來的,它在發送時更改爲line-heigth:15;

基本上它只是在電子郵件HTML中刪除.這裏&那裏。

+0

什麼是'$ html'和'$ body'的價值? –

+0

其實它的一點點大的html模板,我不能放在問題裏面,雖然我會用相關的圖像部分編輯它,@DaveChen請檢查編輯的問題 –

+0

有趣的...你發送不同的電子郵件爲MS-Outlook?您如何事先知道接收器使用哪種電子郵件客戶端? – arkascha

回答

6

我很確定這是由點填充引起的;因爲該點用作電子郵件中的特殊指示符。您可以在the rfc那裏說:讀到這(強調):

要允許所有用戶組成的文本進行透明傳輸,下面的程序中使用:

  • 之前發送行的郵件文本,SMTP客戶端會檢查該行的第一個字符。如果是一個時間段,則在該行的開頭插入一個附加時間段。
  • 當SMTP服務器收到一行郵件文本時,它會檢查該行。如果該行由單個時段組成,則將其視爲郵件結束指示符。 如果第一個字符是句號,並且該行上還有其他字符,則會刪除第一個字符。

看來你使用撰寫這些郵件並沒有實施的第一個程序的客戶端,而服務器也將郵件發送到實現它;導致點消失。

修復方法是讓您的客戶端實現填充。

2

使用PHPMailer,它會讓生活變得更容易。

+0

由於某些原因,我無法更改電子郵件系統。但謝謝你的建議。 –

0

這裏是它的例子 -

 // Set up the headers that will be included in the email. 
    $recipient = '[email protected]'; 
    $from = '[email protected]'; 

    $headers = array(
     'To'   => $recipient, 
     'From'   => $from, 
     'Return-Path' => $from, 
     'Reply-To'  => $replyto, //based on your need 
     'Subject'  => $subject, 
     'Errors-To'  => '<<a href="mailto:[email protected]">[email protected]</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']); 
相關問題