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());
当控制器解析入站电子邮件请求时,附件是一个 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());