2015-07-05 49 views
13

jestem wysyłania poczty za pomocą poczty elektronicznej i mail_mime pakiety gruszka i przykładowy kod jak poniżej:dot s brakuje tu i tam w html poczty podczas wysyłania PEAR Mail_Mime maile

$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); 

jestem obliczu dziwny problem podczas wysyłania wiadomości za pośrednictwem tego kodu. Mam obrazy wewnątrz treści wiadomości e-mail, czasami obrazy nie są wyświetlane. Podczas debugowania problemu wykryłem, że w adresie URL obrazu znajduje się .. Ale jeśli wydrukuję pocztę tuż przed linią wysyłania (jak to skomentuję w kodzie), to drukuje ona idealnie z obrazem.

prawidłowy adres URL obrazu: http://www.domain.com/image.png

w mailu: http://www.domaincom/image.png lub http://www.domain.com/imagepng ... itd

część kodu HTML, który ma obraz jak poniżej:

<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> 

a bardzo dziwne jest to, że wyświetla się poprawnie w widoku, ale nie w innych klientach, ponieważ w przypadku perspektywy mam osobny kod (zgodnie z kodem).

Czy ktoś ma pomysł, jak debugować problem lub komentarz na ten temat.

Zmieniano:

Kwestia ta nie ma nic wspólnego z żadną konkretną znacznika (chociaż to wyjaśnić za pomocą znacznika obrazu), doświadczam go w kilku miejscach, takich jak w stylach.

przykład: line-heigth:1.5; jest oryginałem i zmienia się na line-heigth:15; podczas wysyłania.

Zasadniczo po prostu usuń tutaj . tutaj & w kodzie HTML wiadomości e-mail.

+0

Jakie są wartości '$ html' i' $ organ do spraw? –

+0

w rzeczywistości jest to mały, duży szablon HTML, którego nie mogę umieścić w pytaniu, chociaż będę edytować go z odpowiednią częścią obrazu, @DaveChen, sprawdź edytowane pytanie –

+0

Interesujące ... wysyłasz różne e-maile do MS-Outlooka? Skąd wiadomo, z jakiego odbiornika korzysta dany klient poczty e-mail? – arkascha

Odpowiedz

6

Jestem prawie pewien, że jest to spowodowane przez wypełnianie kropek; ponieważ kropka jest używana jako specjalny wskaźnik w wiadomościach e-mail. Można o tym przeczytać w the rfc gdzie jest napisane (podkreślenie dodane):

Aby umożliwić wszystkim użytkownik składa tekst mają być przekazywane w sposób przejrzysty, stosuje się następujące procedury:

  • Przed wysłaniem linię poczty tekst, klient SMTP sprawdza pierwszy znak linii. Jeśli jest to kropka, na początku linii wstawiany jest dodatkowy okres.
  • Po odebraniu linii tekstu wiadomości przez serwer SMTP sprawdza wiersz. Jeśli linia składa się z jednego okresu, jest traktowana jako koniec wskaźnika poczty. Jeśli pierwszy znak jest kropką i na linii znajdują się inne znaki, pierwszy znak jest usuwany.

Wydaje się, że klient używasz komponować te e-maile nie nie wdrożenia pierwszego postępowania, podczas gdy serwer wysyła pocztę do ma wdrożyć go; prowadząc do znikających kropek.

Poprawka polegałaby na tym, aby klient wdrożył dopełnienie.

2

Użyj PHPMailer, to znacznie ułatwi życie.

+0

Nie mogę zmienić systemu wiadomości e-mail z pewnych powodów. ale dzięki za sugestię. –

0

Oto przykład to -

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