我们公司的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()