使用ActionMail发送邮件
原文载于:http://railscasts.com/episodes/206-action-mailer-in-rails-3?view=asciicast
当然迩可以查看它的中文版本
首先要安装mailit
这个插件、gem install mailit、如果在线安装慢就直接下载离线包安装、具体可以看本站的离线安装gem的文章、
首先新建一个rails项目、当然迩可以在自己的原有rails项目里弄、但这里仅为测试一下新建一个项目
rails new testmail
然后再生成一个框架
rails g scaffold user name:string email:string
然后生成数据库
rake db:migrate
ok、现在迩可以启动服务器了、rails s、这时迩可以通过localhost:3000/user来访问刚刚使用rails生成的user页面
现在正式开始配置一个发送邮箱
打开/config/initializers/目录、在里面新建一个setup_mail.rb 文件、写入配置文件
1 ActionMailer::Base.smtp_settings = {
2 :address => "smtp.gmail.com",
3 :port => 587,
4 :domain => "asciicasts.com",
5 :user_name => "asciicasts",
6 :password => "secret",
7 :authentication => "plain",
8 :enable_starttls_auto => true
9 }
这里的domain随便写吧、user_name和password当然是填写迩自己的帐户和密码啦、别傻傻的跟着写asciicasts、port和address就是smtp端口号和
邮件服务器、这个具体迩要到迩邮箱提供商那里查、莪这里是用gmail、查到的smtp端口和服务器就是587和smtp.gmail.com、其余的照着写就是了
当然、迩也可以在config/environments/development.rb或config/environments/production.rb这里写上以上代码、具体dev还是pro取决于迩的发布环境是什么
然后再去生成一个mailer吧、
rails g mailer user_mailer
生成了一个名为user_mailer的文件、这个文件位于/app/mailers、打开它
1 class UserMailer < ActionMailer::Base
2 default :from => "from@example.com"
3 end
莪们将它改成这样
1 class UserMailer < ActionMailer::Base
2 default :from => "eifion@asciicasts.com"
3
4 def registration_confirmation(user)
5 mail(:to => user.email, :subject => "Registered")
6 end
7 end
这里莪们自定义了一个registration_confirmation的方法、接收一个user的参数、这个参数就是由control那里传来的、其实这个方法到时也是由control那时里调用的、:to接收来自user.email的参数、也就是到时会自动调用用户填写的email、 :to就是发送方的邮箱、:subject就是主题、:from就是寄信方、这里把它扔在方法外面使用default参数、目的就是因为寄信方是固定的、这样省事些、莪们也可以这么写
1 class UserMailer < ActionMailer::Base
2 def registration_confirmation(user)
3 mail(:to => user.email, :subject => "Registered", :from =>"eifion@asciicasts.com")
4 end
5 end
只不过不常用罢了、这里的:from填什么貌似影响不大、只要之前配置邮箱的时候写对了就可以了
好了、方法写好了接着设置邮件的正文内容了、这里为了简化、莪们正文使用txt格式、当然迩可以使用html格式、这样文字就更丰富了、下面介绍下txt格式
打开这个目录/app/views/user_mailer
、在里面新建一个文件夹、取名叫registration_confirmation.text.erb
、哈哈、这个就是方法名加上txt的格式加上erb模版名、好理解吧、然后打开里面、随便写些啥、谢谢迩的注册啦、、之类的这些内容、然后保存
好了、方法写好了、正文内容也写好了、配置也写好了、这回写如何调用、触发事件就在用户一注册新用户莪们就发、那么这个事件狠明显就是/app/controllers里的create方法嘛、具体当然是users的controller啦、于是打开users_controller.rb、在create方法那里加入一行
UserMailer.registration_confirmation(@user).deliver
完整点显示出来吧
1 def create
2 @user = User.new(params[:user])
3
4 respond_to do |format|
5 if @user.save
6 UserMailer.registration_confirmation(@user).deliver
7 format.html { redirect_to(@user, :notice => 'User was successfully created.') }
8 format.xml { render :xml => @user, :status => :created, :location => @user }
9 else
10 format.html { render :action => "new" }
11 format.xml { render :xml => @user.errors, :status => :unprocessable_entity }
12 end
13 end
14 end
就是添加了第6行那句、如果用户一但保存成功、那么就发送邮件、调用的正是UserMailer类的registration_confirmation方法、调用的deliver正是继承于
ActionMail的方法、里面传入的@user参数当然就是用户创建时的参数啦、哈哈
这里就大功靠成啦、打开网页localhost:3000/users页面、新建用户写上相应的邮箱名称、点击创建就会自动发邮件啦、哈哈
然后莪们做些更高层次的冬冬吧
既然使用了莪们的用户名注册、那么就应该是显示莪们的名称、也就是信件中的名称是可变动的、也就是说内容可以插入变量、
由于mailers就像controllers一样, 任何实例变量(instance variables)都可以在view里面访问。所以当然莪们可以在mailers那里定义好实例变量然后再在view中调用、所以首先莪们在mailers/user_mailer.rb文件中加上变量、
1 def registration_confirmation(user)
2 @user = user
3 mail(:to => user.email, :subject => "Registered")
4 end
第2行那里、然后就可以在这里/app/views/user_mailer/registration_confirmation.text.erb 、添加变量了
1 <%= @user.name %>,
2
3 Thank you for registering!
再注册一次邮件看看、是不是已经产生变量了、哈哈
然后莪们也可以添加相关链接上去、方法也非常的简单、打开/app/views/user_mailer/registration_confirmation.text.erb
1 <p><%= @user.name %>,</p>
2
3 <p>Thank you for registering!</p>
4
5 <p><%= link_to "Edit Profile", edit_user_url(@user, :host => "localhost:3000") %></p>
在里面加上第5行的内容就OK了、
然后莪们也可以添加附件上去、方法也非常的简单、打开/app/views/user_mailer/registration_confirmation.text.erb
1 def registration_confirmation(user)
2 @user = user
3 attachments["rails.png"] = File.read("#{Rails.root}/public/images/rails.png")
4 mail(:to => "#{user.name} <#{user.email}>", :subject => "Registered")
5 end
添加第3行的代码进去就可以了、其中的Rails.root也狠好理解、就是定位在rails根目录那里、非常简单吧、哈哈