2010-02-15 49 views
25

Tôi đang gặp một số vấn đề với các ký tự nước ngoài khi gửi e-mail. Ai đó có thể khuyên tôi nên làm gì. Tôi nghĩ vấn đề có thể là một trong ba điều.Mã hóa e-mail PHP?

1) Mã hóa trang html không chính xác. (Điều này có ảnh hưởng đến dữ liệu POST từ biểu mẫu không?) 2) Chức năng thư không có bất kỳ mã hóa nào. Do đó chương trình không biết cách đọc nó. (Nhiều khả năng) 3) Bản thân tệp không có mã hóa đúng và do đó đang gây ra sự cố. (Có thể không chắc)

Có nguyên nhân nào khác có thể xảy ra không?

Tôi đang cố gắng loại bỏ những điều này từ 1 đến 1 cho đến khi tôi tìm thấy sự cố. Tôi nghĩ rằng tùy chọn 2 là nguyên nhân có khả năng nhất. Làm cách nào để thêm mã hóa thích hợp - phổ quát vào chức năng thư?

Đây là những gì tôi có vào lúc này.

$mail_sent = mail($client_email, $title, $message, "From: {$visitor_email}"); 

Tôi hiện biết rằng biểu mẫu không gửi các ký tự đánh bóng hoặc tiếng Thụy Điển.

Tôi sẽ rất biết ơn nếu có ai đó có thể chỉ ra bất kỳ nguyên nhân nào khác có thể và cho tôi biết mã hóa nào tôi cần sử dụng để gửi e-mail.

Thanks a lot.

Trả lời

28

Theo như tôi biết PHP không hỗ trợ UTF-8 làm mã hóa mặc định cho chuỗi của nó. Bạn cần sử dụng các chức năng mã hóa/xử lý có liên quan cho mã hóa bạn muốn.

Ngoài ra thêm 'Content-Type: text/html; charset = utf-8' vào tiêu đề email của bạn để ứng dụng email sẽ hiển thị chính xác các ký tự (hoặc thay thế bằng mã hóa lựa chọn của bạn).

+9

cho email dựa trên văn bản (không phải trong html) sử dụng: 'Content-Type: text/plain; charset = utf-8' –

+0

Bạn có thể vui lòng đăng mã không? –

20

Bạn không chỉ định loại và mã hóa nội dung của mình. Hãy thử điều này:

$headerFields = array(
    "From: {$visitor_email}", 
    "MIME-Version: 1.0", 
    "Content-Type: text/html;charset=utf-8" 
); 
$mail_sent = mail($client_email, $title, $message, implode("\r\n", $headerFields)); 
2

Sử dụng trình bao thư PHP, nó sẽ tiết kiệm sự tỉnh táo của bạn (nói từ kinh nghiệm tại đây). Ví dụ: PHPMailer cho phép bạn đặt mã hóa e-mail đi và tạo tin nhắn cho bạn.

Ngoài ra, hãy sử dụng UTF-8; nó gần như được hỗ trợ phổ biến hiện nay và bao gồm tất cả các nhân vật bạn cần.

4

tôi sử dụng đoạn mã sau:

$text = ""; 
    $text .= "<html>\n"; 
    $text .= "<body style=\"font-family:Arial; \">\n"; 

    $text .= "<b>Add Your text here . . .</b>"; 
    $text .= date("d.m.Y") . " <br><br>\n\n"; 

    $text .= "</body>\n"; 
    $text .= "</html>\n"; 

$headers = 'From: ' . $myEmail . "\r\n"; 
$headers .= 'To: ' . $depEmail . "\r\n";  
$headers .= 'Return-Path: ' . $myEmail . "\r\n"; 
$headers .= 'MIME-Version: 1.0' ."\r\n"; 
$headers .= 'Content-Type: text/HTML; charset=ISO-8859-1' . "\r\n"; 
$headers .= 'Content-Transfer-Encoding: 8bit'. "\n\r\n"; 
$headers .= $text . "\r\n"; 

set_time_limit(30); 
if (!mail('', 'Demande information', '', $headers)) { 
    Alert(...) 
+1

có lý do cụ thể nào mà bạn sử dụng \ n \ r \ n thay vì \ r \ n đằng sau "Nội dung chuyển mã hóa: 8 bit" không? – Lexib0y

+0

có lẽ chỉ cần sao chép từ một tập tin mẫu, và nó làm việc :) – Atara

6

Ngoài những gì đã nói trước đó, nó không phải là bắt buộc phải gửi qua đường bưu điện trong HTML để có thể sử dụng UTF-8, bạn cũng có thể định dạng nó như văn bản đơn giản trong các tiêu đề:

'Content-Type: text/plain;charset=utf-8' 
6

Sử dụng mã này

function mail_send($arr) 
{ 
    if (!isset($arr['to_email'], $arr['from_email'], $arr['subject'], $arr['message'])) { 
     throw new HelperException('mail(); not all parameters provided.'); 
    } 

    $to   = empty($arr['to_name']) ? $arr['to_email'] : '"' . mb_encode_mimeheader($arr['to_name']) . '" <' . $arr['to_email'] . '>'; 
    $from  = empty($arr['from_name']) ? $arr['from_email'] : '"' . mb_encode_mimeheader($arr['from_name']) . '" <' . $arr['from_email'] . '>'; 

    $headers = array 
    (
     'MIME-Version: 1.0', 
     'Content-Type: text/html; charset="UTF-8";', 
     'Content-Transfer-Encoding: 7bit', 
     'Date: ' . date('r', $_SERVER['REQUEST_TIME']), 
     'Message-ID: <' . $_SERVER['REQUEST_TIME'] . md5($_SERVER['REQUEST_TIME']) . '@' . $_SERVER['SERVER_NAME'] . '>', 
     'From: ' . $from, 
     'Reply-To: ' . $from, 
     'Return-Path: ' . $from, 
     'X-Mailer: PHP v' . phpversion(), 
     'X-Originating-IP: ' . $_SERVER['SERVER_ADDR'], 
    ); 

    mail($to, '=?UTF-8?B?' . base64_encode($arr['subject']) . '?=', $arr['message'], implode("\n", $headers)); 
} 

từ: http://php.net/manual/en/function.mail.php

+1

Bạn có thể cho tôi biết tại sao bạn sử dụng mã hóa chuyển 7bit, như tôi thường thấy 8bit? – Lexib0y

+0

Từ những gì tôi đã tìm thấy, 7bit là mặc định cho email, vì một số ứng dụng thư khách thực sự cũ và máy chủ không thể xử lý 8bit. Gửi 7bit được trích dẫn có thể in chỉ là chơi an toàn. Điều đó nói rằng, bạn có thể có thể gửi 8bit iso-8859-1 hoặc 8bit utf-8 mà không có bất kỳ vấn đề. – Adrian

+0

+1 vào base64_encode() về chủ đề. Chưa bao giờ nghĩ về điều đó trước đây. Cảm ơn – Alexandre

1

Tôi sử dụng mã này để giải quyết vấn đề với mã hóa tiếng Hy Lạp trong thư Horde cũ.

$headers = 'From: ' . $youremail . "\r\n"; 
$headers .= 'To: ' . $to . "\r\n";  
$headers .= 'Return-Path: ' . $youremail . "\r\n"; 
$headers .= 'MIME-Version: 1.0' ."\r\n"; 
$headers .= 'Content-Type: text/HTML; charset=utf-8' . "\r\n"; 
$headers .= 'Content-Transfer-Encoding: 8bit'. "\n\r\n"; 
$headers .= $message . "\r\n"; 

mail('', 'Request from Site yoursite', '', $headers);