質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.12%

RailsでActionMailerを用いた時のOpenTimeoutエラーを解決したい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,492

syclimb

score 13

 前提・実現したいこと

【実現したいこと】
ECにおいて注文が発生した際に、注文の内容がメールで自動送信されるようにしたい。
【前提】
Ruby on Rails 5を用いてWebアプリケーションを作成しています。
そこで注文が発生した際に、その注文内容がメールで送られてくるようにしたくいです。
それがRailsのActionMailerを用いればできると知り、下記のサイトを参考にコードを書きました。

【参考にしたサイト】
https://www.sejuku.net/blog/48739
http://a-new-step.hatenablog.com/entry/2018/06/24/130107
http://www.cattlemute.com/2017/10/30/55/

 発生している問題・エラーメッセージ

注文確定時にはform_tagでcompleteアクションが実行されるのですが、下記のエラーがでてしまい、メールが送信されません。

Net::OpenTimeout in OrderController#complete
execution expired

なおメーラーをインストールする前は特に問題なく動いていました。
おそらくcompleteアクション内(下記参照)の

OrderMailer.send_mail(order).deliver_now

部分で何かしらエラーが発生しているものと思われます。
(binding.pryを用いたところ、その直前までは問題なく動きました)

 メーラーに関わる設定など

order_mailer.rb

Order.Mailerモデルにおいてsend_mailメソッドを用いています。

class OrderMailer < ApplicationMailer

def send_mail(order)
@order = order
mail(
  from: "from@example.com",
  to: "******@gmail.com",
  subject: "mailerテスト"
)
end
end

order_controller.rb

注文確定時のcompleteアクション

def complete
  @order=Order.new(
    name1: session[:name1],
    name2: session[:name2],
    tel1: session[:tel1],
    tel2: session[:tel2],
    tel3: session[:tel3],
    email: session[:email],
    zipcode: session[:zipcode],
    pref: session[:pref],
    addr1: session[:addr1],
    addr2: session[:addr2],
    delivery_date: session[:delivery_date],
    pay_type: session[:pay_type],
  )

  if order.save
    OrderMailer.send_mail(order).deliver_now
    flash[:notice]="ご注文ありがとうございました"
    render("home/top")
  end
end

config\environment\development.rb

  • 正直このファイルの意味はよくわかっていないです…
Rails.application.configure do
  # Settings specified here will take precedence over those in config/application.rb.

  # In the development environment your application's code is reloaded on
  # every request. This slows down response time but is perfect for development
  # since you don't have to restart the web server when you make code changes.
  config.cache_classes = true

  # Do not eager load code on boot.
  config.eager_load = false

  # Show full error reports and disable caching.
  config.consider_all_requests_local       = true
  config.action_controller.perform_caching = true

  # Don't care if the mailer can't send.
  config.action_mailer.raise_delivery_errors = true

  # Print deprecation notices to the Rails logger.
  config.active_support.deprecation = :log

  # Raise an error on page load if there are pending migrations.
  config.active_record.migration_error = :page_load

  # Debug mode disables concatenation and preprocessing of assets.
  # This option may cause significant delays in view rendering with a large
  # number of complex assets.
  config.assets.debug = true

  # Asset digests allow you to set far-future HTTP expiration dates on all assets,
  # yet still be able to expire them through the digest params.
  config.assets.digest = true

  # Adds additional error checking when serving assets at runtime.
  # Checks for improperly declared sprockets dependencies.
  # Raises helpful error messages.
  config.assets.raise_runtime_errors = true

  # Raises error for missing translations
  # config.action_view.raise_on_missing_translations = true
  config.action_mailer.perform_deliveries = true
  config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }
  config.action_mailer.default_options = {from: 'from@example.com'}
  config.action_mailer.delivery_method = :smtp
  config.action_mailer.smtp_settings = {
   address:              'smtp.gmail.com',
   port:                  587,
   domain:               'gmail.com',
   user_name:            '******@gmail.com',
   password:             '******',
   authentication:       'plain',
   enable_starttls_auto:  true,
  }


end

application_mailer.rb

class ApplicationMailer < ActionMailer::Base
  default from: "from@example.com"
  layout 'mailer'
end

 試したこと

mailerのプレビュー機能(localhost:3000/rails/mailers/order_mailer)では問題ありませんでした。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • troch

    2018/11/02 23:15

    メーラーをインストールする前は特に問題なく動いていた、とありますが、以前は上記のコードでうまくメールを送れていたのに急に送れなくなった、ということでしょうか?

    キャンセル

  • syclimb

    2018/11/05 11:09 編集

    以前送れていたわけではありません(誤解を与える記載ですみません)。
    開発をしている中で、新しくRailsのメーラーを生成してからエラーがでるようになったということです。メーラー以外の部分のエラーではないと考えており、その旨をお伝えする意図で記載しました。

    キャンセル

回答 1

checkベストアンサー

+1

タイムアウトが発生している、ということは、メーラーの問題ではなくネットワークの問題だと思います。
開発環境ではIPv6を使っていますでしょうか?
IPv6通信を無効化してみてはどうでしょうか。
https://www.pebblewind.com/entry/2016/10/01/182251

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/11/05 18:45

    開発環境はIPv6を使っています。
    ご教授いただいたサイトを参考に試そうと思ったのですが、会社のPCの通信をIPv6からIPv4優位に変更するためには管理者権限が必要のため、すぐにはできなさそうです(できれば別の方法を探したいです)。いずれにせよ、ご回答いただきありがとうございます。もう少し頑張ってみます。

    キャンセル

  • 2018/11/05 21:49

    社用PCでしたか…
    その場合、確かにPCの設定いじるよりは別の方法を検討した方がいいかもしれまません。

    https://support.google.com/a/answer/176600?hl=ja
    Googleの公式サイトを少し調べたのですが、
    今回syclimbさんはGoogleのsmtpサーバを使用していますので、
    Google側の設定で問題回避できるかもしれません。
    Googleの設定で「安全性の低いアプリの許可: 有効」にしてみてはどうでしょうか。

    あとは…SSL(TLS)通信が必須と書いてますので、
    SSL対応にする必要もあるかもしれません。
    https://tokyo-engineer.com/ruby-on-rails-ssl/
    ↑のgemでSSL対応が出来るようです。

    頑張ってください!

    キャンセル

  • 2018/11/08 13:31

    おかげさまで解決することができました!
    原因は以下2つでした。
    1.社内ネットワークを用いていたこと
    2.development.rbにおけるメーラー設定のパスワードが間違っていたこと

    1.社内ネットワークを用いていたことがタイムアウトの原因でした。別のネットワーク(個人用 Wi-Fiなど)を用いることで解決しました。
    2.メーラーの設定パスワードはGoogle App Passwordから取得したものにする必要がありました。

    とても助かりました、ありがとうございました!

    キャンセル

  • 2018/11/08 14:15

    なるほど、LAN環境だったのですね。
    ともかく解決してよかったです!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.12%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる