日本語のメールを送信する

広告

ヘッダーや本文に日本語などのマルチバイト文字列を使う場合にはメールを送信する前に適切なエンコーディングを行う必要があります。

まずメールヘッダーに日本語が含まれる場合です。サブジェクトやメールアドレスの一部に日本語が含まれる場合が想定されます。メールヘッダーについては文字コードとして「ISO-2022-JP」の"B" encodingを使います。

メールヘッダーを変換するには「mb_encode_mimeheader」関数を使います。(詳しくは『MIMEヘッダの文字列をエンコードする(mb_encode_mimeheader)』を参照して下さい)。

例えば次のように記述します。

$recipients = "xxx@xxx.xxx, xxx@xxx,xxx";
$headers = array(
  "To" => "xxx@xxx.xxxx",
  "From" => "xxx@xxxx.xxxx",
  "Subject" => mb_encode_mimeheader("テストメール")
);

今回はサブジェクトに日本語を利用する場合に「mb_encode_mimeheader」関数を使って変換しています。

次にメール本文に日本語が含まれる場合です。メール本文は文字コードとして「ISO-2022-JP」を使って変換します。

文字列を任意の文字コードに変換するには「mb_convert_encoding」関数を使います。(詳しくは『文字エンコードを変換する(mb_convert_encoding)』を参照して下さい)。

例えば次のように記述します。

$recipients = "xxx@xxx.xxx, xxx@xxx,xxx";
$headers = array(
  "To" => "xxx@xxx.xxxx",
  "From" => "xxx@xxxx.xxxx",
  "Subject" => mb_encode_mimeheader("テストメール")
);
$body = "日本語メールのテストです。";
$body = mb_convert_encoding($body, "ISO-2022-JP", "auto");

元の文字列の文字コードが決まっている場合には「auto」の代わりに固定の文字コードを指定して下さい。

サンプルプログラム

では簡単なサンプルで実際に試してみます。

sample5-1.php

<?php
require_once("Mail.php");

$params = array(
  "host" => "xxx.xxx.xx",
  "port" => 587,
  "auth" => true,
  "username" => "xxx@xxx.xxx.xx",
  "password" => "xxxxxxxxx"
);

$mailObject = Mail::factory("smtp", $params);

$recipients = "xxx@xxx.xxx.xx";
$headers = array(
  "To" => "xxx@xxx.xxx.xx",
  "From" => "xxx@xxx.xxx.xx",
  "Subject" => mb_encode_mimeheader("テストメール")
);

$body = "日本語メールのテストです。";
$body = mb_convert_encoding($body, "ISO-2022-JP", "auto");

$mailObject -> send($recipients, $headers, $body);

?>

※SMTPサーバやメール送信先などは書き換えて使用して下さい。ポート番号も「Outbound Port25 Blocking」などの関係で25番ポートではなく587番ポートなどが使われていますがこちらも環境に合わせて変更して下さい。

メール送信用PHPを呼び出すためのHTMLファイルを用意しました。

mail5-1.html

<html>
<head><title>PHP TEST</title></head>
<body>

<p>メール送信テスト</p>

<p>
<a href="./sample5-1.php">メール送信</a>
</p>

</body>
</html>

ではメール送信用HTMLファイルをWWWサーバに設置しブラウザで見てみると下記のように表示されます。

日本語メールの送信

「メール送信」と書かれたリンクをクリックするとメールが送信されます。実際に届いたメールを確認すると次のようにヘッダーも本文も無事日本語を使えていることが確認できます。

日本語メールの送信

( Written by Tatsuo Ikura )