当控制器解析入站电子邮件的请求时,附件是下面表格中的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
,附件的网址由$a['url']
提供,但GET请求失败。我认为发生了某种异常,但它没有记录在laravel.log
文件中,因为代码执行在GET请求处停止。
目标是访问此附件并将其转换为base64编码。
答案 0 :(得分: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;
}
答案 1 :(得分:0)
我为tutorial on laravel news之后的其他人写了这篇文章
这是您抓取文件并将其放入存储文件夹的方式:
Storage::put(.$file['name'], $response->getBody());