2016-06-14 4 views
0

У меня возникла проблема с PHPmailer (5.2.14) и с этим развращает сложные html-адреса электронной почты bodys.PHPmailer, искажающий сообщение тела HTML. (ошибка?)

Я приложу фрагмент процесса генерации электронной почты ниже, но я сначала объясню проблему.

Когда я отправить электронную почту тело текста становится коррумпированной и случайные пробелы добавляются, текст идет жирным или HTML теги полностью игнорируются, как это:

enter image description hereenter image description hereenter image description here


я нарушу до моего тела электронной почты в строковой переменной $message.

Однако, когда я распечатать $message я не вижу никаких проблем с $message

Когда я var_dump() $message электронной почты отображается в браузере совершенно без проблем, как это:

enter image description hereenter image description here


У кого-нибудь есть идеи, почему PHPmailer повреждает $ message при отправке письма? Я пробовал несколько вещей, но единственное, что я смог заключить, это то, что проблемы не связаны с $message. Вопрос спорадичен. Кажется, что он ошибается в разных местах каждый раз, когда создается электронное письмо

И если я запустил php-файл в Linux. и echo $ message. Я не вижу проблем с HTML. То есть нет пробельных странных html-тегов и т. д. Если я var_dump() $ message, он отображается без проблем в браузере. Если я просматриваю электронную почту в Outlook и на моем iPhone, то тот же самый адрес электронной почты поврежден на обоих устройствах одинаково.

