Search code examples
phpemailuriphpmailerembed

Unable to embed base64 image URI in mail using PHPMailer


I am generating QR codes using https://github.com/endroid/qr-code and getting their URI to embed them in a mail using PHPMailer (https://github.com/PHPMailer/PHPMailer).

building the mail object:

$mail = new PHPMailer();
$mail->CharSet = "utf-8";
$mail->isSMTP();
$mail->SMTPSecure = 'tls';
$mail->SMTPAuth = true;
$mail->SMTPDebug = 1; 
$mail->Host = "smtp.gmail.com";
$mail->Port = "587";
$mail->Username = "[email protected]";
$mail->Password = "password";
$mail->setFrom("somewhere");
$mail->isHTML(true);
$mail->Subject = "QR";

And then generating the URI and embedding it in the mail

$qrURI = generateQR($requestId)
$mail->addStringEmbeddedImage($qrURI,"qr","qr.png",'base64','image/png');
$mail->Body = 'QR code: <img src="cid:qr" alt="QR code">'

The result in the mail sent is this: problem

I have the SMTPDebug=1 and it is not giving me any error

Here is a URI that I'm generating as an example:

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAUAAAAFACAIAAABC8jL9AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFEUlEQVR4nO3dQY7bQBAEQdPw/78sP2HHBhutJCPOC61EKTGnwlyfz+cX0PR7+w0A/0/AECZgCBMwhAkYwgQMYQKGMAFDmIAhTMAQJmAIEzCE/Tn8u+u6Rt/HM5wvQ573PN/82SccPk8nMIQJGMIEDGEChjABQ5iAIUzAECZgCBMwhAkYwgQMYQKGMAFD2Oka6dzz7mqZWM9MbHd2X3OC39KPnMAQJmAIEzCECRjCBAxhAoYwAUOYgCFMwBAmYAgTMIQJGMIEDGH3r5HO7d6R8+aly5s/+4TF5+kEhjABQ5iAIUzAECZgCBMwhAkYwgQMYQKGMAFDmIAhTMAQJmAI21wjseXNu6WHcQJDmIAhTMAQJmAIEzCECRjCBAxhAoYwAUOYgCFMwBAmYAgTMIRZI3278z3QxMbIbunLOYEhTMAQJmAIEzCECRjCBAxhAoYwAUOYgCFMwBAmYAgTMIQJGMI210j2K/ea2BhVvPa35ASGMAFDmIAhTMAQJmAIEzCECRjCBAxhAoYwAUOYgCFMwBAmYAi7f430vKXLhMo9Rrvfpt/Sj5zAECZgCBMwhAkYwgQMYQKGMAFDmIAhTMAQJmAIEzCECRjCBAxh12svldn1vJ2NH9IKJzCECRjCBAxhAoYwAUOYgCFMwBAmYAgTMIQJGMIEDGEChjABQ9jp3UgT65ndG3p27xx63mc/N/E8K27/7E5gCBMwhAkYwgQMYQKGMAFDmIAhTMAQJmAIEzCECRjCBAxhAoaw0zXShMoqZeK/Vz57xcTzTHxHTmAIEzCECRjCBAxhAoYwAUOYgCFMwBAmYAgTMIQJGMIEDGEChrD710i7251dE3cj7dq9RWnC7vu8/Xt3AkOYgCFMwBAmYAgTMIQJGMIEDGEChjABQ5iAIUzAECZgCBMwhF23zyN2b6k5V7nxqPKaFbu/pdufvBMYwgQMYQKGMAFDmIAhTMAQJmAIEzCECRjCBAxhAoYwAUOYgCHs9G6kiQ3H7i01D1ulDL3mhMr7THACQ5iAIUzAECZgCBMwhAkYwgQMYQKGMAFDmIAhTMAQJmAIEzCEna6R7EK+X+Wuqcq+KvGbdwJDmIAhTMAQJmAIEzCECRjCBAxhAoYwAUOYgCFMwBAmYAgTMIRdh5OL3XuMKib2K5U7nCoe9h05gSFMwBAmYAgTMIQJGMIEDGEChjABQ5iAIUzAECZgCBMwhAkYwk7vRjqXuFHmn1QWOZWN0e77nLhvafETOYEhTMAQJmAIEzCECRjCBAxhAoYwAUOYgCFMwBAmYAgTMIQJGMLuXyOdq2xiJkxsYnbtbowm/nviO3ICQ5iAIUzAECZgCBMwhAkYwgQMYQKGMAFDmIAhTMAQJmAIEzCEba6ROFG5mencxHan8pRu/+xOYAgTMIQJGMIEDGEChjABQ5iAIUzAECZgCBMwhAkYwgQMYQKGMGukHbuLnOfdC7X7PBdve3ICQ5iAIUzAECZgCBMwhAkYwgQMYQKGMAFDmIAhTMAQJmAIEzCEba6RdjcxuyrLoXO7txPtPs/z17z9KTmBIUzAECZgCBMwhAkYwgQMYQKGMAFDmIAhTMAQJmAIEzCECRjCrsMhxe7WpGJxlTKksoU6t/vkb3+eTmAIEzCECRjCBAxhAoYwAUOYgCFMwBAmYAgTMIQJGMIEDGEChrDTNRLwhZzAECZgCBMwhAkYwgQMYQKGMAFDmIAhTMAQJmAIEzCECRjC/gIsHA2FiBfxDQAAAABJRU5ErkJggg==

EDIT: It seems the format of data is wrong, how should I output the QR code so i can embed it in the mail?

Here is my generateQR function after trying out what @Synchro said:

function generateQR($requestId){
    try {
        $writer = new PngWriter();
        $qrCode = QrCode::create($requestId)
        ->setEncoding(new Encoding('UTF-8'))
        ->setErrorCorrectionLevel(new ErrorCorrectionLevelLow())
        ->setSize(300)
        ->setMargin(10)
        ->setRoundBlockSizeMode(new RoundBlockSizeModeMargin())
        ->setForegroundColor(new Color(0, 0, 0))
        ->setBackgroundColor(new Color(255, 255, 255));

        $result = $writer->write($qrCode);
        echo $result->getString()
        } 
    catch (\Throwable $th) {
            echo $th;
        }
}

Solution

  • PHPMailer doesn't have any support for data URIs, largely because it's not a good idea to use them because they have so many compatibility issues across email clients. Better to use a regular embedded image. To do that all you need to do is pass binary PNG data into that first param of the call to addStringEmbeddedImage instead of the URI-encoded data. I assume you'll need to amend your generateQR function to give you the data in that format.