actionmailer發送郵件失敗的問題解決記錄

我們公司的WLAN網管採用ruby on rails架構,同時通過actionmailer自動發送郵件。

近來吉林電信遇到了點問題,導致郵件發送不出去,總結的話主要是兩個問題。

第一個問題是:郵件內容編碼的問題。

通過activerecord查詢上來的的內容不是UTF-8編碼的,需要把他進行轉換,這個在其他現場沒有發現,吉林是32的服務器,然後環境是另外一個同事裝的,應該跟環境也有一定的問題。

 

解決方案:通過

def scanadd( str, force = false )
      types = ''
      strs = []
      if str.respond_to?(:encoding)
        enc = str.encoding
        str.force_encoding("UTF-8")
      end

 

force_encoding的方法把字符集進行替換。

 

第二個問題是: gmail不發郵件的問題

gmail的smtp服務器是要https的,所以要通過require "smtp_tls"來的,研發把這個東西給禁用掉了,導致郵件發送不了。

 

解決方案:  gem install -l  action_mailer_tls-1.1.3.gem --no-ri --no-rdoc

然後在 app/model/user_mailer.rb中

 

require 'smtp_tls'

module ActionMailer
  module Quoting #:nodoc:
    def quote_if_necessary(text, charset)
      text = text.dup.force_encoding("UTF-8") if text.respond_to?(:force_encoding)
      (text =~ CHARS_NEEDING_QUOTING) ?
        quoted_printable(text, charset) :
        text
    end
  end
end

module TMail
  class Encoder
    def scanadd( str, force = false )
      types = ''
      strs = []
      if str.respond_to?(:encoding)
        enc = str.encoding
        str.force_encoding("UTF-8")
      end
      until str.empty?
        if m = /\A[^\e\t\r\n ]+/.match(str)
          types << (force ? 'j' : 'a')
          if str.respond_to?(:encoding)
            strs.push m[0].force_encoding(enc)
          else
            strs.push m

……

 

故障解決。

 

 

測試參考:

在Rails console中可以使用ActionMailer::Base.smtp_settings查看當前環境的smtp設置。:

# ruby script/console
Loading development environment (Rails 2.3.5)
=>
?> ActionMailer::Base.smtp_settings
=> {:password=>"**********", :address=>"smtp.gmail.com", :port=>587, :authentication=>:plain, :user_name=>"[email protected]"}
>>

 

 

 

# 設置郵件內容的默認編碼集
ActionMailer::Base.default_charset = "UTF-8"
# 定義ActionMailer::Base的子類
class SimpleMailer < ActionMailer::Base
  # 定義一個自定義方法
  def simple_message()
    # 設置發件人地址
    from '[email protected]'
    # 設置收件人地址
    recipients '[email protected]'
    # 設置郵件標題
    subject 'Hello rails email'
    # 設置郵件內容
    body "This is content! Send time at #{Time.now}, 看到的這是中文"
  end
end
# 創建郵件,併發送
SimpleMailer.deliver_simple_message()

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章