if ($monthlyEmail == TRUE){ //If the monthlyEmail trigger is triggered lets send out the monthly report 

$Query = "SELECT * FROM CAPS_Accounts WHERE TypeOfBusiness = 'CHARGE SERVICE'"; 
$result = mysqli_query($db, $Query); 
$rows = mysqli_num_rows($result); 

$start_date_month = new DateTime("first day of last month"); 
$end_date_month = new DateTime("last day of last month"); 

$start = $start_date_month->format('Y-m-d'); 
$end = $end_date_month->format('Y-m-d'); 

$totalTransmissions = 0; 

$query_transmission = "SELECT * FROM CAPS_CollectedCases WHERE FirstUpdate >= '$start' AND FirstUpdate <= '$end'"; 
$result_transmission = mysqli_query($db, $query_transmission); 
$rows_transmission = mysqli_num_rows($result_transmission); 
if ($rows_transmission != 0) { 
    for ($i = 0; $i < $rows_transmission; $i ++) { 
     $row_transmission = clean_fetch_assoc($result_transmission); 
     $NumberUpdates = $row_transmission['NumberUpdates']; 
     $totalTransmissions = $totalTransmissions + $NumberUpdates; // Add to the transmission count. 
    } 
} 

$message = ' 
<html> 
    <head> 
     <title>BLAH BLAH</title> 
    </head> 
    <body> 
     <div style="display:none;">BLAH Notification Email</div> 
     <table style="margin: 0 auto; width:100%; background-color:#eeeeee; font-family: Tahoma,Verdana,Segoe,sans-serif; text-align:center; font-size:12px;"> 
      <tr style="background-color:#FFFFFF;"> 
       <td><img src="BLAH.png" style="width:300px;"> 
      </tr> 
      <tr style="text-align:left;"> 
       <td style="padding:10px;"> 
        Dear ' . 'BLAH' . ',<br /><br /> 
        This is the mnonthly stats carried out at: ' . date("d/m/Y @ H:i:s") . ' for month ' . date_format($start_date_month,'M Y') . ' <br /> 
        Total claims created this month: ' . $rows_transmission . '<br /> 
        Total unique transmissions delivered this month: ' . $totalTransmissions . '<br /><br /> 
'; 

do { //For some stupid reason a for loop didn't want to work. I will look at this at some point but sod it. 
    $BusinessID = $row['BusinessID']; 
    if ($BusinessID != '') { 

     $query_calc = "SELECT * FROM CAPS_DTCInvoice WHERE BusinessID = '$BusinessID' ORDER BY InvNumber DESC LIMIT 1,1"; //Select the 2nd to latest invoice again in case we just inserted a new one. 
     $result_calc = mysqli_query($db, $query_calc); 
     $rows_calc = mysqli_num_rows($result_calc); 
     $row_calc = clean_fetch_assoc($result_calc); 
     $InvNumber = $row_calc['InvNumber']; 
     $Rate = $row_calc['Rate']; 
     $VATRate = $row_calc['VATRate']; 

     $UniqueTransmissions = 0; //Initialise this badboy. This will contain the number of transmissions being added and are already within this months invoice. 

     //Lets tally our existing unique transmissions before looking for new transmissions to add to the invoice. 
     $query_transmission = "SELECT * FROM CAPS_CollectedCases WHERE BusinessID = '$BusinessID' AND InvNumber = '$InvNumber' "; 
     $result_transmission = mysqli_query($db, $query_transmission); 
     $rows_transmission = mysqli_num_rows($result_transmission); 
     if ($rows_transmission != 0) { 
      for ($i = 0; $i < $rows_transmission; $i ++) { 
       $row_transmission = clean_fetch_assoc($result_transmission); 
       $NumberUpdates = $row_transmission['NumberUpdates']; 
       $UniqueTransmissions = $UniqueTransmissions + $NumberUpdates; // Add to the transmission count. 
      } 
     } 

     //Lets Start populating the invoice row with the data now we have refreshed the data counts. 
     //Number of Claims 
     $query_transmission = "SELECT CCaseIndex FROM CAPS_CollectedCases WHERE BusinessID = '$BusinessID' AND InvNumber = '$InvNumber'"; 
     $result_transmission = mysqli_query($db, $query_transmission); 
     $DelCount = mysqli_num_rows($result_transmission); 

     //Earliest Transmission 
     $query_transmission = "SELECT FirstUpdate FROM CAPS_CollectedCases WHERE BusinessID = '$BusinessID' AND InvNumber = '$InvNumber' ORDER BY FirstUpdate LIMIT 1 "; 
     $result_transmission = mysqli_query($db, $query_transmission); 
     $row_transmission = clean_fetch_assoc($result_transmission); 
     $FirstDelDate = $row_transmission['FirstUpdate']; 

     //Latest Transmission 
     $query_transmission = "SELECT LastUpdate FROM CAPS_CollectedCases WHERE BusinessID = '$BusinessID' AND InvNumber = '$InvNumber' ORDER BY LastUpdate DESC LIMIT 1 "; 
     $result_transmission = mysqli_query($db, $query_transmission); 
     $row_transmission = clean_fetch_assoc($result_transmission); 
     $LastDelDate = $row_transmission['LastUpdate']; 

     //Current Cost 
     $NettTotal = $DelCount * $Rate; 
     $VATValue = ($NettTotal/100) * $VATRate; 
     $VATAmount = $NettTotal + $VATValue; 

     $query_view_invoice = "SELECT * FROM CAPS_DTCInvoice WHERE BusinessID = '$BusinessID' ORDER BY InvNumber DESC LIMIT 1,1"; //Select the 2nd to latest invoice again in case we just inserted a new one. 
     $view_invoice = mysqli_query($db, $query_view_invoice); 
     $row_view_invoice = clean_fetch_assoc($view_invoice); 

     $message .= "---------------<br />";  
     $message .= "Service ID: " . $row['BusinessID'] . " - " . $row['BusinessName'] . "<br />"; 
     $date = date_create($row_view_invoice['InvoiceDate']); 
     $message .= " Current invoice and statistics from date commencing: " . date_format($date, "d/m/Y") . "<br />"; 
     $message .= "---------------<br />"; 
     $message .= "Invoice ID: " . $row_view_invoice['InvNumber'] . "<br />"; 
     if ($row_view_invoice['FirstDelDate'] != '0000-00-00 00:00:00'){ 
      $date = date_create($row_view_invoice['FirstDelDate']); 
      $message .= "First Delivery Date: " . date_format($date, "d/m/Y @ H:i:s") . "<br />"; 
     }else{ 
      $message .= "First Delivery Date: N/A <br />"; 
     } 
     if ($row_view_invoice['LastDelDate'] != '0000-00-00 00:00:00'){ 
      $date = date_create($row_view_invoice['LastDelDate']); 
      $message .= "Last Delivery Date: " . date_format($date, "d/m/Y @ H:i:s") . "<br />"; 
     }else{ 
      $message .= "Last Delivery Date: N/A <br />"; 
     } 
     $message .= "Transmitted Claim Count: " . number_format($row_view_invoice['DelCount']) . "<br />"; 
     $message .= "Unique Transmissions: " . number_format($UniqueTransmissions) . "<br />"; 
     $message .= "Rate: &#163;" . $row_view_invoice['Rate'] . "<br />"; 
     $message .= "VAT Rate: " . $row_view_invoice['VATRate'] . "%<br />"; 
     $message .= "Month Net Total: &#163;" . $row_view_invoice['NettTotal'] . "<br />"; 
     $message .= "VAT Total: &#163;" . $VATValue . "<br />"; 
     $message .= "Month Gross Total: &#163;" . $row_view_invoice['VATAmount'] . "<br />"; 
     $message .= "---------------<br /><br />";  
    } 
} while ($row = clean_fetch_assoc($result)); 

$message .=   ' If you have any questions you can contact BLAH BLAH <br /><br /> 
           Many Thanks,<br /> 
           BLAH BLAH 
          </td> 
         </tr> 
         <tr style="background-color:#1175BA; color:#FFFFFF; font-size:12px;"> 
          <td>BLAH BLAH &copy; 2016</td> 
         </tr> 
         </table> 
       </body> 
      </html> 
     '; 

var_dump($message); 

$mail = new PHPMailer; 

$mail->setFrom('[email protected]', 'BLAH'); 
$mail->addAddress('[email protected]'); 
$mail->addReplyTo('[email protected]', 'BLAH'); 
$mail->isHTML(true);        

$mail->Subject = ' Monthly BLAH Stats'; 
$mail->Body = $message; 

if(!$mail->send()) { 
    echo 'Monthly Email could not be sent.'; 
    echo 'Mailer Error: ' . $mail->ErrorInfo; 
} else { 
    echo 'Monthly Email has been sent'; 
}     

} 
+0

