ユニファ開発者ブログスマートフォン用の表示で見るユニファ開発者ブログユニファ株式会社システム開発部メンバーによるブログです。メールWebエンジニアの本間です。見て、「おぉ、なんかすごい!」と思い紹介しようかと思ったのですが、いかんせん時間が少ないのであきらめます(^_^;)今回は、少し前にRailsのメール送信を独自に実装したいケースがあり、その時に調査、実装した内容をサンプルコードを交えて紹介しようと思います。自作のメール送信処理のサンプルとして、「Slackに通知するメール送信処理」を実装して見ます。部分に重要な記述があります。記載されているので、独自のメール送信方法が指定されることを想定していると考えて良さそうです。gemのインターフェースに沿ってメール送信方法を実装し、それをRailsで使うように設定すればいけると考えました。gemのインターフェースに沿って実装して、とのことですが、こちら明確なインターフェースがあるわけではなさそうです。ある既存実装を参照する限り、以下の内容を実装すればよさそうです。endendサンプルの実装は以下のようになっています。SlackのAPI呼び出しに必要なトークンと送信先チャンネルは、初期化時の設定から取得するようにしています。やっていることは「Mail::MessageオブジェクトをSlackにPostできる形式に変換」、「その結果をSlackへPost」の2つだけです。自作したメール送信方法をRailsで使うように設定する必要があります。今回は、アプリケーション全体でデフォルトで使うメール送信方法に設定しました。ここ以外にも、Mailerクラスごとや各メールで設定することができます。以下におき、起動時に設定します。独自のメール送信方法を追加する。これで.slack_settings=というメソッドが追加され、設定を保存できるようになる。この設定は、SlackMailDeliveryMethodの#initializeで渡される。メール送信に必要な設定を行う。デフォルトのメール送信方法に設定。:slackメール送信の実行ここまでくれば、通常のActionMailerを使ったメール送信と同じです。以下のようなMailerクラスを作成して、テストしてみます。'TestMailer.test_email.deliver'すると...、こんな感じで無事Slackに通知することができました。おまけ非同期処理化ActionMailerで実装することのメリットの1つとして、メール送信の非同期処理化が非常に簡単にできることが挙げられます(要ActiveJobの設定)。1分後に実行メール送信時に独自パラメーターを追加メール送信処理に独自のパラメーターを渡すこともできます。今回は、通知するチャンネルを変更できるようにしてみます。パラメーターを追加してみます。endend次にメール送信のクラスの方で、指定されたチャンネルにPostするように実装を変更してみます。値を取得することができます。注意点として、返ってくる値は文字列になっています。これは、メールヘッダーに設定することを前提とした実装になっているためです。文字列以外の値をセットする場合、取り扱いには注意してください。それでは、チャンネルを変更してメール送信してみます。'TestMailer.test_email("#another_my_channel")'まとめ今回、Railsに独自のメール送信方法を追加する方法を紹介しました。gemのインターフェースを実装し、それを既存実装に差し替えてセットするという方法は、とてもオブジェクト指向しているなー、という感覚があり楽しいです。ActionMailerに関して、「ユーザーに何かを通知する」という方法は、10年前はメールがメインでしたが、現在はスマートフォンのプッシュ通知やブラウザのNotifications、SMSなど様々な方法があります。アプリケーション内でこれらの通知の使い分けが必要になると、メールはActionMailer、プッシュ通知は独自実装、となって、コード内がややごちゃごちゃしてしまう、という感覚があります。この辺をうまいこと抽象化できないかなー、と思ったり思わなかったりしています。以上になります、最後まで読んできただきありがとうございました。今回の記事では、12月ということ...2019-12-10ビーコン信号による位置推定(入門)研究開発部の浅野です。botを作ってみたこんにちは、tjinjinです。Fargate)で運用する際のログ設定で工夫した点こんにちは、Webエンジニアの本間です。通信してみるこんにちは、iOSエンジニアのしだです。Detection月別アーカイブスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。