Mailgun - 入站电子邮件附件保存到 laravel 存储

Mailgun - Inbound email attachment save to laravel storage

当控制器解析入站电子邮件请求时,附件是一个 json 如下形式的 blob 数组。

"attachments": [
    {
        "url": "https://se.api.mailgun.net/v3/domains/mg.example.com/messages/eyJwIjpmYWxzZSwiayI6IjBhYjM5MWE5LTU5YzUtNGJkMS1hMzE5LTBhNjU0ODAwOTY4ZCIsInMiOiIyYWMyN2YxYzc2IiwiYyI6InRhbmtiIn0=/attachments/0",
        "content-type": "text/csv",
        "name": "widget-order.csv",
        "size": 554
    }
]

一封入站电子邮件具有一个或多个可通过身份验证访问的附件。为此,下面的方法使用 GuzzleHttp\Client.

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Requests;
use Illuminate\Support\Facades\Storage;
use Illuminate\Database\Eloquent\Collection;
use GuzzleHttp\Client;

class MailgunWidgetsController extends Controller
{
    public function store(Request $request)
    {
        try
        {
            $attachs = request('attachments');

            if(!is_null($attachs)) {
                $attachments = json_decode($attachs, true);

                foreach($attachments as $k => $a) {
                    $httpClient = new Client();
                    $resp = $httpClient->request('GET', $a['url'], ['auth' => ['api' => 'key-example']]);
                    $imageData = $resp->getBody();
                    $base64 = base64_encode($imageData);
                    $this->saveTicketAttachment($base64, $a['name'], $ticket);
                }
            }
            return response()->json(['status' => 'ok']);
        }   
        catch(\Exception $e) 
        {
            return response()->json(['status' => 'ok']);
        }
    }
}

现在,代码块进入foreach,附件的url由$a['url']给出,但是GET请求失败。我认为发生了某种异常,但它没有记录在 laravel.log 文件中,因为代码执行在 GET 请求处停止。

Objective 是访问这个附件并将其转换为它的 base64 编码。

使用 GuzzleHttp\Client 从入站电子邮件附件生成 base64 encoded 字符串的正确实现如下:

private function getTicketAttachment($attachment)
{
    $httpClient = new Client();
    $response = $httpClient->get($attachment['url'], [
        'auth' => ['api', env("MAILGUN_SECRET")], 
    ]);
    $imageData = (string)$response->getBody();
    $base64 = base64_encode($imageData);
    return $base64;
}

我写这篇文章是为了在 tutorial on laravel news

之后来到这里的其他人

这是抓取文件并将其放入存储文件夹的方式:

Storage::put(.$file['name'], $response->getBody());