1.安装;
2.创建模型,这里有比较多的选项,下面的例子是创建带有激活功能的模型;
ruby script/generate authenticated user sessions --include-activation
a.创建了三个模型,user.rb,user_mailer.rb,user_observer.rb
user.rb定义了用户模型。
user_mailer定义了邮件模型;
user_observer定义了观察模型;
b.创建了两个控制器:sessions_controller.rb;users_controller.rb;session控件用于登录;user控件用户注册等功能。
c.创建了几个视图文件:
sessions/new.html.erb
users/new.html.erb
user_mailer/activation.html.erb
user_mailer/signup_notification.html.erb
然后rake
3.修改route.rb,让显示变得更加人性化
#
map.activate '/activate/:activation_code', :controller => 'users', :action => 'activate'
map.signup '/signup', :controller => 'users', :action => 'new'
map.login '/login', :controller => 'sessions', :action => 'new'
map.logout '/logout', :controller => 'sessions', :action => 'destroy'
4.在initialize目录下创建一个文件,进行在系统的初始化过程中,加载
ActionMailer::Base.delivery_method = :smtp
ActionMailer::Base.smtp_settings = {
:address => "mail.sina.com",
:port => 25,
:domain => "mail.sina.com",
:authentication => :login,
:user_name => "[email protected]",
:password => "helloc"
}
mail.sina.com是smtp服务器,须准确配置这个服务器。
这里稍作解释
ActionMailer是基于Net::snmp封装,
delivery_method采用smtp
smtp_settings,就是smtp传递邮件使用的各类参数,包括smtp服务器的地址,域名,端口,采用什么验证方式(这里有三种plain,login,md5),用户名,密码
至此,用户注册的时候已经可以顺利发送邮件了。
邮件内容如下:
[YOURSITE] Please activate your new account 日期: 2010-03-17 23:46
Your account has been created.
Username: test
Password: 111111
Visit this url to activate your account:
http://YOURSITE/activate/228f5fe94f24134fbbf3234bad236404c71f2509
5.写清楚自己的网站。
在config/envirments/production.rb或者development.rb增加如下:
SITE_URL = "wooxo.cc"
注意:修改了这个文件,需要重新启动web服务;
包括前面在initialize目录新增了一个文件,也是需要重启服务,才可以生效。
6.当然需要在models/user_mailer.rb
7.修改邮件的内容。
views/users/user_mailer/sign_up_notification.erb.html
原文:
Your account has been created.
Username: <%= @user.login %>
Password: <%= @user.password %>
Visit this url to activate your account:
<%= @url %>
同样需要重启服务,才能生效。
8.差点遗漏一个要点。配置enviroment.rb
config.active_record.observers = :user_observer
目的让 user_observer和user集合关联。
def after_create(user)
UserMailer.deliver_signup_notification(user)
end
def after_save(user)
UserMailer.deliver_activation(user) if user.recently_activated?
end
可以看到,这个user_observer模型,为了盯住user这个模型,一旦user这个模型在创建或者保存的时候,就调用usermailer这个模型。
这样User/UserMailer/UserObserver三个模型就紧密的结合在一起。
这里稍微做一个解释,原来有文档说net::smtp只发送本地smtp服务器的说法不准确。
附说明:
实际上actionmail是在net::smtp之上的一个封装,当然封装的内容不止这些。但是从发信这个功能,就是基于这个包。下面介绍一个使用纯ruby代码通过smtp发送邮件的案例:
require "net/smtp"
# params :
# ARGV[0] = subject
# ARGV[1] = content
# ARGV[2] = filename
# ARGV[3] = to
def sendemail(subject,content,to=nil)
from = "[email protected]"#自己的邮箱
to = ["[email protected]"] if to.nil?#发送对象邮箱
sendmessage = "Subject: "+subject +"\n\n"+content#拼装一份邮件体。
smtp = Net::SMTP.start("mail.xj.net",25,"xj.net",'test','test123',:login) #准确的使用smtp服务器的域名,以及smtp验证信息。
smtp.send_message sendmessage,from,to #这才是干货,做开始进行发送
smtp.finish #发送完毕之后,关闭连接。
end
def sendemail_file(subject,filename,to)
content = ""
File.open(filename) do |file|
file.each_line {|line| content += "#{line}\n" }
end
sendemail(subject,content,to)
end
subject = ARGV[0] || "system autoly send"
content = ARGV[1] || ""
filename = ARGV[2] || ""
to = ARGV[3]
if content.to_s == "" and filename.to_s!=""
sendemail_file(subject,filename,to)
else
content = "Nothing" if content.to_s == ""
sendemail(subject,content,to)
end
保存为sendmail.rb
在ruby环境下,执行:
ruby sendmail.rb this is a test mail
这样会在[email protected]收到一份主题为"this is a test mail"的邮件。
再附:net::smtp.start的参数,有三种方式;
# PLAIN
Net::SMTP.start('your.smtp.server', 25, 'mail.from.domain',
'Your Account', 'Your Password', :plain)
# LOGIN
Net::SMTP.start('your.smtp.server', 25, 'mail.from.domain',
'Your Account', 'Your Password', :login)
# CRAM MD5
Net::SMTP.start('your.smtp.server', 25, 'mail.from.domain',
'Your Account', 'Your Password', :cram_md5)
在编写控制器的时候,完全可以使用smtp包,直接发送邮件。