SESはを用いたメール配信サービスを実装していると、ファイルの添付もしたいと言う要望があります。
例えば、マンスリーレポートの配信です。
レポートのサイズが1MB程度のファイルなら添付しても問題ありません。
しかし、20MBを超えるようなリテラシー的にも御法度なファイルを添付したい場合は対策が必要です。
今回は、SESで大きめのファイルを添付したい時の注意と対策について触れます。
SESファイル上限
SESで配信する場合、添付出来るファイルサイズは10MB以下です。
実際には本文やタイトル等のサイズも関連しますので10MB未満に制限する必要があります。
Q: Amazon SES では、E メールのサイズに制限はありますか?
Amazon SES が扱える E メールメッセージのサイズは最大 10 MB です。これには、メッセージの一部である画像や添付ファイルも含まれます。
Amazon SES に関してよくある質問より
対処方法
私が考えつく範囲では、下記の方法でメールサイズを縮小する方法があります。
- ファイルに添付するサイズを制限する
- ダウンロード用のリンクを設ける
ダウンロードリンクで対応する場合は別途ファイルダウンローダーのような仕組みを実装する必要があります。
サーバーの運用コストを抑えた実装するのであれば、AWSのS3をファイルダウンローダー代わりに使う方法があります。
S3はデフォルト状態であれば、HTTP経由でのアクセスすることもできません。
静的ホスティングでHTTPアクセスする事も可能ですが、なるべく他人のファイルへのアクセスは極力させたくない場合もあります。
(リンクを公開する以上は完全なアクセス禁止は難しいです。)
署名付きURLを発行する事で、特定URLからのみS3のファイルへアクセスさせる事ができます。
署名付きURL実装方法について
署名付きのURLはAWSが提供しているSDKを使用する事で実装出来ます。
PHPの場合は、下記の記事で説明されています。
https://docs.aws.amazon.com/ja_jp/sdk-for-php/v3/developer-guide/s3-presigned-url.html
署名付き URL の作成の項で記載されていますが、下記のようにURLを発行出来るようです。
//Creating a presigned URL $cmd = $s3Client->getCommand('GetObject', [ 'Bucket' => 'my-bucket', 'Key' => 'testKey' ]); $request = $s3Client->createPresignedRequest($cmd, '+20 minutes'); // Get the actual presigned-url $presignedUrl = (string)$request->getUri();
Laravelの場合
Laravelではデフォルトで署名付きURLを発行する機能が内蔵されています。
ストレージ(envのSTORAGE_TYPE
)をS3に設定する事で、URL発行を1処理で実行してくれます。
ファイルURLの項で説明されていますが、下記のようにURLを発行できます。
use Illuminate\Support\Facades\Storage; $url = Storage::url('file.jpg');