1. ホーム
  2. ruby-on-rails

[解決済み] ホスト名がサーバー証明書と一致しない - メールを送信できない

2022-02-25 04:19:02

質問

私は電子メールメッセージを送信するためにポニーメールを使用しています(ローカルのWindowsボックスでActionMailerを動作させることができなかったため)。

user_mailer.rbファイルのコードには、Pony.mailメソッドへのこの呼び出しが含まれています。

Pony.mail({
  :to => email_address, 
  :from => 'MyChairSales <[email protected]>', 
  :subject => subject, 
  :body => email_body, 
  :html_body => html_body,
  :via => :smtp,
  :via_options => {
    :address              => 'mail.mychairsales.com',
    :port                 => '25',
    :enable_starttls_auto => true,
    :user_name            => 'mychairs',
    :password             => 'thepassword',
    :domain               => "mychairsales.com" # the HELO domain provided by the client to the server
  } 
 })

これはうまくいっていたのですが(この方法でメールを受信しました)、現在はエラー "ホスト名がサーバー証明書と一致しない"で失敗しています。

以下はスタックトレースのトップです。

["/usr/lib64/ruby/1.9.3/openssl/ssl-internal.rb:121:in `post_connection_check'",
"/usr/lib64/ruby/1.9.3/net/smtp.rb:585:in `tlsconnect'", "/usr/lib64/ruby/1.9.3
/net/smtp.rb:560:in `do_start'", "/usr/lib64/ruby/1.9.3/net/smtp.rb:519:in `start'", 
"/home4/mychairs/ruby/gems/gems/mail-2.4.4/lib/mail/network/delivery_methods
/smtp.rb:144:in `deliver!'", "/home4/mychairs/ruby/gems/gems/mail-2.4.4/lib
/mail/message.rb:245:in `deliver!'", "/home4/mychairs/ruby/gems/gems/pony-1.4/lib
/pony.rb:166:in `deliver'", "/home4/mychairs/ruby/gems/gems/pony-1.4/lib
/pony.rb:138:in `mail'", "/home4/mychairs/rails_apps/chairsales/app/mailers
/user_mailer.rb:32:in `send_mail'", "/home4/mychairs/rails_apps/chairsales/app/mailers
/user_mailer.rb:23:in `send_password_reset_email'",...

何かご指導いただければ幸いです。

どのように解決するのですか?

遅ればせながら、私もこのエラーに遭遇しましたが、Ruby Mail gemを使用した場合です。 SMTPサーバがTLSをサポートしている場合、TLSを使用し、SSL証明書を認証しようとします。 証明書が使用されているホスト名と異なるホスト名で発行された場合、または証明書が認証できない場合(例えば自己署名でCAを信頼していない場合)、エラー "hostname does not match the server certificate" が発生して失敗します。

これを回避するには、 :openssl_verify_mode オプションを使用します。 これを OpenSSL::SSL::VERIFY_NONE に設定すると、証明書の検証を行わず、SMTP セッションを暗号化することができます。 あるいは、OpenSSLライブラリの中に他のオプションがあります。

あなたの例で言えば、次のようになります。

Pony.mail({
  :to => email_address, 
  :from => 'MyChairSales <[email protected]>', 
  :subject => subject, 
  :body => email_body, 
  :html_body => html_body,
  :via => :smtp,
  :via_options => {
    :openssl_verify_mode => OpenSSL::SSL::VERIFY_NONE, 
    :address              => 'mail.mychairsales.com',
    :port                 => '25',
    :enable_starttls_auto => true,
    :user_name            => 'mychairs',
    :password             => 'thepassword',
    :domain               => "mychairsales.com" # the HELO domain provided by the client to the server
  } 
 })

これは、Mail gemでも同様に動作します。