2012-11-16 45 views
6

我使用Pony郵件發送電子郵件(因爲我無法讓ActionMailer在我的本地Windows機器上工作)。主機名稱與服務器證書不匹配 - 無法發送電子郵件

我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'",... 

任何指導,將不勝感激!

+0

我有提問的天賦,沒有人關心回答。 :) – vbsql7

回答

17

有點遲了,但我也遇到了這個錯誤,但與Ruby郵件寶石。如果您的SMTP服務器支持TLS,它將嘗試使用TLS並驗證SSL證書。如果證書是針對所使用主機名以外的主機名頒發的,或者如果證書無法通過身份驗證(例如,如果它是自簽名的並且您不信任CA),那麼它將失敗,並顯示錯誤「主機名不匹配服務器證書「。

要避開它,請使用: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 
    } 
}) 

這也適用於郵件寶石爲好。

+1

工程就像一個魅力,任何安全問題? –

+1

是!有安全問題!這允許互聯網上任何位於您和您的服務器之間的人竊取您的連接並讀取您的數據。您絕對不應該在安全的應用程序中執行此操作 - 您應該只使用頒發有效證書的服務器。 – Brad

+1

是的,這是真的。如果您需要驗證您正在與之通信的服務器的身份以防止中間人受到攻擊,那麼您不應該關閉主機驗證。如果您正在處理髮布「有效」證書但由於某種原因與主機名不匹配的第三方,則可能會出現這種情況。顯然不是最佳實踐。 –

相關問題