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()

 

 

你可能感兴趣的:(Rails,Gmail,Ruby,电信,ActiveRecord)