LoginSignup
8
9

More than 3 years have passed since last update.

PHPのmail関数でメールを送信する。

Last updated at Posted at 2019-08-31

PHPのmail関数を用いて任意の文字コードで送受信を行う方法。

メール送信を行う際、特定の情報は7bitの文字列にエンコードする必要がある。

(1)メールタイトル
(2)差出人の名前

まずは、メールタイトルが全メールプラットフォームで文字化けしないようにエンコーディングする。


<?php
$to = "sample@sample.bz";

// メールのタイトルは7bitでの送信が必要になる。
$title = "これはめーるたいとるです。これはメールタイトルです。";
// 7bitとして扱えるようにbase64エンコードする
$title = base64_encode($title);
// メーラーに7bitで転送していること、しかし元の文字列は
// UTF-8で既にbase64エンコしていることを教えてやる必要があるので
// 以下のようなフォーマットにする
$title = "=?UTF-8?B?{$title}?=";
// "=?[文字エンコーディング]?[B(base64)あるいはQ(Quoted-Printable)]?

$senderName = "株式会社 メールを文字化けなしに送信する会社";
// 送信元の名前を7bitとして扱えるように修正
$senderName = base64_encode($senderName);
$senderName = "=?UTF-8?B?{$senderName}?=";
// "=?[文字エンコーディング]?[B(base64)あるいはQ(Quoted-Printable)]?

// メール本文は、メールヘッダーの項目によってエンコーディングを調整する必要がある
// Content-Type: text/plain; charset=(UTF-8|SHIFT-JIS|EUC-JP)など
// Content-Transfer-Encoding: (7bit|8bit|base64|quoted-printable)など
$body = "UTF-8で記述したメール本文を送信";
// 今回は、メール本文をbase64_encodeして送信してみる。
$body = base64_encode($body);

// 以上の設定から下記のメールヘッダーが想定される。
$mailHeaders = <<< EOF
From: {$senderName}<test@dummy.com>
Reply-To: test@dumy.com
Return-Path: test@dummy.com
X-Mailer: X-Mailer
MIME-Version: 1.0
Content-Type: text/plain;charset=UTF-8
Content-Transfer-Encoding: base64 

EOF;
// Content-Type: メール本文はUTF-8でエンコードされる
// Content-Transfer-Encoding: ただし、送信時はbase64化する


$res = mail($to, $title, $body, $mailHeaders);

var_dump($res);

以上で送信処理を行ってみる。

すると無事に送信及び受信できているのがわかる。

メールヘッダーのFromおよびメールタイトルについて

https://secure.php.net/manual/ja/function.mail.php#Hcom108669
phpの上記ページのマニュアルに詳しい。

以前は、メール本文も7bitで送ることがあらゆる環境にたいして望ましい
エンコーディングだったかもしれないが、現在はUTF-8で送信しても全く問題ないため
メールヘッダおよびタイトルのみに注意すれば、メール本文に致命的な不具合は発生しないと思われる。

8
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
9