Shivesh Jaiswal
Shivesh Jaiswal

Reputation: 117

Error in HTML setting of PHP mail function

Hi I have write a script to fetch data from MySQL and mail that. I am using HTML content type my problem is with output HTML content formatting

Here is my code

<?php
$con=mysqli_connect("host","user","pwd","db");
// Check connection
if (mysqli_connect_errno())
  {
  echo "Failed to connect to MySQL: " . Mysqli_connect_error();
  }

$result3 = mysqli_query($con,"SELECT  cardnumber, email, firstname, surname, GROUP_CONCAT(borrowernumber) as borrowernumber, GROUP_CONCAT(issuedate) as issuedate, GROUP_CONCAT(date_due) as date_due,  GROUP_CONCAT(barcode) as barcode, GROUP_CONCAT(title SEPARATOR '//') as Title, GROUP_CONCAT(author SEPARATOR '/') as Author FROM issuestestmail GROUP BY email");
while($row = mysqli_fetch_array($result3))
{
$to = $row['email'];
$emailBody="<html><body><font face='arial' size='2'>";
// explode the Pin/balances on the comma's
$borrowernumber = explode(',',$row['borrowernumber']);
$barcode = explode(',',$row['barcode']);
$issuedate = explode(',',$row['issuedate']);
$date_due = explode(',',$row['date_due']);
$Title = explode('//',$row['Title']);
$Author = explode('/',$row['Author']);
$subject = "List of Issued Books ( Total : ".count($barcode).")";
// Create a line for each item/balance
$emailBody .= "<b>Dear,</b>  ".$row['firstname']." ".$row['surname']."  ("  ."<b>ID:</b> <b>".$row['cardnumber']."</b>)<br/><br/>"."\r\n"."Kindly find the list of library items which are currently issued on your account"."<br/><br/>";

    $emailBody .= "<b>Total no of issued books:</b> ".count($barcode)."<br/><br/>";

    foreach($borrowernumber as $key => $borrowernumber){

    $emailBody .= "<table border='0' width='100%' id='table1' style='border-width: 0px; font-size:14px'><tr>";
        $emailBody .= "<td width='100' style='border-style: none; border-width: medium'><b>Barcode</b></td>";
    $emailBody .= "<td style='border-style: none; border-width: medium'>: ".$barcode[$key]."</td>";
    $emailBody .= "</tr></table>";

    $emailBody .= "<table border='0' width='100%' id='table2' style='border-width: 0px; font-size:14px'><tr>";
        $emailBody .= "<td width='100' style='border-style: none; border-width: medium'><b>Title</b></td>";
    $emailBody .= "<td style='border-style: none; border-width: medium'>: ".$Title[$key]."</td>";
    $emailBody .= "</tr></table>";

    $emailBody .= "<table border='0' width='100%' id='table3' style='border-width: 0px; font-size:14px'><tr>";
        $emailBody .= "<td width='100' style='border-style: none; border-width: medium'><b>Author</b></td>";
    $emailBody .= "<td style='border-style: none; border-width: medium'>: ".$Author[$key]."</td>";
    $emailBody .= "</tr></table>";

    $emailBody .= "<table border='0' width='100%' id='table4' style='border-width: 0px; font-size:14px'><tr>";
        $emailBody .= "<td width='100' style='border-style: none; border-width: medium'><b>Issue date</b></td>";
    $emailBody .= "<td style='border-style: none; border-width: medium'>: ".$issuedate[$key]."</td>";
    $emailBody .= "</tr></table>";

    $emailBody .= "<table border='0' width='100%' id='table5' style='border-width: 0px; font-size:14px'><tr>";
        $emailBody .= "<td width='100' style='border-style: none; border-width: medium'><b>Due Date</b></td>";
    $emailBody .= "<td style='border-style: none; border-width: medium'>: ".$date_due[$key]."</td>";
    $emailBody .= "</tr></table><br/><hr><br/>";}

// add a Total Balance line

$emailBody .= "<br/><br/><b>Library</b><br/>xyz<br/>";
$emailBody .= "</font></body></html>";
$headers = "From: [email protected]\r\n";
$headers .= "Reply-To: [email protected]\r\n";
$headers .= "Return-Path: [email protected]\r\n";
$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-type:text/html;charset=iso-8859-1" . "\r\n";

      if(mail($to, $subject, $emailBody, $headers)) {
          echo $emailBody;
          echo 'Email sent successfully!<br/><br/>';
      } else {
          echo $emailBody;
          die('Failure: Email was not sent!');
      }

}

mysqli_close($con);
?>

Now the output of this mail is like this on gmail

Every thing is fine but I am getting error on one of the record record no 3 ""< table border='0' width='100%' ID='table3' style='border-width: 0px; font-size:14px'>""

enter image description here

Upvotes: 0

Views: 163

Answers (1)

wakqasahmed
wakqasahmed

Reputation: 2089

1) Use this line to encode your entire message using base64:

$emailBody= chunk_split(base64_encode($emailBody));

Then, append this your header:

$headers .= "Content-Transfer-Encoding: base64\r\n\r\n";

That will tell the mail client that your message is base64 encoded.

Actually here,

""< table border='0' width='100%' id='table3' style='border-width: 0px; font-size:14px'>""

somehow space has been added in between < and table which is causing this error.

2) Also, i found another minor issue in your markup i.e. width='100' in the following line:

$emailBody .= "<td width='100' style='border-style: none; border-width: medium'><b>Due Date</b></td>";

change it to width='100%' or width='100px' whatever you wish to output for.

3) As per your commented requirement, (which is skipping email where email address not found from query) you just need to wrap your that part with if check

for example:

while($row = mysqli_fetch_array($result3))
{
if($row['email'])
{
$to = $row['email'];
$emailBody="<html><body><font face='arial' size='2'>";
.
.
.
.
      if(mail($to, $subject, $emailBody, $headers)) {
          echo $emailBody;
          echo 'Email sent successfully!<br/><br/>';
      } else {
          echo $emailBody;
          die('Failure: Email was not sent!');
      }
}
}

Upvotes: 1

Related Questions