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 = "something@somewhere.com";
$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:
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;
}
}
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.