PHPmailer(5.2.14)に問題があり、複雑なhtml電子メールボディが壊れています。PHPmailerがHTMLの本文を壊しています。 (bug?)
下記の電子メールGeneartionプロセスのスニペットを添付しますが、まず問題を説明します。私は、テキストの本体が破損取得し、ランダムな空白が追加された電子メールを送信
、テキストが太字になったりhtmlタグは完全にこのように無視されます。
私は破ります私のメール本文を文字列変数$message
に入れてください。
私は$message
をプリントアウトしたときに、私は(のvar_dumpときしかし、私は$message
ですべての問題を見ることができない)$message
電子メールは、このような問題なく完全にブラウザに表示されます:
メールを送信するときにPHPmailerが$ messageを壊している理由は誰でも知っていますか?私は複数のことを試みましたが、私が結論づけることができたのは、問題が$message
ではないということだけです。問題は散発的です。電子メールが生成されるたびに別の場所で間違っているように見える
そして、もし私がlinux内でphpファイルを実行していたら。エコー$メッセージ。私はHTMLに何の問題も見られません。私。空白の奇妙なhtmlタグなどはありません。私はvar_dump()$メッセージそれはブラウザ内で問題なしで表示されます。私が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: £" . $row_view_invoice['Rate'] . "<br />";
$message .= "VAT Rate: " . $row_view_invoice['VATRate'] . "%<br />";
$message .= "Month Net Total: £" . $row_view_invoice['NettTotal'] . "<br />";
$message .= "VAT Total: £" . $VATValue . "<br />";
$message .= "Month Gross Total: £" . $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 © 2016</td>
</tr>
</table>
</body>
</html>
';
var_dump($message);
$mail = new PHPMailer;
$mail->setFrom('contact[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';
}
}
に行くの違いを、あなたが見ることができるようにOutlookは、破損しているquoted-printableのエンコーディングに知られていましたか?問題が '$ message'にないことをどのようにして証明できますか?電子メールクライアントは、HTML/CSSコードをどのように解釈するかに非常に変化があり、かなり偽りです。ちょうどブラウザで動作するから**は**同じコードが電子メールで動作することを意味しません – Martin
私はLinux内でPHPファイルを実行する場合。エコー$メッセージ。私はHTMLに何の問題も見られません。私。空白の奇妙なhtmlタグなどはありません。私はvar_dump()$メッセージそれはブラウザ内で問題なしで表示されます。 Outlook内の電子メールと私のiPhoneで同じ電子メールが両方のデバイスで同じ方法で破損しています。 私は 'phpMailer 5.2.14'を使用しています – Ryan
その便利なコメントをあなたの質問に追加できますか?出力HTMLをどの電子メールクライアントで表示しましたか? – Martin