PHPMailer and specific characters in subject (UTF-8?) - phpmailer

I'm trying to send email with PHPMailer. Everythings work except UTF-8 encoding in Subject.
I still get html code (commancé and has to be "commancé") in my mail client.
$mail = new PHPMailer(true);
$mail->CharSet = 'UTF-8';
$mail->Encoding = 'base64';
try {
//Server settings
//Recipients
$mail->setFrom('kevin#expl.com', 'Kevin de Exple');
$mail->addAddress($email, $name); // Add a recipient
// Content
$mail->isHTML(true); // Set email format to HTML
$subject = 'RE: La plantation de votre arbre a commancé';
$sub = '=?UTF-8?B?'.base64_encode($subject).'?=';
$mail->Subject = $sub;
...
Could you help me? I tried everything on the web :)
Have a good day!

I'm not sure why you're trying to do things the hard way! The first step is setting the CharSet property to UTF-8, which you've done. For the subject, you have this:
$subject = 'RE: La plantation de votre arbre a commancé';
$sub = '=?UTF-8?B?'.base64_encode($subject).'?=';
$mail->Subject = $sub;
There's a lot of unnecessary stuff going on in there. All you need to do is:
$mail->Subject = 'RE: La plantation de votre arbre a commancé';
PHPMailer takes care of all the encoding for you. The only thing to be careful of here is to be sure that you are actually working in UTF-8 in your editor. If you're using ISO-8859-1 or similar, it won't work – though it will look identical in your code.
As for spelling mistakes, I'm going to have to leave them up to you...

Do it this way
function correct_encoding($text) {
$current_encoding = mb_detect_encoding($text, 'auto');
$text = iconv($current_encoding, 'UTF-8', $text);
return $text;
}
$mail = new PHPMailer(true);
$mail->CharSet = 'utf-8';///<-- use lowercase
//$mail->Encoding = 'base64';//usually it is not necessary
try {
//Server settings
//Recipients
$mail->setFrom('kevin#expl.com', 'Kevin de Exple');
$mail->addAddress($email, $name); // Add a recipient
// Content
$mail->isHTML(true); // Set email format to HTML
$subject = 'RE: La plantation de votre arbre a commancé';
//$sub = '=?UTF-8?B?'.base64_encode($subject).'?=';
$mail->Subject = correct_encoding($subject);

Related

how to send email template html page?

Im using PHPMAILER 5.2.7 !
$to=$row['email'];
$at=$row['updated_at'];
$subject = "Your Password has been changed";
$body = "<body background='red' style='bgcolore:red;'><p>Hello < ".$u." > your password has been
changed at ".$at." ! </p>";
$SITEEMAIL='support#test.tn';
$mail = new Mail();
$mail->setFrom($SITEEMAIL);
$mail->addAddress($to);
$mail->subject($subject);
$mail->body($body);
$mail->send();
how can i switch the $body content with a html page (template) ?? tried to directly past the code inside $body but i dosen't work !
I see several strange things in your $body text, try using more simple contents from this sample first. github.com/PHPMailer/PHPMailer#a-simple-example
In any case, you should also call $mail->isHTML(true); before sending.

How to add several embedded image in the body?

I am trying to send several images in the body of the email. When I send one it works. But as soon as I want to send several it does not work anymore.
I tried doing a for loop but without result. I have also tried adding addEmbeddedImage several times with a different cid for each image.
if(array_key_exists('submit', $_POST)){
if (array_key_exists('userfile', $_FILES)) {
$uploadfile = tempnam(sys_get_temp_dir(), hash('sha256', $_FILES['userfile']['name']));
$uploadfile2 = tempnam(sys_get_temp_dir(), hash('sha256', $_FILES['userfile2']['name']));
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile) ) {
require './vendor/autoload.php';
$prenom = $_POST['prenom'];
$nom = $_POST['nom'];
$q1 = $_POST['q1'];
$q1_2 = $_POST['q1_2'];
$q2 = $_POST['q2'];
$q2_2 = $_POST['q2_2'];
$mail = new PHPMailer;
$mail->isHTML(true);
// $mail->isSMTP();
// $mail->SMTPDebug = 2;
$mail->Host = 'ssl0.ovh.net';
$mail->Port = 465;
$mail->SMTPSecure = 'ssl';
$mail->SMTPAuth = true;
$mail->CharSet = 'UTF-8';
$mail->setFrom('lol#example.com', $prenom);
$mail->addAddress('info#nicolaspoulain.be', 'Jessica');
$mail->Subject = 'Formulaire de sécurité VCA';
$mail->AddEmbeddedImage($uploadfile, "my-attach");
$mail->AddEmbeddedImage($uploadfile2, "my-attach2");
$mail->Body =
'<h1 style= "text-align: center;" margin-bottom:"100px;"> Formulaire de visite sécurité</h1>
<h4>Prénom: </h4>' . strip_tags($prenom) .
'<h4>Nom: </h4>' . strip_tags($nom) .
'<table rules="all" style="border-color: #666;" cellpadding="10">
<tr><th style="width: 40%;">Question</th><th style="width: 10%;">Réponse</th><th style="width: 50%;">Commentaires</th></tr>
<tr style="background: #eee;"><td><strong>Y a-t-il un permis de travail?</strong> </td><td>' . strip_tags($q1) . "</td><td>" . strip_tags($q1_2) . '<img src="cid:my-attach">' . "</td></tr>
<tr style='background: white;'><td><strong>La description de la tâche et les mesures de sécurité sont-elles suffisamment claires?</strong> </td><td>" . strip_tags($q2) . "</td><td>" . strip_tags($q2_2) . '<img src="cid:my-attach2">' . "</td></tr>";
if (!$mail->send()) {
$msg .= "Mailer Error: " . $mail->ErrorInfo;
} else {
$msg .= "L'audit a bien été transmis!";
}
} else {
$msg .= 'Failed to move file to ' . $uploadfile;
}
}
}
Good afternoon,
To be able to add multiple images in the body of the email. You should use CID's.
$imgPath = "\images\Progressiva_Itaipu.jpg";
$cid = md5($imgPath);
$mail->AddEmbeddedImage($imgPath,$cid,'Progressiva_Itaipu.jpg');
Calling so in the body of the message
$message .= "<img src='cid:$cid'>";
If it is multiple images, you can do the foreach or even a for

