This is the 6th of 8 presentations given at University of Texas during my Beginner to Builder Rails 3 Class. For more info and the whole series including video presentations at my blog:
http://schneems.com/tagged/Rails-3-beginner-to-builder-2011
3. Email in Rails
• What is Email?
• Why Use Email?
• How does Rails use email?
@Schneems
Wednesday, July 20, 2011
4. What is Email
• Communications medium defined by RFC standards
✦ RFC = Request for Comments
✦ Comprised of Header & Body
✦
Header (to, from, reply-to, content-type, subject, cc, etc.)
✦
Body (message and attachments)
@Schneems
Wednesday, July 20, 2011
5. Email- Content Types
• Defines How the Mail User Agent (MUA) Interprets Body
✦ Text/HTML
✦ Text/Plain
✦ Multipart/Related (Example: Inline Pictures)
✦ Multipart/Alternative
✦
Send Text/HTML with Text/Plain as backup
✦
Add Attachments
@Schneems
Wednesday, July 20, 2011
6. Why use Email with
Rails?
• Status Updates ( Twitter, Facebook, Etc. )
• Direct to Consumer Marketing source
• Added functionality (lost passwords, etc.)
• Send documents
• Everyone has it, and
• Everyone can use it
@Schneems
Wednesday, July 20, 2011
7. How Does RoR Send
Email? Mail Server
• Low Volume
Operating System
Your
Computer MTA
• use Gmail Postfix
SMTP
• High Volume
(Sends d
Emails)
Their
Computer Courier
• use a re-mailer IMAP/POP
• Build your own
@Schneems
Wednesday, July 20, 2011
8. How Does RoR Send
• ActionMailer
• Mail Gem
rails generate mailer Notifier
/app/mailers/notifier.rb
@Schneems
Wednesday, July 20, 2011
9. Email With Rails
Notifier.signup_notification(“foo@example.com”).deliver
@Schneems
Wednesday, July 20, 2011
13. Email With Rails
✦ Using Gmail
config/environments/development.rb
✦ Use Port 587
✦ Gmail will throttle large
number of email requests
✦ Close to real life conditions
✦ Relatively Easy
✦ Don’t use with automated
testing
Notifier.signup_notification(“foo@example.com”).deliver
@Schneems
Wednesday, July 20, 2011
14. Email re-cap
✦ Receiving Email much harder
✦ Also less common
✦ Test your Mailer using an Interceptor
✦ use a re-mailer in production
✦ real life application: http://whyspam.me
✦ No longer running
@Schneems
Wednesday, July 20, 2011
15. Background Tasks
• What is a background task?
• Why use one?
• Where do i put my task in rails?
• How do i keep my task alive?
@Schneems
Wednesday, July 20, 2011
16. Background Task
• What is a background task?
• Any server process not initiated by http
request
• Commonly run for long periods of time
• Do not block or stop your application
• Clean up server, or application
• Generate reports
• Much more
@Schneems
Wednesday, July 20, 2011
17. Background Task
• rake tasks
• organize code in “lib/tasks”
• run with:
rake <command> RAILS_ENV=<environment>
@Schneems
Wednesday, July 20, 2011
18. Background Task
• Example
• cleanup.rake
namespace :cleanup do
desc "clean out Tickets over 30 days old"
task :old_tickets => :environment do
tickets = Ticket.find(:all, :conditions => ["created_at < ?",
30.days.ago ], :limit => 5000)
tickets.each do |ticket|
ticket.delete
end
end
end
rake cleanup:old_tickets
@Schneems
Wednesday, July 20, 2011
19. Background Task
• What if i don’t want to execute from
command line?
• run task with a automation program
• Cron
• Monit
• God
@Schneems
Wednesday, July 20, 2011
20. Cron
• Very reliable unix time scheduler
• Built into the OS
• Executes command line calls
• Smallest interval is 1 minute
• Requires full paths
@Schneems
Wednesday, July 20, 2011
21. Monit
• Not installed on OS by default
• Monitors and Executes (cron only executes)
• Extra functionality - Sysadmin emails etc...
@Schneems
Wednesday, July 20, 2011
22. God
• Written in ruby
• Very configurable
• can be memory
intensive in some
applications
sudo gem install god
@Schneems
Wednesday, July 20, 2011
23. Background
• More Options
• Workling/Starling
• Backgroundrb
• ResQue
@Schneems
Wednesday, July 20, 2011
24. Modules (ruby)
• Add “Mixins” to your code
• Keep code seperate with different namespaces
• put them in your rails project under /lib
@Schneems
Wednesday, July 20, 2011
25. Modules (ruby)
• Example Mixin:
• include adds instance methods
module AntiCheating
class Dog
def drug_test
include AntiCheating
...
end
end
end
puppy = Dog.new
puppy.drug_test
>> Passed
@Schneems
Wednesday, July 20, 2011
26. Modules (ruby)
• Example Mixin 2:
module AntiCheating
class Dog
def self.cleanup(level)
include AntiCheating
...
end
end
end
dirtyDog = Dog.new
dirtyDog.cleanup
>> No Method Error
@Schneems
Wednesday, July 20, 2011
27. Modules (ruby)
• Example Mixin 2:
module AntiCheating
def self.cleanup(level)
...
end
end
AntiCheating.cleanup
>> Very Clean
@Schneems
Wednesday, July 20, 2011
28. Modules (ruby)
• Example Mixin 2:
• extend adds all module methods
class Dog module AntiCheating
extend AntiCheating def self.cleanup(level)
end ...
end
end
dirtyDog = Dog.new
dirtyDog.cleanup(2)
>> “Kinda Clean”
@Schneems
Wednesday, July 20, 2011
29. Modules (ruby)
• Extra Credit:
• class << self
class Dog
class Dog
class << self
def self.sniff
def sniff
... == ...
end
end
end
end
end
@Schneems
Wednesday, July 20, 2011
30. Modules (ruby)
• Extra Credit:
• class << self
class Dog
module AntiCheating
class << self
def self.cleanup(level)
include AntiCheating
...
end
end
end
end
dirtyDog = Dog.new
dirtyDog.cleanup(10)
>> “Really Clean”
@Schneems
Wednesday, July 20, 2011
31. Modules (ruby)
• Example Namespace
module FastDogs module SlowDogs
class Dog class Dog
... ...
end end
end end
lassie = FastDogs::Dog.new droopy = SlowDogs::Dog.new
@Schneems
Wednesday, July 20, 2011
32. Callbacks and Observers
• Callbacks
• Non-polling event based method
• hooks into lifecycle of Active Record object
• Observers
• Implement trigger behavior for class outside
of the original class
@Schneems
Wednesday, July 20, 2011
33. Callbacks
• Polling
• “Are We there Yet”
• Callback
• “I’ll tell you when we’re there”
@Schneems
Wednesday, July 20, 2011
35. Callbacks in Rails
• Example
• before_destroy
class Topic < ActiveRecord::Base
before_destroy :delete_parents
def delete_parents
self.class.delete_all "parent_id = #{id}"
end
end
end
@Schneems
Wednesday, July 20, 2011
36. Observers
• Add callback functionality without polluting the
model
• Will run after every new user instance is created
• Keeps your code clean(er)
@Schneems
Wednesday, July 20, 2011