какая версия PHPMailer вы используете? Как вы можете установить, что проблема не в '$ message'? Клиенты электронной почты чрезвычайно разнообразны и довольно дрянные в том, как они интерпретируют код HTML/CSS. Просто потому, что он работает в браузере ** не означает, что тот же код будет работать по электронной почте – Martin

+0

Если я запустил php-файл в Linux. и echo $ message. Я не вижу проблем с HTML. То есть нет пробельных странных html-тегов и т. д. Если я var_dump() $ message, он отображается без проблем в браузере. Если я просматриваю электронную почту в Outlook и на моем iPhone, то такое же сообщение на обоих устройствах повреждено одинаково. Я использую 'phpMailer 5.2.14' – Ryan

+0

Можете ли вы добавить этот полезный комментарий к своему вопросу. На каких почтовых клиентах вы просматривали выходной HTML? – Martin

ответ

0

Изменение кодировки на base64, похоже, решило проблему.

$mail->Encoding = 'base64'; 

Для дальнейшего использования:

При отправке, взять копию отправленного сообщения по телефону $mail->getSentMIMEMessage() после отправки и сравнить его с тем, что вы получаете - если есть разница, то проблема после того, как сообщение покинуло элемент управления PHPMailer. Перспективы, как известно, коррумпированной кавычко печати кодирования, так что вы могли бы увидеть, если установка $mail->Encoding = 'base64'; делает различие

Заслуга Synchro

Смежные вопросы