[PHP]herokuで添付ファイル付きメールを送る
herokuで、POSTされたファイルを添付してメールを送信してみた。
環境は、PHPのmbstring環境。
メールは、Mailgun。
SMTPメールを送るためのライブラリは、QBMailを使用。
php から確実にメール送信(Qdmail使用、SMTP経由)
POSTから送信されたファイルは、$_FILES
に保存される。
herokuでは、ファイルの保存が出来ないので、
一時ファイルから添付することで実現する。
送信された一時ファイル : $_FILES['xxx']['tmp_name']
ファイル名 : $_FILES['xxx']['name']
以下、送信部分のソース。
[HTML]
<input type="file" name="upfile" />
[PHP]
$mail = new Qdmail();
$mail -> smtp(true);
$param = array(
'host'=> $_ENV['MAILGUN_SMTP_SERVER'],
'port'=> $_ENV['MAILGUN_SMTP_PORT'],
'from'=> 'test@hoge.jp',
'protocol'=>'SMTP_AUTH',
'user'=> $_ENV['MAILGUN_SMTP_LOGIN'],
'pass' => $_ENV['MAILGUN_SMTP_PASSWORD'],
);
$mail ->attach(array($_FILES\["upfile"\]\["tmp_name"\], $_FILES["upfile"]['name'])); //添付ファイル
$mail ->smtpServer($param);
$mail ->to('送信先アドレス');
$mail ->subject('件名');
$mail ->from('送信元アドレス','送信元名');
$mail ->text('本文');
$mail ->send();
参考: 添付ファイルの指定(OOP)
以下、余談。
ファイルを送信する場合は、htmlのformタグに、enctype="multipart/form-data"
をつけないといけない。
<form method="post" action="example.php" enctype="multipart/form-data">
jqueryを使ってajaxで実現したい場合は、enctypeは必要なく、FormData
でまとめたデータを送信するようにし、
contentType
とprocessData
をfalse
にする必要がある。
var $form = $("form");
var fd = new FormData($form[0]);
// 送信
$.ajax({
url: $form.attr('action'),
type: $form.attr('method'),
data: fd,
contentType : false,
processData : false,
success: function(result) {
console.log(result);
},
error: function(xhr, textStatus, error) {}
}
参考:
jQueryでフォームをAjax送信する際の基本パターンのチュートリアル。二重送信の防御とか。
jQuery.ajax() でファイルを送る