ปัญหาการเข้ารหัสอักขระของ PHPMailer


190

ฉันพยายามใช้ PHPMailer เพื่อส่งการลงทะเบียนเปิดใช้งาน จดหมายอื่น ๆ ถึงผู้ใช้:

require("class.phpmailer.php");
$mail -> charSet = "UTF-8";
$mail = new PHPMailer();
$mail->IsSMTP();  
$mail->Host     = "smtp.mydomain.org";  
$mail->From     = "name@mydomain.org";
$mail->SMTPAuth = true; 
$mail->Username ="username"; 
$mail->Password="passw"; 
//$mail->FromName = $header;
$mail->FromName = mb_convert_encoding($header, "UTF-8", "auto");
$mail->AddAddress($emladd);
$mail->AddAddress("mytest@gmail.com");
$mail->AddBCC('mytest2@mydomain.org', 'firstadd');
$mail->Subject  = $sub;
$mail->Body = $message;
$mail->WordWrap = 50;  
if(!$mail->Send()) {  
   echo 'Message was not sent.';  
   echo 'Mailer error: ' . $mail->ErrorInfo;  
}

$messageมีอักขระภาษาละติน น่าเสียดายที่เว็บเมลทั้งหมด (gmail, webmail.mydomain.org, emailaddress.domain.xx) กำลังใช้การเข้ารหัสที่แตกต่างกัน

ฉันจะบังคับให้ใช้การเข้ารหัส UTF-8 เพื่อแสดงอีเมลของฉันเหมือนกันทุกประการในกล่องจดหมายทั้งหมดได้อย่างไร

ฉันพยายามแปลงความกว้างของส่วนหัวจดหมายmb_convert_encoding()แต่ไม่มีโชค


ตัวพิมพ์ใหญ่ของ CharSet ด้านบนถูกเปลี่ยนแปลงโดย bovender
Gogowitsch

คำตอบ:


476

หากคุณมั่นใจ 100% ข้อความ $ มี ISO-8859-1 คุณสามารถใช้utf8_encodeตามที่ David บอก มิฉะนั้นให้ใช้ mb_detect_encodingและmb_convert_encodingในข้อความ $

ยังรับทราบด้วยว่า

$mail -> charSet = "UTF-8"; 

ควรถูกแทนที่ด้วย:

$mail->CharSet = 'UTF-8';

และวางไว้หลังอินสแตนซ์ของคลาส (หลังจากnew) คุณสมบัติจะคำนึงถึงขนาดตัวพิมพ์! ดูที่PHPMailer doc fot รายการ & การสะกดคำที่แน่นอน

นอกจากนี้การเข้ารหัสเริ่มต้นของ PHPMailer 8bitซึ่งอาจเป็นปัญหากับข้อมูล UTF-8 ในการแก้ไขปัญหานี้คุณสามารถทำได้:

$mail->Encoding = 'base64';

รับทราบว่า'quoted-printable'อาจใช้งานได้ในกรณีเหล่านี้ (และอาจเป็นไปได้'binary') สำหรับรายละเอียดเพิ่มเติมคุณสามารถอ่านRFC1341 - Content-Transfer-Encoding ส่วนหัวสนาม


35
ดีฉันไม่ทราบว่าใครสนใจเพราะเก่าบ้า แต่ฉันต้องเพิ่ม $ mail-> Encoding = "base64" เพื่อให้มันใช้งานได้สำหรับฉัน
Andrew Revak

5
@AndrewRevak คุณบันทึกวัน! :)
ล่า

3
@AndrewRevak สิ่งที่ยอดเยี่ยม! นั่นคือสิ่งที่แก้ไขได้
BernardA

การใช้ mb_detect_encoding และ mb_convert_encoding น่าจะดี
BluE

26
$mail -> CharSet = "UTF-8";
$mail = new PHPMailer();

บรรทัด$mail -> CharSet = "UTF-8";จะต้องอยู่หลัง$mail = new PHPMailer();และไม่มีช่องว่าง!

ลองนี้

$mail = new PHPMailer();
$mail->CharSet = "UTF-8";

5
ฉันอัปเดตโพสต์นี้เพื่อการอ่านที่ดีขึ้น แต่คำถามของ op ได้รับคำตอบแล้วเมื่อ 2 ปีก่อน! และตอบที่ได้รับการยอมรับรวมอยู่ในนี้แล้ว
Dwza

5

ขออภัยที่มาสาย ขึ้นอยู่กับการกำหนดค่าเซิร์ฟเวอร์ของคุณคุณอาจจำเป็นต้องระบุตัวอักษรอย่างเข้มงวดด้วยตัวอักษรตัวเล็ก utf-8 มิฉะนั้นจะถูกละเว้น ลองทำสิ่งนี้หากคุณสิ้นสุดที่นี่ค้นหาวิธีแก้ปัญหาและไม่มีคำตอบข้างต้นช่วย:

