[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を使った方が処理が速いかも。(未検証)

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