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

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

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

このサイトでは、メール送信にGmailのsmtpサーバを利用します。Gmaiのアカウントが必要になりますので、お持ちでない場合には、事前に取得しておいてください。

開発環境の整備

xamppにメールサーバー Mercury がありますが、ここでは、より簡便な方法で環境を作ります。

windows7の場合

xampp のsendmailを利用します。

php.iniとsendmail.iniを変更します。

変更方法は、XAMPPのローカル環境からメールを送信する をご覧ください。

windows8・10の場合

TLS/SSLに問題がありますので、Stunnelを利用してTLS/SSLを解決し、メールを送信します。

Stunnelのインストール

Stunnelのホームページからダウンロードしてください。

Stunnelのホームページ → Downloadsタブ

stunnel-5.14-installer.exeをダウンロードして、インストールしてください。

インストール中に次の画面が表示されます。最初のCountry Nameにはjpを入力。その後は、.を入力してください。(.キー → Enterキー)

設定値の変更

php.iniの修正

mail functinで検索してください。

1130行目から オリジナルコード

[mail function]
; XAMPP: Comment out this if you want to work with an SMTP Server like Mercury
; SMTP = localhost
; smtp_port = 25

; For Win32 only.
; http://php.net/sendmail-from
;sendmail_from = postmaster@localhost
; XAMPP IMPORTANT NOTE (1): If XAMPP is installed in a base directory with spaces (e.g. c:\program filesC:\xampp) fakemail and mailtodisk do not work correctly.
; XAMPP IMPORTANT NOTE (2): In this case please copy the sendmail or mailtodisk folder in your root folder (e.g. C:\sendmail) and use this for sendmail_path.
; XAMPP: Comment out this if you want to work with fakemail for forwarding to your mailbox (sendmail.exe in the sendmail folder)
;sendmail_path = "\"D:\program\sendmail\sendmail.exe\" -t"
; XAMPP: Comment out this if you want to work with mailToDisk, It writes all mails in the C:\xampp\mailoutput folder
sendmail_path="D:\program\xampp\mailtodisk\mailtodisk.exe"

を次のように修正

[mail function]
; XAMPP: Comment out this if you want to work with an SMTP Server like Mercury
SMTP = localhost
smtp_port = 25

; For Win32 only.
; http://php.net/sendmail-from
;sendmail_from = postmaster@localhost
; XAMPP IMPORTANT NOTE (1): If XAMPP is installed in a base directory with spaces (e.g. c:\program filesC:\xampp) fakemail and mailtodisk do not work correctly.
; XAMPP IMPORTANT NOTE (2): In this case please copy the sendmail or mailtodisk folder in your root folder (e.g. C:\sendmail) and use this for sendmail_path.
; XAMPP: Comment out this if you want to work with fakemail for forwarding to your mailbox (sendmail.exe in the sendmail folder)
sendmail_path = "\"D:\program\sendmail\sendmail.exe\" -t"
; XAMPP: Comment out this if you want to work with mailToDisk, It writes all mails in the C:\xampp\mailoutput folder
;sendmail_path="D:\program\mailtodisk\mailtodisk.exe"

コメントの入れ替えです。

sendmail.iniの修正

xamppにあるフォルダーsendmailにsendmail.iniがあります。

sendmail.iniをサクラエディタで開いてください。

オリジナルコード

[sendmail]
; you must change mail.mydomain.com to your smtp server,
; or to IIS's "pickup" directory. (generally C:\Inetpub\mailroot\Pickup)
; emails delivered via IIS's pickup directory cause sendmail to
; run quicker, but you won't get error messages back to the calling
; application.
smtp_server=mail.mydomain.com
; smtp port (normally 25)
smtp_port=25
; SMTPS (SSL) support
; auto = use SSL for port 465, otherwise try to use TLS
; ssl = alway use SSL
; tls = always use TLS
; none = never try to use SSL
smtp_ssl=auto
; the default domain for this server will be read from the registry
; this will be appended to email addresses when one isn't provided
; if you want to override the value in the registry, uncomment and modify
;default_domain=mydomain.com
; log smtp errors to error.log (defaults to same directory as sendmail.exe)
; uncomment to enable logging
error_logfile=error.log
; create debug log as debug.log (defaults to same directory as sendmail.exe)
; uncomment to enable debugging
;debug_logfile=debug.log
; if your smtp server requires authentication, modify the following two lines
auth_username=
auth_password=

を次のように修正

[sendmail]
; you must change mail.mydomain.com to your smtp server,
; or to IIS's "pickup" directory. (generally C:\Inetpub\mailroot\Pickup)
; emails delivered via IIS's pickup directory cause sendmail to
; run quicker, but you won't get error messages back to the calling
; application.
smtp_server=localhost
; smtp port (normally 25)
smtp_port=25
; SMTPS (SSL) support
; auto = use SSL for port 465, otherwise try to use TLS
; ssl = alway use SSL
; tls = always use TLS
; none = never try to use SSL
smtp_ssl=auto
; the default domain for this server will be read from the registry
; this will be appended to email addresses when one isn't provided
; if you want to override the value in the registry, uncomment and modify
default_domain=gmail.com
; log smtp errors to error.log (defaults to same directory as sendmail.exe)
; uncomment to enable logging
error_logfile=error.log
; create debug log as debug.log (defaults to same directory as sendmail.exe)
; uncomment to enable debugging
;debug_logfile=debug.log
; if your smtp server requires authentication, modify the following two lines
auth_username=ユーザー名@gmail.com
auth_password=登録したパスワード

これで環境設定ができました。

XAMPPとstunnelを起動してください。

stunnel.confの修正(C:\Program Files (x86)\stunnel\stunnel.conf)が必要との情報もありますが、修正は不要です。

メールを送信すると Could not instantiate mail function. のエラーになる場合があります。Googleアカウントへのログインがブロックされている可能性があります。Gmailの受信トレイを確認して、ブロックされているとのメールを受信していたら、アカウント保護を無効にしてください。

メール作成・送信

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>