change font size for phpmailer subject

The following function works but I am unable to control the font-size of the "Subject". Is there a way to change the font size of the "Subject". I've tried:
$mail->Subject = "<span style='font-size:3vw'>" .$mailInputs['subject'] ."<\span>";
but that didn't work.
function mailerExpressBlueHost(array $mailInputs){
require_once '../includes/phpmailer/PHPMailerAutoload.php';
$mail = new PHPMailer();
$mail->IsMail();
$mail->SetFrom('example#xyz.com');
$mail->IsHTML(true);
$mail->addAddress('abc#example.com');
$mail->AddEmbeddedImage("../public/img/swb.jpg", "swb-image");
$body = '<!DOCTYPE html>
<html><header>
</header>
<body lang=EN-US>
<div style="text-align:center">
<img src="cid:swb-image">' . $mailInputs['body'] ;
$mail->isHTML(true);
$mail->Subject = $mailInputs['subject'] ;
$mail->Body = $body;
if(!$mail->send()) {
return 'Message could not be sent.' . 'Mailer Error: ' . $mail->ErrorInfo;
} else {
return 'Message has been sent';
}
$mail->ClearAddresses();
}
No, you can't do this. The Subject line does not support HTML formatting; it's plain text only - not least because the definition of the Subject email header predates HTML by at least 10 years.
On the upside, you can use unicode, which allows you quite a lot of tricks, but it's highly dependent on the OS and application it's viewed in.

phpmailer for php variables

