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=>"jilin.wlan@gmail.com"}
>>
?
?
?
# 设置邮件内容的默认编码集
ActionMailer::Base.default_charset = "UTF-8"
# 定义ActionMailer::Base的子类
class SimpleMailer < ActionMailer::Base
? # 定义一个自定义方法
? def simple_message()
??? # 设置发件人地址
??? from 'caoruijian@stos.com'
??? # 设置收件人地址
??? recipients 'caoruijian@stos.com'
??? # 设置邮件标题
??? subject 'Hello rails email'
??? # 设置邮件内容
??? body "This is content! Send time at #{Time.now}, 看到的这是中文"
? end
end
# 创建邮件,并发送
SimpleMailer.deliver_simple_message()
?
?