エンジニアブログです。mosa(榎本)です。今日は、LayerXインボイスの機能であるメール受信について解説していきます。LayerXインボイスでは、様々な方法で請求書ファイルを取り込むことができます。経理の方がアップロードできるのはもちろん、特定のメールアドレスに添付ファイル付きで送ることで、ファイルを取り込む仕組みがあります。流れとしては、以下の図のようになります。システムがメールアドレスを発行するユーザー様が取引先にメールアドレスをお伝えする取引先が月末に、当該アドレスに請求書を送付するこれにより、ユーザー様を介さずに、直接請求書をシステムに取り込むことができます。取引先がメールで請求書を送っている場合、送り先のアドレスを変えるだけで済むため、業務フローを変更することなく運用にのせることができます。このアーキテクチャをどのように組んだかを解説します。(なんだかんだでメールって難しいので、開発の一助になれば幸いです。)SendGrid当時重視したのは、最速で開発できることです。Webhook機能に行き着きました。どちらの特徴も備えた上で、spamやなりすましチェックもやってくれます。(SendGridはメール送信用のSaaSだと思っていたので、受信もできることをその時知りました。)使い方は単純で、ドメインを認証して向き先を設定し、受けるAPIを用意するのみ。実際には、以下のペイロードがmutlipartで渡ってきます。大体パース済なのが嬉しいです。取りこぼさない設計このメール受取機能は、なるべくメールを取りこぼさないことが要件に入ります。通常のサービス側はアップデートの際、メンテナンスを告知した上で停止する選択肢を取ることができます。メール受取機能は、お客様のさらに取引先(サービスを利用していません)から直に送られてくるため、メンテナンスであることを伝える術がなく、基本的に無停止であることが求められます。そのために、以下のことに気をつけました。通常のサービスAPIから切り離すこと必ず最初に生データをS3に上げ、後続処理に流すことサービスAPIとの切り離し通常のサービスAPIから切り離すことで、薄く安定したコンポーネントとし、独立したメンテナンスを可能にしました。Gatewayの制約上10MB以上のデータを受けられない関係から、現在は独立したECSをたててwebhookを受けています。(受けられないことそのものよりも、音もなく受信に失敗してしまい、送信側が気付けないことを問題視しました。keyを後続のジョブワーカーのためにenqueueします。実際の処理はワーカー側が行います。これにより、何かあったときでもリトライを可能にしています。生データが残っていることが調査を可能にしたケースも何件もありました。以下は薄いメール受信APIの例です。s3Key)}メンテナンスどうしても停止したい場合はどうしたら良いでしょうか。Webhook機能は、ステータスコード2xxを返さない限り、3日以内なら何度でもリトライしてくれる機能があります。そのため、メンテ中には503を返すことで、メンテ明けに問題なく受け取ることができるようにしています。便利ですね!最後にというわけで、メール受信のアーキテクチャを紹介しました。実際にはなんだかんだでパースに苦労したり、泥臭い文字化けとの戦いがあったりしましたが、それは折をみて紹介しようと思います。メールって難しい......今回はもろもろの前提をふまえSendGridを選びましたが、AWSならSESの受信機能をつかうのも全然ありだと思います。サーバーサイドこんにちは。最近「HUNTER×HUNTER」の既刊を全部読みました。LayerXでエンジニアをしている松本駿(toshi1127)です。企画・実施しましたLayerXの石黒(@takaya_i)です。@yyoshiki41(中川佳希)です。読者になるこのブログについてはてなブログをはじめよう!layerxさんは、はてなブログを使っています。ブログを報告する引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。