From d0d6b29606f209468d67199469ab96009fdd99df Mon Sep 17 00:00:00 2001 From: Samuel Cochran Date: Fri, 10 Jun 2011 11:24:08 +0800 Subject: [PATCH] Rawr! (Basic Growl support.) --- README.md | 4 +-- lib/mail_catcher.rb | 73 +++++++++++++++++++++++++++++++-------- lib/mail_catcher/growl.rb | 16 +++++++++ 3 files changed, 76 insertions(+), 17 deletions(-) create mode 100644 lib/mail_catcher/growl.rb diff --git a/README.md b/README.md index 7a87440..54411de 100644 --- a/README.md +++ b/README.md @@ -66,9 +66,9 @@ A fairly RESTful URL schema means you can download a list of messages in JSON fr ## TODO -* Growl support. -* Test suite. * Add mail delivery on request, optionally multiple times. +* Better Growl support in MacRuby and RubyCocoa with click notifications which takes you to the received message. +* Test suite. * Forward mail to rendering service, maybe CampaignMonitor? * Package as an app? Native interfaces? HotCocoa? diff --git a/lib/mail_catcher.rb b/lib/mail_catcher.rb index 82a4f51..7291e3e 100644 --- a/lib/mail_catcher.rb +++ b/lib/mail_catcher.rb @@ -4,52 +4,91 @@ require 'optparse' require 'rbconfig' require 'thin' -def windows? - Config::CONFIG['host_os'] =~ /mswin|mingw/ -end - module MailCatcher extend ActiveSupport::Autoload autoload :Events + autoload :Growl autoload :Mail autoload :Smtp autoload :Web +module_function + + def mac? + Config::CONFIG['host_os'] =~ /darwin/ + end + + def windows? + Config::CONFIG['host_os'] =~ /mswin|mingw/ + end + + def macruby? + mac? and const_defined? :MACRUBY_VERSION + end + + def growlnotify? + system "which", "-s", "growlnotify" + end + + def growlframework? + macruby? and + # TODO: Look for growl framework accessible + false + end + + def growl? + growlnotify? or growlframework? + end + @@defaults = { :smtp_ip => '127.0.0.1', :smtp_port => '1025', :http_ip => '127.0.0.1', :http_port => '1080', :verbose => false, - :daemon => (true unless windows?), + :daemon => !windows?, + :growl => growlnotify?, } - def self.parse! arguments=ARGV, defaults=@@defaults + def parse! arguments=ARGV, defaults=@@defaults @@defaults.dup.tap do |options| OptionParser.new do |parser| - parser.banner = 'Usage: mailcatcher [options]' + parser.banner = "Usage: mailcatcher [options]" - parser.on('--ip IP', 'Set the ip address of both servers') do |ip| + parser.on("--ip IP", "Set the ip address of both servers") do |ip| options[:smtp_ip] = options[:http_ip] = ip end - parser.on('--smtp-ip IP', 'Set the ip address of the smtp server') do |ip| + parser.on("--smtp-ip IP", "Set the ip address of the smtp server") do |ip| options[:smtp_ip] = ip end - parser.on('--smtp-port PORT', Integer, 'Set the port of the smtp server') do |port| + parser.on("--smtp-port PORT", Integer, "Set the port of the smtp server") do |port| options[:smtp_port] = port end - parser.on('--http-ip IP', 'Set the ip address of the http server') do |ip| + parser.on("--http-ip IP", "Set the ip address of the http server") do |ip| options[:http_ip] = ip end - parser.on('--http-port PORT', Integer, 'Set the port address of the http server') do |port| + parser.on("--http-port PORT", Integer, "Set the port address of the http server") do |port| options[:http_port] = port end + if mac? + parser.on("--[no-]growl", "Growl to the local machine when a message arrives") do |growl| + if growl and not growlnotify? + puts "You'll need to install growlnotify from the Growl installer." + puts + puts "See: http://growl.info/extras.php#growlnotify" + exit! + end + + options[:growl] = growl + end + end + unless windows? parser.on('-f', '--foreground', 'Run in the foreground') do options[:daemon] = false @@ -68,7 +107,7 @@ module MailCatcher end end - def self.run! options=nil + def run! options=nil # If we are passed options, fill in the blanks options &&= @@defaults.merge options # Otherwise, parse them from ARGV @@ -80,6 +119,9 @@ module MailCatcher # One EventMachine loop... EventMachine.run do + # Get our lion on if asked + MailCatcher::Growl.start if options[:growl] + # TODO: DRY this up # Set up an SMTP server to run within EventMachine @@ -105,13 +147,14 @@ module MailCatcher end end - def self.quit! + def quit! EventMachine.next_tick { EventMachine.stop_event_loop } end protected +module_function - def self.rescue_port port + def rescue_port port begin yield diff --git a/lib/mail_catcher/growl.rb b/lib/mail_catcher/growl.rb new file mode 100644 index 0000000..80ec5a8 --- /dev/null +++ b/lib/mail_catcher/growl.rb @@ -0,0 +1,16 @@ +module MailCatcher + module Growl + module_function + def start + MailCatcher::Events::MessageAdded.subscribe MailCatcher::Growl.method :notify + end + + def notify message + system "growlnotify", "--name", "MailCatcher", "--message", "Message received:\n#{message["subject"]}" + end + + # TODO: Native support on MacRuby with click backs + #def click + #end + end +end