I am running phpmailer and very much new to it.
Problem definition: Not able to see php variables data in the received email while html content can seen properly.
Below is some of the code:
require 'PHPMailer/class.phpmailer.php';
$mail = new PHPMailer;
$mail->WordWrap = 50; // Set word wrap to 50 characters
$mail->IsHTML(true); // Set email format to HTML
$mail->Subject = 'Message';
$mail->Body = '<body>
<div align="center"><p7><strong>HELLO WORLD</strong></p7></div>
<h9><u>Details</u></h9><br/>
<h9><strong>NAME:</strong> <?php echo "$name";?> <?php echo "$place";?>
</body>';
$mail->AltBody = 'This is the body in plain text for non-HTML mail clients';
if(!$mail->Send()) {
echo 'Message could not be sent.';
echo 'Mailer Error: ' . $mail->ErrorInfo;
exit;
}
echo 'Message has been sent';
Not able to see data defined under php.
Also $name and $place is the dynamic data for the every mail.
Please help.
You cannot put php statements in single quotes. use the following instead:
$mail->Body = '<body>
<div align="center"><p7><strong>HELLO WORLD</strong></p7></div>
<h9><u>Details</u></h9><br/>
<h9><strong>NAME:</strong>' . $name . ' ' . $place . '
</body>';
You need to put the text between " instead of '.
PHP only replaces variables in double quoted strings.
Also you shouldn't use php code in the strings.
$mail->Body = "
<body>
<div align=\"center\"><p7><strong>HELLO WORLD</strong></p7></div>
<h9><u>Details</u></h9><br/>
<h9><strong>NAME:</strong> $name $place
</body>
";
try instead :
$mail->Body = "<body>
<div align=\"center\"><p7><strong>HELLO WORLD</strong></p7></div>
<h9><u>Details</u></h9><br/>
<h9><strong>NAME:</strong>$name $place
</body>";
You don't have to put php tags in your string since you are already in a php context !
Replace Body with :
$mail->Body = '<body>
<div align="center"><p7><strong>HELLO WORLD</strong></p7></div>
<h9><u>Details</u></h9><br/>
<h9><strong>NAME:</strong>'.$name.' '.$place.'</body>';
$headers = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
$message .= "Phone: 0181-4606260.<br>";
$message .="Mobile :09417608422.<br>";
Send_Mail('abc#example.com','Welcome',$message,$headers);
try this...

How to send HTML email in drupal 6 using drupal_mail?

How to send HTML email in drupal 6 using drupal_mail ? How can I change HTML header to show email contents in HTML.
You can to set the header in hook_mail_alter()
<?php
hook_mail_alter(&$message) {
$message['headers']['Content-Type'] = 'text/html; charset=UTF-8; format=flowed';
}
?>
i know this may be late, but it may help others. Its better to use drupal_mail and then set the headers in hook_mail instead of hook_mail alter. an example would be like:
/*drupal_mail($module, $key, $to, $language, $params = array(), $from = NULL, $send = TRUE)
Lets say we call drupal_mail from somewhere in our code*/
$params = array(
'subject' => t('Client Requests Quote'),
'body' => t("Body of the email goes here"),
);
drupal_mail("samplemail", "samplemail_html_mail", "admin#mysite.com", language_default(), $params, "admin#mysite.com");
/*We now setup our mail format, etc in hook mail*/
function hook_mail($key, &$message, $params)
{
case 'samplemail_html_mail':
/*
* Emails with this key will be HTML emails,
* we therefore cannot use drupal default headers, but set our own headers
*/
/*
* $vars required even if not used to get $language in there since t takes in: t($string, $args = array(), $langcode = NULL) */
$message['subject'] = t($params['subject'], $var, $language->language);
/* the email body is here, inside the $message array */
$body = "<html><body>
<h2>HTML Email Sample with Drupal</h2>
<hr /><br /><br />
{$params['body']}
</body></html>";
$message['body'][] = $body;
$message['headers']['Content-Type'] = 'text/html; charset=UTF-8; format=flowed';
break;
}
If this is unclear to you, a complete tutorial on this can be found on My Blog
Hope this helps
JK

Resources