[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でまとめたデータを送信するようにし、
contentTypeprocessDatafalseにする必要がある。

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() でファイルを送る

   このエントリーをはてなブックマークに追加