20885
PEARライブラリを使ってマルチパートメールを送信したいと考えております。

参考サイト：<http://www.phpbook.jp/pear/pear_mail/index9.html>

ところが題名と本文のところで、文字化けが起こってしまいます。

```

    <?php
    
    require_once("Mail.php");
    require_once("Mail/mime.php");
    
    $params = array(
      "host" => "mailsvr-01.local",
      "port" => 587,
      "auth" => false
    
    );
    
    $mailObject = Mail::factory("smtp", $params);
    
    $recipients = "hoge15@mailsvr-01.local, hoge13@mailsvr-01.local";
    
    $body = "テストです。";
    $body = mb_convert_encoding($body, "ISO-2022-JP", "auto");
    
    $mimeObject = new Mail_Mime("\n");
    $mimeObject -> setTxtBody($body);
    
    $bodyParam = array(
      "head_charset" => "ISO-2022-JP",
      "text_charset" => "ISO-2022-JP"
    );
    
    $body = $mimeObject -> get($bodyParam);
    
    $addHeaders = array(
      "To" => "hoge15@mailsvr-01.local",
      "From" => "hoge13@mailsvr-01.local",
      "Subject" =>mb_encode_mimeheader("テストメール")
    );
    
    $headers = $mimeObject -> headers($addHeaders);
    
    $mailObject -> send($recipients, $headers, $body);
    
    
    ?>
    
```

受け取っメールを表示すると、下記のようになります。

```

    [root@mailsvr-01 new]# cat 1452663570.Vfd00Ic3784M864173.mailsvr-01.local
    Return-Path: <hoge13@mailsvr-01.local>
    X-Original-To: hoge13@mailsvr-01.local
    Delivered-To: hoge13@mailsvr-01.local
    Received: from localhost (mailcli-01.local [192.168.100.40])
            by mailsvr-01.local (Postfix) with ESMTP id C27E8A388D;
            Wed, 13 Jan 2016 14:39:30 +0900 (JST)
    MIME-Version: 1.0
    Content-Type: text/plain; charset=ISO-2022-JP
    Content-Transfer-Encoding: quoted-printable
    To: hoge15@mailsvr-01.local
    From: hoge13@mailsvr-01.local
    Subject: =?UTF-8?B?w6PCg8KGw6PCgsK5w6PCg8KIw6PCg8Khw6PCg8K8w6PCg8Kr?=
    
    =1B$B%F%9%H$G$9!#=1B(B
    [root@mailsvr-01 new]#
    
```

どこの設定を見直せばよいかご教授いただけますでしょうか。

以上、お手数ですがよろしくお願いいたします。
CC BY-SA 3.0
2016-01-13T05:28:39.400
20875
2016-01-13T12:43:43.550
2016-01-13T09:25:30.107
8000
13426
question
php postfix
PEARライブラリを使ってメール送信を行った際の文字化け
まず、本文が一件訳の分からない文字列になっているのは正しい挙動です。元々の電子メールの規格では件名や本文にASCII文字以外を使うことは想定されておらず、その枠組みの中で他の言語を書く際にはASCII文字だけになるよう符号化して送ることとされました。その符号化を行った結果が

```

    =1B$B%F%9%H$G$9!#=1B(B
    
```

なので、これは問題ありません。メールソフトを通せば正しく日本語で表示されます。

一方、件名はその符号化（MIMEエンコード）が正しく行われていません。

[`mb_encode_mimeheader()`](http://php.net/manual/ja/function.mb-encode-
mimeheader.php) でその処理を行っているのですが、この関数は `mb_internal_encoding()`
等で設定される内部エンコーディングから ISO-2022-JP や UTF-8
への変換を行い、ヘッダ用の符号化を行います。質問に記載された送信結果から推測するに、この `mb_internal_encoding()`
が正しく指定されていないため、意図せぬ文字コード変換が行われています。

基本的に [`mb_internal_encoding()`](http://php.net/manual/ja/function.mb-internal-
encoding.php) にはソースコードの文字コードを指定します。加えて、日本語圏のメールソフトの慣習に合わせて処理を行うために、
[`mb_language()`](http://php.net/manual/ja/function.mb-language.php)
も設定しておくとよいでしょう。

まとめると、mb_**系の関数を呼び出す前に以下の二行を実行します。

```

    mb_internal_encoding('UTF-8'); // もし違う文字コードであれば変更してください
    mb_language('ja');
    
```

なお、これらの設定は php.ini でも行うことができます。

参考： [日本語利用の為の設定(mbstring) - php.iniの設定 -
PHPインストールと初期設定](http://www.phpbook.jp/install/phpini/index5.html#section2)
CC BY-SA 3.0
2016-01-13T12:43:43.550
20885
2016-01-13T12:43:43.550
8000
20875
answer