UTF-8メールを送信する方法は?


83

メールを送信すると、英語以外の文字が表示されません。以下のように表示されます。

余生ä»ä»

実際にこれを引き起こす原因を知っているかもしれませんか?スクリプトにContent-typeとcharsetを追加しようとしても、同じように表示されます。

使った Mail::Factory("mail");


2
あなたは何を使うのですか?ネイティブmail()またはZend_MailまたはPHPMailer?Factoryメソッドのコードが必要です!
Wesley van Opdorp 2011

2
さらに、宛先の電子メールクライアントを管理する必要があります。メールクライアントでメールを正しく表示できるようになったとしても、顧客にメールが正しく表示されるとは限りません。結局、私は常にutf-8文字セットヘッダーを使用してhtmlメールを作成します。このようにして、ほとんどの電子メールクライアントはコンテンツを正しく表示します。
マルコ

@FlyBy:はい、まさに私がやりたいことです。コンテンツをutf-8文字セットで表示しますが、それでもメールが正しく表示されません。
deepWebMie 2011

Content-Typeとcharsetは、まさにこれを機能させるために必要なものですが、より多くの情報を提供する必要があります。コードを見せていただけませんか。および/または結果のメッセージのソース?データが正しくutf8エンコードされていることを確認しますか?
トリプリー2011

3
これが私のサンプルコードです: $mail = Mail::factory("mail"); $to = "me@abc.com"; $body = "好信"; $headers = array("Content-type =>"text/plain: charset=\"UTF-8","From" => "abc@abc.com","To" => "me@abc.com","Subject" => "Test Send Chinese mail-好信"); $mail->send($to, $headers, $body); これは正しいですか?それは私が期待するものを示していません。本文、ヘッダー、さらには件名に中国語の単語を表示する必要があります。
deepWebMie 2011

回答:


116

メッセージ本文にヘッダー「Content-Type:text / html; charset = UTF-8」を追加できます。

$headers = "Content-Type: text/html; charset=UTF-8";

ネイティブmail()関数を使用する場合、$ headers配列が4番目のパラメーターになります mail($to, $subject, $message, $headers)

PEAR Mail :: factory()を使用する場合、コードは次のようになります。

$smtp = Mail::factory('smtp', $params);

$mail = $smtp->send($to, $headers, $body);

これが私のコードです$ mail = Mail :: factory( "mail"); $ to = "me@abc.com"; $ body = "好信"; $ headers = array( "Content-type =>" text / plain:charset = \ "UTF-8"、 "From" => "abc@abc.com"、 "To" => "me@abc.com" 、 "件名" => "テスト送信中国語メール-好信"); $ mail-> send($ to、$ headers、$ body)これは正しいですか?それは私が期待するものを示していません。本文、ヘッダー、さらには件名に中国語の単語を表示する必要があります。
deepWebMie 2011

1
どの電子メールツールが7ビット転送エンコーディングを使用しますか?
グロドリゲス2015

3
phpの4番目のパラメーターmail()は文字列であり、配列ではありません!!
ウラジミールパンテレエフ2015年

2
charset=UTF-8引用符なしで書くようにしてUTF-8ください!
Mel_T 2015年

4
text/htmlHTML形式でメールを送信する場合にのみ使用してください。プレーンテキストの電子メールの場合は、が必要ですtext/plain
スチュワート

34

すべてのメールシステム(例:http//10minutemail.com)がUTF-8メールを読み取れるわけではないため、かなり指定された文字セット(ISO-8859-2)を使用しています。これが必要な場合:

function utf8_to_latin2($str)
{
    return iconv ( 'utf-8', 'ISO-8859-2' , $str );
}
function my_mail($to,$s,$text,$form, $reply)
    {
        mail($to,utf8_to_latin2($s),utf8_to_latin2($text),
        "From: $form\r\n".
        "Reply-To: $reply\r\n".
        "X-Mailer: PHP/" . phpversion());
    }

Appleデバイスが以前のバージョンをうまく読み取れなかったため、別のメーラー関数を作成しました。

function utf8mail($to,$s,$body,$from_name="x",$from_a = "info@x.com", $reply="info@x.com")
{
    $s= "=?utf-8?b?".base64_encode($s)."?=";
    $headers = "MIME-Version: 1.0\r\n";
    $headers.= "From: =?utf-8?b?".base64_encode($from_name)."?= <".$from_a.">\r\n";
    $headers.= "Content-Type: text/plain;charset=utf-8\r\n";
    $headers.= "Reply-To: $reply\r\n";  
    $headers.= "X-Mailer: PHP/" . phpversion();
    mail($to, $s, $body, $headers);
}

2
また、ISO-8859-2で表現できないコンテンツを送信しようとしている場合はどうなりますか?!
deceze

4
$headers.= "From: =?utf-8?b?".base64_encode($from_name)."?= <".$from_a.">\r\n";この行は私の問題を解決しました、ありがとう!
ジュリア

2
それは単純なようですが、プレーンテキストのメーラーでの読みやすさのために引用された印刷可能なエンコーディングを考えてみましょう:'=?utf-8?Q?' . quoted_printable_encode($string) . '?='
エディ・引用

@ジュリアありがとう、私も。
fdrv 2016

ccとbccはどうですか?
Toskan 2017

1

そうでない場合はHTMLUTF-8お勧めしません。koi8-rそしてwindows-1251問題なくのみ。したがって、htmlメールを使用してください。

$headers['Content-Type']='text/html; charset=UTF-8';
$body='<html><head><meta charset="UTF-8"><title>ESP Notufy - ESP Сообщения</title></head><body>'.$text.'</body></html>';


$mail_object=& Mail::factory('smtp',
    array ('host' => $host,
        'auth' => true,
        'username' => $username,
        'password' => $password));
$mail_object->send($recipents, $headers, $body);
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.