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

问题描述 投票:0回答:2

当控制器解析入站电子邮件的请求时,附件是下面表单中的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请求处停止。

目标是访问此附件并将其转换为其base64编码。

php laravel mailgun
2个回答
0
投票

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

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;
}

0
投票

我写这篇文章是为了跟随tutorial on laravel news来到这里的其他人

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

Storage::put(.$file['name'], $response->getBody());
© www.soinside.com 2019 - 2024. All rights reserved.