>백엔드 개발 >PHP 튜토리얼 >PHP의 메일 기능을 사용하여 UTF-8로 인코딩된 중국어 이메일을 보낼 때 제목이 왜곡되는 문제를 해결합니다.

PHP의 메일 기능을 사용하여 UTF-8로 인코딩된 중국어 이메일을 보낼 때 제목이 왜곡되는 문제를 해결합니다.

WBOY
WBOY원래의
2016-05-16 20:06:241292검색

최근에 문제가 발생했습니다. 즉, PHP의 메일 기능을 사용하여 UTF-8로 인코딩된 중국어 이메일을 보낼 때 제목은 깨져 보이지만 이메일 본문은 올바른 것입니다. 처음에는 페이지 인코딩 문제인 줄 알았으나, utf-8 페이지 인코딩에는 문제가 없다는 것을 알게 되었고, 오랫동안 원인을 찾아보니 드디어 문제가 발견되었습니다.

1. PEAR의 메일 클래스를 활용하세요

PEAR의 메일 클래스를 사용하면 sendmail 또는 SMTP를 사용하여 메일을 보내도록 선택할 수 있습니다. 이러한 패키지 인터페이스는 사용하기 쉽고 직접 바퀴를 새로 만들 필요가 없습니다.

2. 헤더의 제목 글자가 깨져 있는 것에 대하여

제목에 iso-8859-1 인코딩 이외의 텍스트를 직접 입력하지 마세요. 올바른 방법은 제목의 텍스트가 RFC 2047의 사양을 준수하도록 만드는 것입니다. 제목의 텍스트 인코딩은 다음과 같습니다. GB2312이면 올바른 제목 이 형식이어야 합니다
$headers['subject'] = '=?GB2312?B?' . base64_encode('제목 텍스트') .
UTF-8이라면 앞부분의 GB2312를 UTF-8로 바꾸면 됩니다. MTA 차별화가 정말 심각하기 때문에 제목에 GB2312 인코딩을 사용하는 것이 좋습니다. 대부분의 MSP는 자체 개발한 MTA를 사용하며, 어쨌든 대부분의 국내 MTA는 GB2312 인코딩을 지원할 수 있다고 믿습니다.

외국 MSP로 보내는 경우 GB2312 인코딩을 지원하지 않을 가능성이 높기 때문에 제목에 base64로 인코딩된 UTF-8 텍스트를 사용하는 것이 좋습니다.


3. 헤더에 콘텐츠 유형 을 추가하세요.

이메일 헤더의 콘텐츠 유형은 웹페이지의 콘텐츠 유형과 유사하며 text/plain 형식입니다. 이 옵션은 주로 이메일을 받는 클라이언트에 의미가 있습니다. 일부 웹메일은 이메일 내용을 올바르게 표시하기 위해 여기 설정에 따라 인코딩하고 변환합니다. gb2312 인코딩을 사용하여 이메일 주소 .com.tw로 보내면 어떤 일이 발생할지 상상할 수 있습니다.


4. 이메일을 보내는 데 사용하는 호스트를 올바르게 구성하세요.

1) 대부분의 고정되지 않은 IP는 역으로 해결할 수 없으며 일부 스팸 방지 전략에서는 이를 판단 기준으로 사용하기 때문에 역방향 해결을 구성해야 합니다.

2) MX Parsing을 설정해야 하는 이유는 위와 동일합니다.
3) 반송 경로가 반송된 이메일을 받을 수 있는지 확인하세요. 그렇지 않으면 이메일 전송 서버가 수신자의 블랙리스트에 포함될 수 있습니다.

$subject = stripslashes($the_post['Title']); 
$headers = "MIME-Version: 1.0\r\n"; 
$headers .= "Content-type: text/plain; charset=utf-8\r\n"; 
$headers .= "Content-Transfer-Encoding: 8bit\r\n"; 
$message = stripslashes(strip_tags($the_post['Content'])); 
mail($to, $subject, $message, $headers); 
먼저 base64_encode() 함수를 사용하고 MIME base64를 사용하여 데이터를 인코딩합니다

제목 문자열 앞에 인코딩 유형을 추가합니다(예: =?UTF-8?B?
). 제목 문자열 뒤에 추가: ?=
예:

<&#63;php  
 $to = "clairelume@qq.com"; //将此电子邮件地址改为自己的。  
 $name = $_POST['name'];  
 $email = $_POST['email'];  
 $subject = "来自博客读者的邮件";  
 $subject = "=&#63;UTF-8&#63;B&#63;".base64_encode($subject)."&#63;=";  
 $headers = "MIME-Version: 1.0\r\n";  
 $headers .= "Content-type: text/plain; charset=utf-8\r\n";  
 $headers .= "Content-Transfer-Encoding: 8bit\r\n";  
 $message = $_POST['message'];  
 mail($to,$subject,$message,"From: ".$email."",$headers);  
 echo 'OK '.$name.', 您的邮件已发送。';  
&#63;> 
이렇게 하면 전송되는 중국어 이메일 제목이 왜곡되지 않습니다.


아주 간단하지 않나요? 사실 문제를 철저하게 분석하면 모든 문제가 쉽게 해결될 것입니다. 이 글이 모든 분들의 공부에 도움이 되기를 바랍니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.