Webアプリケーションでは、メールの作成・送信がよくおこなわれます。

例 問い合わせフォーム、受付の通知メール

xamppのもとで、開発環境を整備したうえで、メールスクリプトの作成を行います。

開発環境の整備

xamppにメールサーバー Mercury (Mercury Mail Transport System)が準備されていますので、ここではMercuryを利用してメール送信します。

Mercuryは、PHPからのメールをインターネットにあるSMTPサーバーに送りメール送信となります。ですから、Mercuryを利用する場合には、SMTPサーバーが必要で、通常利用しているメールのSMTPサーバーでOKです。

Mercuryの設定

XAMPPを立ち上げる → コントロールパネル → MerucuryのStartをクリック

Adminをクリック

利用するプロトコルの設定

メニューバーのConfigurationタブをクリック → Protocol modulesをクリック

MerucuryS SMTP server MerucuryC SMTP relaying client のみにチェックを入れる → OK

SMTPサーバーの設定

メニューバーの「Configuration」をクリック → 「MercuryS SMTP Server」をクリック → 「Connection control」の「Do not permit SMTP relaying of non-local mail」のチェックを外す → OK

Mercuryを再起動します。

XAMPPを立ち上げる → コントロールパネル → MerucuryのStart → Admin

クライアントの設定

メニューバーの「Configuration」をクリック → 「MerucuryC SMTP client」をクリック

ここで利用するSMTPサーバーを指定します。以下の項目を設定してください。

「SMTP “Smart” Host details」

 「Smart host name」・・・SMTPサーバー名

 「Connection port/type」・・・SMTPサーバーのポート番号 その右でSSLのタイプを指定します。

「Credentials for SMTP Authentication, if required」

 「Login username」・・・メールのユーザー名

 「Password」・・・メールのパソワード

これらの設定が終わったらOK

これでMercuryの設定は完了です。

SMTPサーバー利用上のご注意

WEBメールのサーバー利用

Gmailのサーバーでは、セキュリティ上の問題で利用はお勧めできません。(ブロックされます)

Yahooなどのサーバー・・・送信元のアドレスがYahooのアドレスの場合のみ送信できます。

POPメールのサーバー利用

特に問題なく利用できます。

例 Niftyの場合の設定 次の通り設定してください。

メール作成・送信

PHPで日本語のメールを作成します。

メールの作成や送信
多種多様なメーラー(メール用のソフト)があります。文字コードの扱い(表題と本文)など、少しずつ差がありますのでご注意ください。
このサイトでは、outlook、Windows live メール、gmail、yahooメールで確認しています。

日本語用メール関数 mb_send_mail()の利用

表題・本文・宛先を指定したスクリプトの例です。

宛先・発信元のメールアドレスには、(記述様式として)正しいメールアドレスを指定してください。

<?php
//言語設定、内部エンコーディングを指定する
mb_language("japanese");
mb_internal_encoding("UTF-8");
//宛先のセット
//宛先に日本語を指定する場合には、mb_encode_mineheader関数を利用する。
$to=mb_encode_mimeheader("宛先") ."<atesaki@example.com>";
//メールの件名の指定
$title="メールの表題です。";
//メール本文の指定
$body="本文です。";
// Fromの指定
$header="From: " .mb_encode_mimeheader("発信元")."<info@example.com>";
// メールの送信
$result = mb_send_mail($to,$title,$body,$header);
// 結果のチェック
if($result) {echo"メールを送信しました。";}
else {echo "エラー メールの送信に失敗しました。";}
?>

作成できるメールは、テキストのみで、HTMLや添付ファイルのメールは作成できません。

また、表題や本文に機種依存文字(半角カタカナ、丸数字①、髙い、㈱などなど)があると、受信メールでは?に変換されますので、ご注意ください。

メールライブラリ phpmailer の利用

メール用のライブラリphpmailerがあります。このライブラリを使うと、添付ファイルメールやHTMLメールの作成が簡単にできます。

機種依存文字も利用できます。

ライブラリを入手する

phpmailer・・・PHPMailer-master.zipからダウンロードしてください。

