[PHP][heroku]Mailgun APIを使って添付ファイルを送る
以前に、mailgunで添付ファイル付きメールを送る方法を書いたが、
そちらは、SMTP
バージョンで、今回はそのMailgun APIバージョン。
以下のファイルをダウンロードして一式アップしておく。
(readmeファイルなどいらないものが大量にあるが、とりあえず全部あげておく)
Library Download (zip直リンク)
基本の送信方法は以下。
Sending Messages
# Include the Autoloader (see "Libraries" for install instructions)
require 'vendor/autoload.php';
use Mailgun\Mailgun;
# Instantiate the client.
$mgClient = new Mailgun('key-3ax6xnjp29jd6fds4gc373sgvjxteol0');
$domain = "samples.mailgun.org";
# Make the call to the client.
$result = $mgClient->sendMessage("$domain",
array('from' => 'Excited User <me@samples.mailgun.org>',
'to' => 'Baz <baz@example.com>',
'subject' => 'Hello',
'text' => 'Testing some Mailgun awesomness!'));
添付ファイルを送る方法は、attachment
を使って、その中にファイル名を書く。
ファイル名を指定する方法が紹介されていた。
https://github.com/mailgun/mailgun-php/issues/35
array(
'attachment' => array(
'filePath' => './' . $attach['name'],
'remoteName' => $attach['name']
)
)
この方法で実装したところ、一時ファイルから添付ファイルにしての送信、が出来なかった。
(ファイルがないと怒られる)
試しに、heroku内でmove_uploaded_file
を使ってみると、エラーもなく保存出来た。
そのままそのファイルを添付して送ったところ、無事、送信完了。
ただしファイル自体は直接アクセスしようとすると404
が表示されるので、
そのスクリプト内でのみ有効、のよう。
あと、上記の添付例のまま送信すると、2つ添付された。
どうやらファイル名を指定する箇所が効いておらず、書かれているファイル名が添付されたよう。
試しに、'remoteName' => $attach['name']
の行を削除しても送信出来た。
その部分を考慮して、最終的に出来たコードが以下。
・1ファイルを1つの宛先に送信する場合
・送信先や内容などはPOSTで受け取る想定
require '../vendor/autoload.php';
use Mailgun\Mailgun;
$mgClient = new Mailgun('key-xxx');
$domain = "appxxx.mailgun.org";
$attach = $_FILES["attach"]; //添付ファイル
//ファイル保存
try{
$result = move_uploaded_file($attach['tmp_name'], './'.$attach['name']);
} catch (Exception $e) {
var_dump($e->getMessage());
}
//メール送信
try {
$result = $mgClient->sendMessage("$domain",
array(
'from' => $_POST['fromname'].' <'.$_POST['fromaddress'].'>',
'to' => $_POST['toname'].' <'.$_POST['to'].'>',
'subject' => $_POST['subject'],
'text' => $_POST['body']
),
array(
'attachment' => array(
'./' . $attach['name']
)
)
);
var_dump($result);
} catch (Exception $e) {
var_dump($e->getMessage());
}
結局、一度保存してからの送信、となるので、SMTPを使った方が処理が速いかも。(未検証)