$mail->CharSet = "UTF-8";

ควรแทนที่ด้วย:

$mail->CharSet = "utf-8";

5

ฉันทำงานด้วยตัวเอง

  $mail->FromName = utf8_decode($_POST['name']);

http://php.net/manual/en/function.utf8-decode.php


ฉันไม่มีสิ่งที่โพสต์ตัวเองเพียงแค่สตริงภาษาฝรั่งเศสปกติที่เขียนในไฟล์ที่เข้ารหัส utf-8 และสิ่งนี้ทำงานได้อย่างมีเสน่ห์ขอบคุณ!
toni07


3

ฉันได้รับ& oacute; ใน $ mail-> หัวเรื่อง / w PHPMailer

ดังนั้นสำหรับฉันทางออกที่สมบูรณ์คือ:

// Your Subject with tildes. Example.
$someSubjectWithTildes = 'Subscripción España';

$mailer->CharSet = 'UTF-8';
$mailer->Encoding = 'quoted-printable';
$mailer->Subject = html_entity_decode($someSubjectWithTildes);

หวังว่ามันจะช่วย


1

เมื่อไม่ทำงานข้างต้นและยังคงมีอีเมลดูเหมือนว่าª הודפסה ×•× ×©×œ:

$mail->addCustomHeader('Content-Type', 'text/plain;charset=utf-8');
$mail->Subject = '=?UTF-8?B?' . base64_encode($subject) . '?=';;

0

@ $mail -> charSet = "UTF-8";

--- บรรทัดนี้ควรอยู่ภายใต้

$mail = new PHPMailer(); line.

PFF ..


ใช่ถูกต้อง คุณต้องวางมันหลังจากวัตถุเริ่มต้น


สิ่งนี้ไม่ได้ให้คำตอบสำหรับคำถาม จะวิจารณ์หรือการร้องขอคำชี้แจงจากผู้เขียนแสดงความคิดเห็นด้านล่างโพสต์ของพวกเขา - คุณสามารถแสดงความคิดเห็นในโพสต์ของคุณเองและเมื่อคุณมีเพียงพอชื่อเสียงคุณจะสามารถที่จะแสดงความคิดเห็นในโพสต์ใด
piet.t

มันไม่ใช่คำวิจารณ์หรือคำชี้แจงสำหรับปัญหานี้ คำตอบที่ถูกต้องคือ: $ mail = new PHPMailer (); $ mail-> CharSet = 'UTF-8';
Nikos Kapetanakos

โซฉันดูเหมือนว่าความคิดเห็นในคำตอบของ Holian เพราะมันไม่ได้เพิ่มอะไรเลย
piet.t

ถ้าคุณใช้คุณสมบัติ charSet จะไม่ทำงาน อันที่ถูกต้องคือ CharSet กรณีทำให้แตกต่างกัน
Nikos Kapetanakos

แล้วทำไมคุณพูดคำตอบที่ผิดแทนที่จะให้คำตอบที่ถูกต้อง? แต่สิ่งนั้นมีอยู่แล้วเช่นกันคุณต้องเพิ่มอะไร
piet.t

0

วิธีที่ง่ายที่สุดและจะช่วยให้คุณตั้ง CharSet เป็น UTF-8

$mail->CharSet = "UTF-8"

@NickZuber บรรทัดที่แน่นอนอยู่ที่นั่นเนื่องจากการแก้ไข มันไม่ถูกต้องในคำถามเดิม ...
นาย Tsjolder

0

เพื่อหลีกเลี่ยงปัญหาการเข้ารหัสตัวอักษรในการส่งอีเมลโดยใช้คลาส PHPMailer เราสามารถกำหนดค่าให้ส่งด้วยการเข้ารหัสอักขระ UTF-8 โดยใช้พารามิเตอร์ "CharSet" ดังที่เราเห็นในรหัส Php ต่อไปนี้:

$mail = new PHPMailer();
$mail->From = 'midireccion@email.com';
$mail->FromName = 'Mi nombre';
$mail->AddAddress('emaildestino@email.com');
$mail->Subject = 'Prueba';
$mail->Body = '';
$mail->IsHTML(true);


// Active condition utf-8
$mail->CharSet = 'UTF-8';


// Send mail
$mail->Send();

-5

$ mail -> charSet = "UTF-8"; --- บรรทัดนี้ควรต่ำกว่า $ mail = new PHPMailer (); ไลน์.

PFF ..

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.