zipファイルを解凍後、フォルダ内にあるclass.phpmailer.phpを以下のPHPスクリプトと同じフォルダにに移動してください。(残りのファイルは今回は使用しません)

メールの作成(添付ファイル付テキストメール)

<?php
// メールの作成・送信するサンプルscriptです。
//ライブラリ読み込み
require_once("class.phpmailer.php");
//言語設定、内部エンコーディングを指定する
mb_language("japanese");
mb_internal_encoding("UTF-8");
// メールの準備
$mail = new PHPMailer();
$mail->CharSet = "UTF-8";
// 送信先のセット
$mail->AddAddress("atesaki@example.com","宛先");
// メールの表題のセット
$mail->Subject = "メールの表題です。";
//メール本文
$body="本文です。";
// 本文のセット
$mail->Body = $body;
// 送信元のセット
$mail->SetFrom("info@example.com","メール送信元");
// 添付ファイルのセット 添付ファイルlogo.pngは、このスクリプトと同じフォルダにあります。
$mail->AddAttachment("logo.png");
// メール送信
if (!$mail->Send()){ echo("メールが送信できませんでした。エラー:".$mail->ErrorInfo);}
else{echo("メールを送信しました");}
?>

$mail->パラメータの指定
パラメータ 指定形式
文字コードの指定  $mail->CharSet = "UTF-8";
 通常CharSet = "ISO-2022-JP"ですが、機種依存文字対策でUTF-8を指定
宛先の指定 $mail->AddAddress("宛先アドレス","宛先名");
 複数の宛先を指定する場合には、addAddressを追加
CCの指定 $mail->AddCc("CCアドレス","CC名");
 複数のCCを指定する場合には、addCcを追加
BCCの指定 $mail->AddBcc("BCCアドレス","BCC名");
 複数のBCCを指定する場合には、addBccを追加
差出人の指定 $mail->SetFrom = ("差出人アドレス","差出人名");
表題の指定 $mail->Subject = "メールの表題です。";
本文の指定 $mail->Body = "メールの本文です。";
添付ファイルの指定 $mail->addAttachment("パスを指定")
 複数のファイルを添付する場合には、addAttachmentを追加
HTMLメールの指定 $mail->IsHTML(true);
 1回指定すれば、HTMLメールになります。指定しなければ、テキストメールです。
メールの送信 $mail->Send()
エラー情報 $mail->ErrorInfo

機種依存文字対策もできます。
phpmailerで、機種依存文字対策もできます。ただし、Windowsの世界のみ通用しますので、メールへの機種依存文字の利用はできるだけ避けてください。

メールフォーム

メールの編集や送信は、WEBアプリケーションでよく利用します。

一番簡単な方法はmailtoを利用した、お問い合わせ です。

<a href="mailto:atesaki@example.com?Subject=お問い合わせ&body=何なりと記入ください。">お問い合わせ</a>

このリンクをクリックすると、ブラウザの既定のメールソフトが立ち上がり、メール送信ができます。しかし、これを利用すると、指定したアドレスに大量の迷惑メールが送られてきますので、この設定は使わないようにしてください。

このため、通常、お問い合わせには、メールフォームと呼ばれる仕組みを利用します。

メールフォームの流れ

メールフォームを利用したメールの編集・送信の流れは、以下の通りです。

 

  • ① ブラウザから「お問い合わせ」をクリック
  • ② お問い合わせ画面(index.html)をブラウザに表示
  • ③ 画面に従ってお問い合わせ内容を入力
  • ④ 送信をクリックすると、メール用のスクリプト(mail.php)が起動され、メールを編集し送信。
      送信済み画面(end.html)をブラウザに送る
  • ⑤ 送られた送信済み画面を表示

サンプルメールフォーム

添付ファイルがある簡単なメールフォームを紹介します。

お問い合わせ画面

表題と本文の入力ができます。添付ファイルを2つまで指定できます。添付ファイルがなくてもOKです。

送信済み画面

メールフォームスクリプト

