วิธีส่งเมลด้วยคำไบนารี่ในหัวเรื่องเมลโดยใช้ PHP

ฉันจะส่งอีเมลผ่านเว็บไซต์ PHP ลูกค้าสามารถปรับแต่งหัวเรื่องเมลได้และฉันจะได้รับข้อมูลการโพสต์ในรูปแบบ UTF-8 แต่เมื่อฉันส่งอีเมล HTML โดยใช้ PHP mail() ฉันพบว่าหัวเรื่องแสดงไม่ถูกต้อง แต่เนื้อหาแสดง

ฉันจะส่งคำภาษาจีนในฟังก์ชันเมล PHP ได้อย่างไร

ขอบคุณ.


person Jay    schedule 20.09.2009    source แหล่งที่มา


คำตอบ (3)


คุณต้องเข้ารหัสหัวเรื่องตามวิธีระบุ encoded-word (ดู RFC 2047):

encoded-word = "=?" charset "?" encoding "?" encoded-text "?="

คุณสามารถใช้อย่างใดอย่างหนึ่ง

  • การเข้ารหัส Base64 (base64_encode):

    'Subject: =?UTF-8?B?'.base64_encode($subject).'?='
    

    or

  • การเข้ารหัส quoted-printable (ดู RFC 2045, imap_8bit):

    'Subject: =?UTF-8?Q?'.imap_8bit($subject).'?='
    
person Gumbo    schedule 20.09.2009
comment
สำหรับมือใหม่เช่นฉัน ให้ตั้งค่า $subject โดยใช้: $subject = '=?UTF-8?B?'.base64_encode($subject).'?='; หากคุณใช้ UTF-8 - person Jay; 21.09.2009

การส่งส่วนหัวของเมลที่ไม่ใช่ ASCII ค่อนข้างเกี่ยวข้องกับการส่ง ลองใช้ PHPMailer

http://sourceforge.net/projects/phpmailer/

หากไม่ได้ผลสำหรับคุณ ให้ดูที่ encoderHeader() เพื่อดูว่ามันทำงานอย่างไร

person ZZ Coder    schedule 20.09.2009

ฉันใช้ PEAR Mail_Mime และ mb_encode_mimeheader เพื่อเข้ารหัสหัวเรื่อง นี่คือตัวอย่างฟังก์ชันการทำงาน:

<?php
function mail_html($from, $to, $subject, $message_html, $headers = array()) {
  require_once "Mail.php";
  require_once 'Mail/mime.php';
  $smtp = Mail::factory('smtp',
    array (
        'host' => 'smtp.example.com',
        'auth' => true,
        'username' => '[email protected]',
        'password' => 'password'));

  if(function_exists('mb_internal_encoding'))
    mb_internal_encoding('UTF-8');
  if(function_exists('mb_encode_mimeheader'))
    $subject = mb_encode_mimeheader($subject,"UTF-8", "B", "\n");

  $h = array();
  $h['From']         = "$from";
  $h['Bounce']       = "$from";
  $h['Reply-To']     = "$from";
  $h['Return-Path']  = "$from";
  $headers['Subject']      = $subject;
  $headers = array_merge($h, $headers);

  $mime = new Mail_mime();  
  $mime->setHTMLBody($message_html);
  $body = $mime->get(array('html_charset' => 'UTF-8', 'html_encoding' => '8bit', 'head_charset'=> 'UTF-8'));
  $hdrs = $mime->headers($headers);  
  $mail = $smtp->send($to, $hdrs, $body);

  if (PEAR::isError($mail))
    echo 'error', 'Unable to send email';
  else
    echo "Sent email to $to from $from";
}
?>
person brutuscat    schedule 03.01.2011