使用restful authentication 插件实现邮件激活功能

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包,直接发送邮件。

 

你可能感兴趣的:(html,.net,Web,Ruby,UP)