お問い合わせ画面表示用のスクリプト(index.html)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<title>添付ファイル 送信</title>
</head>
<body>
<p>添付ファイルの送信メールです。</p>
<form name="m_form" enctype="multipart/form-data" action="attach_mail.php" method="POST">
<p>表題         <input size="40" type="text" name="m_subject" value="phpmailer 添付ファイル 表題です" /></p>
<p>本文         <input size="40" type="text" name="m_body" value="phpmailer 添付ファイル付メールの本文です" /></p>
<p>添付ファイル1     <input size="40" type="file" name="m_userfile[]" /></p>
<p>添付ファイル2     <input size="40" type="file" name="m_userfile[]" /></p>
<p><input type="submit" name="submit" value="メール送信" /></p>   
</form>
</body>
</html>

添付ファイルのnameは配列で指定しています。 m_userfile[]・・・配列指定です。

メールの編集・送信用のスクリプト

添付ファイルのサイズは、1MB以下に制限します。

<?php
// 複数の添付ファイルを受け取り、メール送信するサンプルscriptです。
//ライブラリ読み込み
require_once("class.phpmailer.php");
//言語設定、内部エンコーディングを指定する
mb_language("japanese");
mb_internal_encoding("UTF-8");
// 表題と本文が記入されていない場合には、処理を終わります。
if ($_POST["m_subject"] == "") {echo("表題が記入されていません");exit();}
if ($_POST["m_body"] == "") {echo("本文が記入されていません");exit();}
// メール表題のセット
$subject = $_POST["m_subject"];
// メール本文のセット
$body = $_POST["m_body"];
// メールの編集
$mail = new PHPMailer();
$mail->CharSet = "UTF-8";
//
$mail->AddAddress("送信先アドレス","メール宛先");
$mail->SetFrom("送信元アドレス","メール送信元");
$mail->Subject = $subject;
$mail->Body = $body;
// 添付ファイルの準備
// inputでtype="file"が指定された場合には、指定されたファイルがphpのテンポラリエリアにアップロードされます。
// アップロードされたファイルの情報は、グローバル変数$_FILESで利用することができます。
// $_FILES["m_userfile"]["name"] クライアントの元のファイル名
// $_FILES["m_userfile"]["type"] アップロードされたファイルファイルのMIME型
// $_FILES["m_userfile"]["size"] アップロードされたファイルのバイトサイズ
// $_FILES["m_userfile"]["tmp_name"] サーバーにアップ後のテンポラリファイルの名前
// $_FILES["m_userfile"]["error"] ファイルアップロードに関するエラーコード
// nameを配列指定することにより、複数ファイルの指定も可能です。
// 添付ファイル数をセットします。ここでは最大10ファイルまで添付できます。
$count = 0;
for($i = 0;$i < 10;$i++) {
if ($_FILES["m_userfile"]["name"][$i]){$count = $count + 1;}
else break;
}
// 添付ファイルを確認して、添付処理をします。
//
for ($i = 0;$i < $count;$i++) {
// tmp_nameにあるファイルがアップロードされたものかチェックします。そうでない場合には、メッセージを出力して無視します。
if (is_uploaded_file($_FILES["m_userfile"]["tmp_name"][$i])) {
// ファイルサイズのチェック 1MB以上の場合には、添付しません。
if ($_FILES["m_userfile"]["size"][$i] < 1000000) {
// ファイルを添付します。
$mail->AddAttachment($_FILES["m_userfile"]["tmp_name"][$i],$_FILES["m_userfile"]["name"][$i]);
}
else {echo("ファイルサイズが大きすぎます。最大 1MBです。 ");echo($_FILES["m_userfile"]["name"][$i]);echo("このファイルは送信されません。");}
}
else {echo("ファイルのアップロードが異常です。");}
}
// メール送信
// メール送信 正常に送信できたらend.htmlをブラウザに送る
if (!$mail->Send()){ echo("メールが送信できませんでした。エラー:".$mail->ErrorInfo);}
else{header("Location:end.html");}

?>

$mail->Send() でメールを送信します。正常に終了した場合には、end.htmlを呼び出します。

送信済み画面の表示(end.html)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<title>送信正常終了</title>
</head>
<body>
メールを送信しました。
</body>
</html>