例えば、問い合わせフォームやダウンロードフォームなどのシステム側から、画像ファイルや圧縮ファイルなどを添付したメールを送信したいことがあります。
その際は、PEAR の Mail_Mime パッケージを使うのが常套手段です。
その他にもGoogleなどで検索すると、PHPの添付メール用クラスを自作されているサイトがいくつか引っかかりますが、いずれもかなり高度なことができるため、コードが比較的長めになっています。
メールを送るだけならもっとシンプルに作成できますので、ここでは自分で機能追加したい場合などのことを想定して、簡単なものを作成してみました。
なお、メールヘッダなど、ある程度SMTPプロトコルの知識があることを想定しています。
例えば、CCを利用したい場合などは、CC: CC-mail-address@example.com などの行を $additional-header に追加してください。
また、ここではコードを短くするため、MIME-typeの取得にfinfo_file() 関数を使っていますが、この代わりに自作関数などを利用することも可能です。
詳しくは、0005. MIME-typeを定義する方法 をご覧ください。
<?php
// 複数のファイルを添付してメールで送信する例
if (!extension_loaded('fileinfo')) { die("fileinfo 拡張モジュールがインストールされていません"); } // 送信するメールに関するの情報
// ↓ 送信先メールアドレス
$to = "hogehoge@example.com";
// ↓ 送信元
$from = "fuga@system.example.com";
// ↓ 件名
$subject = "添付メールのサンプル";
// ↓ メール本文
$body = <<< __EOT
こんにちは。
あなたが選んだファイルを添付しますので、ご確認ください。
もし添付ファイルが開けない場合は、お手数ですがご連絡ください。
__EOT;
// ダウンロードさせたいファイルを配列にセット
$aFilenames = array('test001.txt', '../test002.jpg', 'test003.zip');
// 文字化けする場合は明示的に文字エンコーディングを指定してください
$encoding = mb_detect_encoding($body, "SJIS,EUC-JP,JIS,UTF-8");
// 添付ファイルのMultiPartを作成する
function getAttatchFile($aFile, $body) {
$sLine = "--";
$sMultipartLine = '_'.uniqid(b, true).'_powered_by_php.to_';
$sMultipartLine = "-----------moemoe";
$sContentType = "multipart/mixed; boundary=\"$sMultipartLine\"";
$out = "$sLine$sMultipartLine\nContent-Type: text/plain; charset=\"iso-2022-jp\"\n";
$out .= "Content-Transfer-Encoding: 7bit\n\n";
$out .= "$body\n";
foreach($aFile as $filename) {
$fn = basename($filename);
if (trim($fn) && file_exists($filename)) {
$finfo = finfo_open(FILEINFO_MIME, "/usr/share/file/magic");
$mime = finfo_file($finfo, $filename);
finfo_close($finfo);
//
$out .= "\n$sLine$sMultipartLine\n";
$out .= sprintf("Content-Type: %s; name=\"%s\"\n", $mime, $fn);
$out .= sprintf("Content-Disposition: attachment; filename=\"%s\"\n", $fn);
$out .= "Content-Transfer-Encoding: base64\n\n";
$out .= chunk_split(base64_encode(file_get_contents($filename))) . "\n";
}
}
$out .= $sLine . $sMultipartLine . $sLine;
return array($sContentType, "This is a multi-part message in MIME format.
\n".$out);
}
//
if ($encoding != "JIS") {
//echo $encoding;
$subject = mb_convert_encoding($subject, "JIS", $encoding);
$body = mb_convert_encoding($body, "JIS", $encoding);
}
$subject = base64_encode($subject);
$subject = '=?ISO-2022-JP?B?' . $subject . '?=';
list($content_type, $body) = getAttatchFile($aFilenames, $body);
$header = <<< __EOT
From: $from
MIME-Version: 1.0
Content-Type: $content_type
X-Mailer: php.to tips sample mailer [see http://php.to/tips/]
Content-Transfer-Encoding: 7bit
$additional_header
__EOT;
echo mail($to, $subject, $body, ereg_replace("\r\n|\r|\n","\n", trim($header)));
?>
|