actionmailer-3.2.16/0000755000175000017500000000000012247655405013610 5ustar ondrejondrejactionmailer-3.2.16/CHANGELOG.md0000644000175000017500000000324212247655405015422 0ustar ondrejondrej## Rails 3.2.15 (Oct 16, 2013) ## * No changes. ## Rails 3.2.14 (Jul 22, 2013) ## * No changes. ## Rails 3.2.13 (Mar 18, 2013) ## * No changes. ## Rails 3.2.12 (Feb 11, 2013) ## * No changes. ## Rails 3.2.11 (Jan 8, 2013) ## * No changes. ## Rails 3.2.10 (Jan 2, 2013) ## * No changes. ## Rails 3.2.9 (Nov 12, 2012) ## * The return value from mailer methods is no longer relevant. This fixes a bug, which was introduced with 3.2.9. Backport #8450 Fix #8448 class ExampleMailer < ActionMailer::Base # in 3.2.9, returning a falsy value from a mailer action, prevented the email from beeing sent. # With 3.2.10 the return value is no longer relevant. If you call mail() the email will be sent. def nil_returning_mailer_action mail() nil end end *Yves Senn* ## Rails 3.2.9 (Nov 12, 2012) ## * Do not render views when mail() isn't called. Fix #7761 *Yves Senn* ## Rails 3.2.8 (Aug 9, 2012) ## * No changes. ## Rails 3.2.7 (Jul 26, 2012) ## * No changes. ## Rails 3.2.6 (Jun 12, 2012) ## * No changes. ## Rails 3.2.5 (Jun 1, 2012) ## * No changes. ## Rails 3.2.4 (May 31, 2012) ## * No changes. ## Rails 3.2.3 (March 30, 2012) ## * Upgrade mail version to 2.4.3 *ML* ## Rails 3.2.2 (March 1, 2012) ## * No changes. ## Rails 3.2.1 (January 26, 2012) ## * No changes. ## Rails 3.2.0 (January 20, 2012) ## * Upgrade mail version to 2.4.0 *ML* * Remove Old ActionMailer API *Josh Kalderimis* Please check [3-1-stable](https://github.com/rails/rails/blob/3-1-stable/actionmailer/CHANGELOG.md) for previous changes. actionmailer-3.2.16/README.rdoc0000644000175000017500000001301012247655405015411 0ustar ondrejondrej= Action Mailer -- Easy email delivery and testing Action Mailer is a framework for designing email-service layers. These layers are used to consolidate code for sending out forgotten passwords, welcome wishes on signup, invoices for billing, and any other use case that requires a written notification to either a person or another system. Action Mailer is in essence a wrapper around Action Controller and the Mail gem. It provides a way to make emails using templates in the same way that Action Controller renders views using templates. Additionally, an Action Mailer class can be used to process incoming email, such as allowing a blog to accept new posts from an email (which could even have been sent from a phone). == Sending emails The framework works by initializing any instance variables you want to be available in the email template, followed by a call to +mail+ to deliver the email. This can be as simple as: class Notifier < ActionMailer::Base delivers_from 'system@loudthinking.com' def welcome(recipient) @recipient = recipient mail(:to => recipient, :subject => "[Signed up] Welcome #{recipient}") end end The body of the email is created by using an Action View template (regular ERB) that has the instance variables that are declared in the mailer action. So the corresponding body template for the method above could look like this: Hello there, Mr. <%= @recipient %> Thank you for signing up! And if the recipient was given as "david@loudthinking.com", the email generated would look like this: Date: Mon, 25 Jan 2010 22:48:09 +1100 From: system@loudthinking.com To: david@loudthinking.com Message-ID: <4b5d84f9dd6a5_7380800b81ac29578@void.loudthinking.com.mail> Subject: [Signed up] Welcome david@loudthinking.com Mime-Version: 1.0 Content-Type: text/plain; charset="US-ASCII"; Content-Transfer-Encoding: 7bit Hello there, Mr. david@loudthinking.com Thank you for signing up! In previous version of Rails you would call create_method_name and deliver_method_name. Rails 3.0 has a much simpler interface, you simply call the method and optionally call +deliver+ on the return value. Calling the method returns a Mail Message object: message = Notifier.welcome # => Returns a Mail::Message object message.deliver # => delivers the email Or you can just chain the methods together like: Notifier.welcome.deliver # Creates the email and sends it immediately == Setting defaults It is possible to set default values that will be used in every method in your Action Mailer class. To implement this functionality, you just call the public class method default which you get for free from ActionMailer::Base. This method accepts a Hash as the parameter. You can use any of the headers e-mail messages has, like :from as the key. You can also pass in a string as the key, like "Content-Type", but Action Mailer does this out of the box for you, so you won't need to worry about that. Finally it is also possible to pass in a Proc that will get evaluated when it is needed. Note that every value you set with this method will get over written if you use the same key in your mailer method. Example: class Authenticationmailer < ActionMailer::Base default :from => "awesome@application.com", :subject => Proc.new { "E-mail was generated at #{Time.now}" } ..... end == Receiving emails To receive emails, you need to implement a public instance method called receive that takes an email object as its single parameter. The Action Mailer framework has a corresponding class method, which is also called receive, that accepts a raw, unprocessed email as a string, which it then turns into the email object and calls the receive instance method. Example: class Mailman < ActionMailer::Base def receive(email) page = Page.find_by_address(email.to.first) page.emails.create( :subject => email.subject, :body => email.body ) if email.has_attachments? email.attachments.each do |attachment| page.attachments.create({ :file => attachment, :description => email.subject }) end end end end This Mailman can be the target for Postfix or other MTAs. In Rails, you would use the runner in the trivial case like this: rails runner 'Mailman.receive(STDIN.read)' However, invoking Rails in the runner for each mail to be received is very resource intensive. A single instance of Rails should be run within a daemon, if it is going to be utilized to process more than just a limited number of email. == Configuration The Base class has the full list of configuration options. Here's an example: ActionMailer::Base.smtp_settings = { :address => 'smtp.yourserver.com', # default: localhost :port => '25', # default: 25 :user_name => 'user', :password => 'pass', :authentication => :plain # :plain, :login or :cram_md5 } == Download and installation The latest version of Action Mailer can be installed with RubyGems: % [sudo] gem install actionmailer Source code can be downloaded as part of the Rails project on GitHub * https://github.com/rails/rails/tree/3-2-stable/actionmailer == License Action Mailer is released under the MIT license. == Support API documentation is at * http://api.rubyonrails.org Bug reports and feature requests can be filed with the rest for the Ruby on Rails project here: * https://github.com/rails/rails/issues actionmailer-3.2.16/checksums.yaml.gz0000444000175000017500000000041412247655405017075 0ustar ondrejondrej#Re=V@"otvƗӻԊjnM1E979AS6{I,49/_yPk΅Y "E$[6xZFO+`8îakB4Ѯs2 55Aa/]yUP 0^|GF$<щd\XYB[g$Uܻ Nޅ3C0kc:3M^#)z Xʅr47B[Q&pactionmailer-3.2.16/lib/0000755000175000017500000000000012247655405014356 5ustar ondrejondrejactionmailer-3.2.16/lib/rails/0000755000175000017500000000000012247655405015470 5ustar ondrejondrejactionmailer-3.2.16/lib/rails/generators/0000755000175000017500000000000012247655405017641 5ustar ondrejondrejactionmailer-3.2.16/lib/rails/generators/mailer/0000755000175000017500000000000012247655405021112 5ustar ondrejondrejactionmailer-3.2.16/lib/rails/generators/mailer/templates/0000755000175000017500000000000012247655405023110 5ustar ondrejondrejactionmailer-3.2.16/lib/rails/generators/mailer/templates/mailer.rb0000644000175000017500000000070512247655405024710 0ustar ondrejondrej<% module_namespacing do -%> class <%= class_name %> < ActionMailer::Base default <%= key_value :from, '"from@example.com"' %> <% actions.each do |action| -%> # Subject can be set in your I18n file at config/locales/en.yml # with the following lookup: # # en.<%= file_path.gsub("/",".") %>.<%= action %>.subject # def <%= action %> @greeting = "Hi" mail <%= key_value :to, '"to@example.org"' %> end <% end -%> end <% end -%> actionmailer-3.2.16/lib/rails/generators/mailer/mailer_generator.rb0000644000175000017500000000067012247655405024761 0ustar ondrejondrejmodule Rails module Generators class MailerGenerator < NamedBase source_root File.expand_path("../templates", __FILE__) argument :actions, :type => :array, :default => [], :banner => "method method" check_class_collision def create_mailer_file template "mailer.rb", File.join('app/mailers', class_path, "#{file_name}.rb") end hook_for :template_engine, :test_framework end end end actionmailer-3.2.16/lib/rails/generators/mailer/USAGE0000644000175000017500000000125212247655405021701 0ustar ondrejondrejDescription: ============ Stubs out a new mailer and its views. Pass the mailer name, either CamelCased or under_scored, and an optional list of emails as arguments. This generates a mailer class in app/mailers and invokes your template engine and test framework generators. Example: ======== rails generate mailer Notifications signup forgot_password invoice creates a Notifications mailer class, views, test, and fixtures: Mailer: app/mailers/notifications.rb Views: app/views/notifications/signup.erb [...] Test: test/functional/notifications_test.rb Fixtures: test/fixtures/notifications/signup [...] actionmailer-3.2.16/lib/action_mailer.rb0000644000175000017500000000364012247655405017514 0ustar ondrejondrej#-- # Copyright (c) 2004-2011 David Heinemeier Hansson # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be # included in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #++ actionpack_path = File.expand_path('../../../actionpack/lib', __FILE__) $:.unshift(actionpack_path) if File.directory?(actionpack_path) && !$:.include?(actionpack_path) require 'abstract_controller' require 'action_view' require 'action_mailer/version' # Common Active Support usage in Action Mailer require 'active_support/core_ext/class' require 'active_support/core_ext/object/blank' require 'active_support/core_ext/array/uniq_by' require 'active_support/core_ext/module/attr_internal' require 'active_support/core_ext/module/delegation' require 'active_support/core_ext/string/inflections' require 'active_support/lazy_load_hooks' module ActionMailer extend ::ActiveSupport::Autoload autoload :Collector autoload :Base autoload :DeliveryMethods autoload :MailHelper autoload :TestCase autoload :TestHelper end actionmailer-3.2.16/lib/action_mailer/0000755000175000017500000000000012247655405017164 5ustar ondrejondrejactionmailer-3.2.16/lib/action_mailer/log_subscriber.rb0000644000175000017500000000110212247655405022507 0ustar ondrejondrejrequire 'active_support/core_ext/array/wrap' module ActionMailer class LogSubscriber < ActiveSupport::LogSubscriber def deliver(event) recipients = Array.wrap(event.payload[:to]).join(', ') info("\nSent mail to #{recipients} (#{format_duration(event.duration)})") debug(event.payload[:mail]) end def receive(event) info("\nReceived mail (#{format_duration(event.duration)})") debug(event.payload[:mail]) end def logger ActionMailer::Base.logger end end end ActionMailer::LogSubscriber.attach_to :action_mailer actionmailer-3.2.16/lib/action_mailer/collector.rb0000644000175000017500000000152412247655405021501 0ustar ondrejondrejrequire 'abstract_controller/collector' require 'active_support/core_ext/hash/reverse_merge' require 'active_support/core_ext/array/extract_options' module ActionMailer #:nodoc: class Collector include AbstractController::Collector attr_reader :responses def initialize(context, &block) @context = context @responses = [] @default_render = block end def any(*args, &block) options = args.extract_options! raise "You have to supply at least one format" if args.empty? args.each { |type| send(type, options.dup, &block) } end alias :all :any def custom(mime, options={}) options.reverse_merge!(:content_type => mime.to_s) @context.formats = [mime.to_sym] options[:body] = block_given? ? yield : @default_render.call @responses << options end end end actionmailer-3.2.16/lib/action_mailer/delivery_methods.rb0000644000175000017500000000550512247655405023064 0ustar ondrejondrejrequire 'tmpdir' module ActionMailer # This module handles everything related to mail delivery, from registering new # delivery methods to configuring the mail object to be sent. module DeliveryMethods extend ActiveSupport::Concern included do class_attribute :delivery_methods, :delivery_method # Do not make this inheritable, because we always want it to propagate cattr_accessor :raise_delivery_errors self.raise_delivery_errors = true cattr_accessor :perform_deliveries self.perform_deliveries = true self.delivery_methods = {}.freeze self.delivery_method = :smtp add_delivery_method :smtp, Mail::SMTP, :address => "localhost", :port => 25, :domain => 'localhost.localdomain', :user_name => nil, :password => nil, :authentication => nil, :enable_starttls_auto => true add_delivery_method :file, Mail::FileDelivery, :location => defined?(Rails.root) ? "#{Rails.root}/tmp/mails" : "#{Dir.tmpdir}/mails" add_delivery_method :sendmail, Mail::Sendmail, :location => '/usr/sbin/sendmail', :arguments => '-i -t' add_delivery_method :test, Mail::TestMailer end module ClassMethods # Provides a list of emails that have been delivered by Mail::TestMailer delegate :deliveries, :deliveries=, :to => Mail::TestMailer # Adds a new delivery method through the given class using the given symbol # as alias and the default options supplied: # # Example: # # add_delivery_method :sendmail, Mail::Sendmail, # :location => '/usr/sbin/sendmail', # :arguments => '-i -t' # def add_delivery_method(symbol, klass, default_options={}) class_attribute(:"#{symbol}_settings") unless respond_to?(:"#{symbol}_settings") send(:"#{symbol}_settings=", default_options) self.delivery_methods = delivery_methods.merge(symbol.to_sym => klass).freeze end def wrap_delivery_behavior(mail, method=nil) #:nodoc: method ||= self.delivery_method mail.delivery_handler = self case method when NilClass raise "Delivery method cannot be nil" when Symbol if klass = delivery_methods[method.to_sym] mail.delivery_method(klass, send(:"#{method}_settings")) else raise "Invalid delivery method #{method.inspect}" end else mail.delivery_method(method) end mail.perform_deliveries = perform_deliveries mail.raise_delivery_errors = raise_delivery_errors end end def wrap_delivery_behavior!(*args) #:nodoc: self.class.wrap_delivery_behavior(message, *args) end end end actionmailer-3.2.16/lib/action_mailer/railtie.rb0000644000175000017500000000273012247655405021144 0ustar ondrejondrejrequire "action_mailer" require "rails" require "abstract_controller/railties/routes_helpers" module ActionMailer class Railtie < Rails::Railtie config.action_mailer = ActiveSupport::OrderedOptions.new initializer "action_mailer.logger" do ActiveSupport.on_load(:action_mailer) { self.logger ||= Rails.logger } end initializer "action_mailer.set_configs" do |app| paths = app.config.paths options = app.config.action_mailer options.assets_dir ||= paths["public"].first options.javascripts_dir ||= paths["public/javascripts"].first options.stylesheets_dir ||= paths["public/stylesheets"].first # make sure readers methods get compiled options.asset_path ||= app.config.asset_path options.asset_host ||= app.config.asset_host options.relative_url_root ||= app.config.relative_url_root ActiveSupport.on_load(:action_mailer) do include AbstractController::UrlFor extend ::AbstractController::Railties::RoutesHelpers.with(app.routes) include app.routes.mounted_helpers register_interceptors(options.delete(:interceptors)) register_observers(options.delete(:observers)) options.each { |k,v| send("#{k}=", v) } end end initializer "action_mailer.compile_config_methods" do ActiveSupport.on_load(:action_mailer) do config.compile_methods! if config.respond_to?(:compile_methods!) end end end end actionmailer-3.2.16/lib/action_mailer/test_case.rb0000644000175000017500000000403212247655405021462 0ustar ondrejondrejrequire 'active_support/core_ext/class/attribute' module ActionMailer class NonInferrableMailerError < ::StandardError def initialize(name) super "Unable to determine the mailer to test from #{name}. " + "You'll need to specify it using tests YourMailer in your " + "test case definition" end end class TestCase < ActiveSupport::TestCase module Behavior extend ActiveSupport::Concern include TestHelper included do class_attribute :_mailer_class setup :initialize_test_deliveries setup :set_expected_mail end module ClassMethods def tests(mailer) case mailer when String, Symbol self._mailer_class = mailer.to_s.camelize.constantize when Module self._mailer_class = mailer else raise NonInferrableMailerError.new(mailer) end end def mailer_class if mailer = self._mailer_class mailer else tests determine_default_mailer(name) end end def determine_default_mailer(name) name.sub(/Test$/, '').constantize rescue NameError raise NonInferrableMailerError.new(name) end end protected def initialize_test_deliveries ActionMailer::Base.delivery_method = :test ActionMailer::Base.perform_deliveries = true ActionMailer::Base.deliveries.clear end def set_expected_mail @expected = Mail.new @expected.content_type ["text", "plain", { "charset" => charset }] @expected.mime_version = '1.0' end private def charset "UTF-8" end def encode(subject) Mail::Encodings.q_value_encode(subject, charset) end def read_fixture(action) IO.readlines(File.join(Rails.root, 'test', 'fixtures', self.class.mailer_class.name.underscore, action)) end end include Behavior end end actionmailer-3.2.16/lib/action_mailer/mail_helper.rb0000644000175000017500000000270012247655405021771 0ustar ondrejondrejmodule ActionMailer module MailHelper # Uses Text::Format to take the text and format it, indented two spaces for # each line, and wrapped at 72 columns. def block_format(text) formatted = text.split(/\n\r\n/).collect { |paragraph| format_paragraph(paragraph) }.join("\n") # Make list points stand on their own line formatted.gsub!(/[ ]*([*]+) ([^*]*)/) { |s| " #{$1} #{$2.strip}\n" } formatted.gsub!(/[ ]*([#]+) ([^#]*)/) { |s| " #{$1} #{$2.strip}\n" } formatted end # Access the mailer instance. def mailer @_controller end # Access the message instance. def message @_message end # Access the message attachments list. def attachments @_message.attachments end # Returns +text+ wrapped at +len+ columns and indented +indent+ spaces. # # === Examples # # my_text = "Here is a sample text with more than 40 characters" # # format_paragraph(my_text, 25, 4) # # => " Here is a sample text with\n more than 40 characters" def format_paragraph(text, len = 72, indent = 2) sentences = [[]] text.split.each do |word| if (sentences.last + [word]).join(' ').length > len sentences << [word] else sentences.last << word end end sentences.map { |sentence| "#{" " * indent}#{sentence.join(' ')}" }.join "\n" end end end actionmailer-3.2.16/lib/action_mailer/test_helper.rb0000644000175000017500000000324312247655405022031 0ustar ondrejondrejmodule ActionMailer module TestHelper extend ActiveSupport::Concern # Asserts that the number of emails sent matches the given number. # # def test_emails # assert_emails 0 # ContactMailer.deliver_contact # assert_emails 1 # ContactMailer.deliver_contact # assert_emails 2 # end # # If a block is passed, that block should cause the specified number of emails to be sent. # # def test_emails_again # assert_emails 1 do # ContactMailer.deliver_contact # end # # assert_emails 2 do # ContactMailer.deliver_contact # ContactMailer.deliver_contact # end # end def assert_emails(number) if block_given? original_count = ActionMailer::Base.deliveries.size yield new_count = ActionMailer::Base.deliveries.size assert_equal original_count + number, new_count, "#{number} emails expected, but #{new_count - original_count} were sent" else assert_equal number, ActionMailer::Base.deliveries.size end end # Assert that no emails have been sent. # # def test_emails # assert_no_emails # ContactMailer.deliver_contact # assert_emails 1 # end # # If a block is passed, that block should not cause any emails to be sent. # # def test_emails_again # assert_no_emails do # # No emails should be sent from this block # end # end # # Note: This assertion is simply a shortcut for: # # assert_emails 0 def assert_no_emails(&block) assert_emails 0, &block end end end actionmailer-3.2.16/lib/action_mailer/base.rb0000644000175000017500000007667612247655405020451 0ustar ondrejondrejrequire 'mail' require 'action_mailer/collector' require 'active_support/core_ext/array/wrap' require 'active_support/core_ext/object/blank' require 'active_support/core_ext/proc' require 'active_support/core_ext/string/inflections' require 'active_support/core_ext/hash/except' require 'active_support/core_ext/module/anonymous' require 'action_mailer/log_subscriber' module ActionMailer #:nodoc: # Action Mailer allows you to send email from your application using a mailer model and views. # # = Mailer Models # # To use Action Mailer, you need to create a mailer model. # # $ rails generate mailer Notifier # # The generated model inherits from ActionMailer::Base. Emails are defined by creating methods # within the model which are then used to set variables to be used in the mail template, to # change options on the mail, or to add attachments. # # Examples: # # class Notifier < ActionMailer::Base # default :from => 'no-reply@example.com', # :return_path => 'system@example.com' # # def welcome(recipient) # @account = recipient # mail(:to => recipient.email_address_with_name, # :bcc => ["bcc@example.com", "Order Watcher "]) # end # end # # Within the mailer method, you have access to the following methods: # # * attachments[]= - Allows you to add attachments to your email in an intuitive # manner; attachments['filename.png'] = File.read('path/to/filename.png') # # * attachments.inline[]= - Allows you to add an inline attachment to your email # in the same manner as attachments[]= # # * headers[]= - Allows you to specify any header field in your email such # as headers['X-No-Spam'] = 'True'. Note, while most fields like To: # From: can only appear once in an email header, other fields like X-Anything # can appear multiple times. If you want to change a field that can appear multiple times, # you need to set it to nil first so that Mail knows you are replacing it and not adding # another field of the same name. # # * headers(hash) - Allows you to specify multiple headers in your email such # as headers({'X-No-Spam' => 'True', 'In-Reply-To' => '1234@message.id'}) # # * mail - Allows you to specify email to be sent. # # The hash passed to the mail method allows you to specify any header that a Mail::Message # will accept (any valid Email header including optional fields). # # The mail method, if not passed a block, will inspect your views and send all the views with # the same name as the method, so the above action would send the +welcome.text.erb+ view # file as well as the +welcome.text.html.erb+ view file in a +multipart/alternative+ email. # # If you want to explicitly render only certain templates, pass a block: # # mail(:to => user.email) do |format| # format.text # format.html # end # # The block syntax is also useful in providing information specific to a part: # # mail(:to => user.email) do |format| # format.text(:content_transfer_encoding => "base64") # format.html # end # # Or even to render a special view: # # mail(:to => user.email) do |format| # format.text # format.html { render "some_other_template" } # end # # = Mailer views # # Like Action Controller, each mailer class has a corresponding view directory in which each # method of the class looks for a template with its name. # # To define a template to be used with a mailing, create an .erb file with the same # name as the method in your mailer model. For example, in the mailer defined above, the template at # app/views/notifier/welcome.text.erb would be used to generate the email. # # Variables defined in the model are accessible as instance variables in the view. # # Emails by default are sent in plain text, so a sample view for our model example might look like this: # # Hi <%= @account.name %>, # Thanks for joining our service! Please check back often. # # You can even use Action Pack helpers in these views. For example: # # You got a new note! # <%= truncate(@note.body, :length => 25) %> # # If you need to access the subject, from or the recipients in the view, you can do that through message object: # # You got a new note from <%= message.from %>! # <%= truncate(@note.body, :length => 25) %> # # # = Generating URLs # # URLs can be generated in mailer views using url_for or named routes. Unlike controllers from # Action Pack, the mailer instance doesn't have any context about the incoming request, so you'll need # to provide all of the details needed to generate a URL. # # When using url_for you'll need to provide the :host, :controller, and :action: # # <%= url_for(:host => "example.com", :controller => "welcome", :action => "greeting") %> # # When using named routes you only need to supply the :host: # # <%= users_url(:host => "example.com") %> # # You should use the named_route_url style (which generates absolute URLs) and avoid using the # named_route_path style (which generates relative URLs), since clients reading the mail will # have no concept of a current URL from which to determine a relative path. # # It is also possible to set a default host that will be used in all mailers by setting the :host # option as a configuration option in config/application.rb: # # config.action_mailer.default_url_options = { :host => "example.com" } # # When you decide to set a default :host for your mailers, then you need to make sure to use the # :only_path => false option when using url_for. Since the url_for view helper # will generate relative URLs by default when a :host option isn't explicitly provided, passing # :only_path => false will ensure that absolute URLs are generated. # # = Sending mail # # Once a mailer action and template are defined, you can deliver your message or create it and save it # for delivery later: # # Notifier.welcome(david).deliver # sends the email # mail = Notifier.welcome(david) # => a Mail::Message object # mail.deliver # sends the email # # You never instantiate your mailer class. Rather, you just call the method you defined on the class itself. # # = Multipart Emails # # Multipart messages can also be used implicitly because Action Mailer will automatically detect and use # multipart templates, where each template is named after the name of the action, followed by the content # type. Each such detected template will be added as a separate part to the message. # # For example, if the following templates exist: # * signup_notification.text.erb # * signup_notification.text.html.erb # * signup_notification.text.xml.builder # * signup_notification.text.yaml.erb # # Each would be rendered and added as a separate part to the message, with the corresponding content # type. The content type for the entire message is automatically set to multipart/alternative, # which indicates that the email contains multiple different representations of the same email # body. The same instance variables defined in the action are passed to all email templates. # # Implicit template rendering is not performed if any attachments or parts have been added to the email. # This means that you'll have to manually add each part to the email and set the content type of the email # to multipart/alternative. # # = Attachments # # Sending attachment in emails is easy: # # class ApplicationMailer < ActionMailer::Base # def welcome(recipient) # attachments['free_book.pdf'] = File.read('path/to/file.pdf') # mail(:to => recipient, :subject => "New account information") # end # end # # Which will (if it had both a welcome.text.erb and welcome.text.html.erb # template in the view directory), send a complete multipart/mixed email with two parts, # the first part being a multipart/alternative with the text and HTML email parts inside, # and the second being a application/pdf with a Base64 encoded copy of the file.pdf book # with the filename +free_book.pdf+. # # = Inline Attachments # # You can also specify that a file should be displayed inline with other HTML. This is useful # if you want to display a corporate logo or a photo. # # class ApplicationMailer < ActionMailer::Base # def welcome(recipient) # attachments.inline['photo.png'] = File.read('path/to/photo.png') # mail(:to => recipient, :subject => "Here is what we look like") # end # end # # And then to reference the image in the view, you create a welcome.html.erb file and # make a call to +image_tag+ passing in the attachment you want to display and then call # +url+ on the attachment to get the relative content id path for the image source: # #

Please Don't Cringe

# # <%= image_tag attachments['photo.png'].url -%> # # As we are using Action View's +image_tag+ method, you can pass in any other options you want: # #

Please Don't Cringe

# # <%= image_tag attachments['photo.png'].url, :alt => 'Our Photo', :class => 'photo' -%> # # = Observing and Intercepting Mails # # Action Mailer provides hooks into the Mail observer and interceptor methods. These allow you to # register classes that are called during the mail delivery life cycle. # # An observer class must implement the :delivered_email(message) method which will be # called once for every email sent after the email has been sent. # # An interceptor class must implement the :delivering_email(message) method which will be # called before the email is sent, allowing you to make modifications to the email before it hits # the delivery agents. Your class should make any needed modifications directly to the passed # in Mail::Message instance. # # = Default Hash # # Action Mailer provides some intelligent defaults for your emails, these are usually specified in a # default method inside the class definition: # # class Notifier < ActionMailer::Base # default :sender => 'system@example.com' # end # # You can pass in any header value that a Mail::Message accepts. Out of the box, # ActionMailer::Base sets the following: # # * :mime_version => "1.0" # * :charset => "UTF-8", # * :content_type => "text/plain", # * :parts_order => [ "text/plain", "text/enriched", "text/html" ] # # parts_order and charset are not actually valid Mail::Message header fields, # but Action Mailer translates them appropriately and sets the correct values. # # As you can pass in any header, you need to either quote the header as a string, or pass it in as # an underscored symbol, so the following will work: # # class Notifier < ActionMailer::Base # default 'Content-Transfer-Encoding' => '7bit', # :content_description => 'This is a description' # end # # Finally, Action Mailer also supports passing Proc objects into the default hash, so you # can define methods that evaluate as the message is being generated: # # class Notifier < ActionMailer::Base # default 'X-Special-Header' => Proc.new { my_method } # # private # # def my_method # 'some complex call' # end # end # # Note that the proc is evaluated right at the start of the mail message generation, so if you # set something in the defaults using a proc, and then set the same thing inside of your # mailer method, it will get over written by the mailer method. # # = Configuration options # # These options are specified on the class level, like # ActionMailer::Base.raise_delivery_errors = true # # * default - You can pass this in at a class level as well as within the class itself as # per the above section. # # * logger - the logger is used for generating information on the mailing run if available. # Can be set to nil for no logging. Compatible with both Ruby's own Logger and Log4r loggers. # # * smtp_settings - Allows detailed configuration for :smtp delivery method: # * :address - Allows you to use a remote mail server. Just change it from its default # "localhost" setting. # * :port - On the off chance that your mail server doesn't run on port 25, you can change it. # * :domain - If you need to specify a HELO domain, you can do it here. # * :user_name - If your mail server requires authentication, set the username in this setting. # * :password - If your mail server requires authentication, set the password in this setting. # * :authentication - If your mail server requires authentication, you need to specify the # authentication type here. # This is a symbol and one of :plain (will send the password in the clear), :login (will # send password Base64 encoded) or :cram_md5 (combines a Challenge/Response mechanism to exchange # information and a cryptographic Message Digest 5 algorithm to hash important information) # * :enable_starttls_auto - When set to true, detects if STARTTLS is enabled in your SMTP server # and starts to use it. # * :openssl_verify_mode - When using TLS, you can set how OpenSSL checks the certificate. This is # really useful if you need to validate a self-signed and/or a wildcard certificate. You can use the name # of an OpenSSL verify constant ('none', 'peer', 'client_once','fail_if_no_peer_cert') or directly the # constant (OpenSSL::SSL::VERIFY_NONE, OpenSSL::SSL::VERIFY_PEER,...). # # * sendmail_settings - Allows you to override options for the :sendmail delivery method. # * :location - The location of the sendmail executable. Defaults to /usr/sbin/sendmail. # * :arguments - The command line arguments. Defaults to -i -t with -f sender@address # added automatically before the message is sent. # # * file_settings - Allows you to override options for the :file delivery method. # * :location - The directory into which emails will be written. Defaults to the application # tmp/mails. # # * raise_delivery_errors - Whether or not errors should be raised if the email fails to be delivered. # # * delivery_method - Defines a delivery method. Possible values are :smtp (default), # :sendmail, :test, and :file. Or you may provide a custom delivery method # object eg. MyOwnDeliveryMethodClass.new. See the Mail gem documentation on the interface you need to # implement for a custom delivery agent. # # * perform_deliveries - Determines whether emails are actually sent from Action Mailer when you # call .deliver on an mail message or on an Action Mailer method. This is on by default but can # be turned off to aid in functional testing. # # * deliveries - Keeps an array of all the emails sent out through the Action Mailer with # delivery_method :test. Most useful for unit and functional testing. # class Base < AbstractController::Base include DeliveryMethods abstract! include AbstractController::Logger include AbstractController::Rendering include AbstractController::Layouts include AbstractController::Helpers include AbstractController::Translation include AbstractController::AssetPaths self.protected_instance_variables = %w(@_action_has_layout) helper ActionMailer::MailHelper private_class_method :new #:nodoc: class_attribute :default_params self.default_params = { :mime_version => "1.0", :charset => "UTF-8", :content_type => "text/plain", :parts_order => [ "text/plain", "text/enriched", "text/html" ] }.freeze class << self # Register one or more Observers which will be notified when mail is delivered. def register_observers(*observers) observers.flatten.compact.each { |observer| register_observer(observer) } end # Register one or more Interceptors which will be called before mail is sent. def register_interceptors(*interceptors) interceptors.flatten.compact.each { |interceptor| register_interceptor(interceptor) } end # Register an Observer which will be notified when mail is delivered. # Either a class or a string can be passed in as the Observer. If a string is passed in # it will be constantized. def register_observer(observer) delivery_observer = (observer.is_a?(String) ? observer.constantize : observer) Mail.register_observer(delivery_observer) end # Register an Interceptor which will be called before mail is sent. # Either a class or a string can be passed in as the Interceptor. If a string is passed in # it will be constantized. def register_interceptor(interceptor) delivery_interceptor = (interceptor.is_a?(String) ? interceptor.constantize : interceptor) Mail.register_interceptor(delivery_interceptor) end def mailer_name @mailer_name ||= anonymous? ? "anonymous" : name.underscore end attr_writer :mailer_name alias :controller_path :mailer_name def default(value = nil) self.default_params = default_params.merge(value).freeze if value default_params end # Receives a raw email, parses it into an email object, decodes it, # instantiates a new mailer, and passes the email object to the mailer # object's +receive+ method. If you want your mailer to be able to # process incoming messages, you'll need to implement a +receive+ # method that accepts the raw email string as a parameter: # # class MyMailer < ActionMailer::Base # def receive(mail) # ... # end # end def receive(raw_mail) ActiveSupport::Notifications.instrument("receive.action_mailer") do |payload| mail = Mail.new(raw_mail) set_payload_for_mail(payload, mail) new.receive(mail) end end # Wraps an email delivery inside of Active Support Notifications instrumentation. This # method is actually called by the Mail::Message object itself through a callback # when you call :deliver on the Mail::Message, calling +deliver_mail+ directly # and passing a Mail::Message will do nothing except tell the logger you sent the email. def deliver_mail(mail) #:nodoc: ActiveSupport::Notifications.instrument("deliver.action_mailer") do |payload| self.set_payload_for_mail(payload, mail) yield # Let Mail do the delivery actions end end def respond_to?(method, include_private = false) #:nodoc: super || action_methods.include?(method.to_s) end protected def set_payload_for_mail(payload, mail) #:nodoc: payload[:mailer] = name payload[:message_id] = mail.message_id payload[:subject] = mail.subject payload[:to] = mail.to payload[:from] = mail.from payload[:bcc] = mail.bcc if mail.bcc.present? payload[:cc] = mail.cc if mail.cc.present? payload[:date] = mail.date payload[:mail] = mail.encoded end def method_missing(method, *args) #:nodoc: return super unless respond_to?(method) new(method, *args).message end end attr_internal :message # Instantiate a new mailer object. If +method_name+ is not +nil+, the mailer # will be initialized according to the named method. If not, the mailer will # remain uninitialized (useful when you only need to invoke the "receive" # method, for instance). def initialize(method_name=nil, *args) super() @mail_was_called = false @_message = Mail.new process(method_name, *args) if method_name end def process(*args) #:nodoc: lookup_context.skip_default_locale! super @_message = NullMail.new unless @mail_was_called end class NullMail #:nodoc: def body; '' end def method_missing(*args) nil end end def mailer_name self.class.mailer_name end # Allows you to pass random and unusual headers to the new +Mail::Message+ object # which will add them to itself. # # headers['X-Special-Domain-Specific-Header'] = "SecretValue" # # You can also pass a hash into headers of header field names and values, which # will then be set on the Mail::Message object: # # headers 'X-Special-Domain-Specific-Header' => "SecretValue", # 'In-Reply-To' => incoming.message_id # # The resulting Mail::Message will have the following in it's header: # # X-Special-Domain-Specific-Header: SecretValue def headers(args=nil) if args @_message.headers(args) else @_message end end # Allows you to add attachments to an email, like so: # # mail.attachments['filename.jpg'] = File.read('/path/to/filename.jpg') # # If you do this, then Mail will take the file name and work out the mime type # set the Content-Type, Content-Disposition, Content-Transfer-Encoding and # base64 encode the contents of the attachment all for you. # # You can also specify overrides if you want by passing a hash instead of a string: # # mail.attachments['filename.jpg'] = {:mime_type => 'application/x-gzip', # :content => File.read('/path/to/filename.jpg')} # # If you want to use a different encoding than Base64, you can pass an encoding in, # but then it is up to you to pass in the content pre-encoded, and don't expect # Mail to know how to decode this data: # # file_content = SpecialEncode(File.read('/path/to/filename.jpg')) # mail.attachments['filename.jpg'] = {:mime_type => 'application/x-gzip', # :encoding => 'SpecialEncoding', # :content => file_content } # # You can also search for specific attachments: # # # By Filename # mail.attachments['filename.jpg'] # => Mail::Part object or nil # # # or by index # mail.attachments[0] # => Mail::Part (first attachment) # def attachments @_message.attachments end # The main method that creates the message and renders the email templates. There are # two ways to call this method, with a block, or without a block. # # Both methods accept a headers hash. This hash allows you to specify the most used headers # in an email message, these are: # # * :subject - The subject of the message, if this is omitted, Action Mailer will # ask the Rails I18n class for a translated :subject in the scope of # [mailer_scope, action_name] or if this is missing, will translate the # humanized version of the action_name # * :to - Who the message is destined for, can be a string of addresses, or an array # of addresses. # * :from - Who the message is from # * :cc - Who you would like to Carbon-Copy on this email, can be a string of addresses, # or an array of addresses. # * :bcc - Who you would like to Blind-Carbon-Copy on this email, can be a string of # addresses, or an array of addresses. # * :reply_to - Who to set the Reply-To header of the email to. # * :date - The date to say the email was sent on. # # You can set default values for any of the above headers (except :date) by using the default # class method: # # class Notifier < ActionMailer::Base # self.default :from => 'no-reply@test.lindsaar.net', # :bcc => 'email_logger@test.lindsaar.net', # :reply_to => 'bounces@test.lindsaar.net' # end # # If you need other headers not listed above, you can either pass them in # as part of the headers hash or use the headers['name'] = value # method. # # When a :return_path is specified as header, that value will be used as the 'envelope from' # address for the Mail message. Setting this is useful when you want delivery notifications # sent to a different address than the one in :from. Mail will actually use the # :return_path in preference to the :sender in preference to the :from # field for the 'envelope from' value. # # If you do not pass a block to the +mail+ method, it will find all templates in the # view paths using by default the mailer name and the method name that it is being # called from, it will then create parts for each of these templates intelligently, # making educated guesses on correct content type and sequence, and return a fully # prepared Mail::Message ready to call :deliver on to send. # # For example: # # class Notifier < ActionMailer::Base # default :from => 'no-reply@test.lindsaar.net', # # def welcome # mail(:to => 'mikel@test.lindsaar.net') # end # end # # Will look for all templates at "app/views/notifier" with name "welcome". However, those # can be customized: # # mail(:template_path => 'notifications', :template_name => 'another') # # And now it will look for all templates at "app/views/notifications" with name "another". # # If you do pass a block, you can render specific templates of your choice: # # mail(:to => 'mikel@test.lindsaar.net') do |format| # format.text # format.html # end # # You can even render text directly without using a template: # # mail(:to => 'mikel@test.lindsaar.net') do |format| # format.text { render :text => "Hello Mikel!" } # format.html { render :text => "

Hello Mikel!

" } # end # # Which will render a multipart/alternative email with text/plain and # text/html parts. # # The block syntax also allows you to customize the part headers if desired: # # mail(:to => 'mikel@test.lindsaar.net') do |format| # format.text(:content_transfer_encoding => "base64") # format.html # end # def mail(headers={}, &block) # Guard flag to prevent both the old and the new API from firing. # On master this flag was renamed to `@_mail_was_called`. # On master there is only one API and this flag is no longer used as a guard. @mail_was_called = true m = @_message # At the beginning, do not consider class default for parts order neither content_type content_type = headers[:content_type] parts_order = headers[:parts_order] # Call all the procs (if any) default_values = self.class.default.merge(self.class.default) do |k,v| v.respond_to?(:call) ? v.bind(self).call : v end # Handle defaults headers = headers.reverse_merge(default_values) headers[:subject] ||= default_i18n_subject # Apply charset at the beginning so all fields are properly quoted m.charset = charset = headers[:charset] # Set configure delivery behavior wrap_delivery_behavior!(headers.delete(:delivery_method)) # Assign all headers except parts_order, content_type and body assignable = headers.except(:parts_order, :content_type, :body, :template_name, :template_path) assignable.each { |k, v| m[k] = v } # Render the templates and blocks responses, explicit_order = collect_responses_and_parts_order(headers, &block) create_parts_from_responses(m, responses) # Setup content type, reapply charset and handle parts order m.content_type = set_content_type(m, content_type, headers[:content_type]) m.charset = charset if m.multipart? parts_order ||= explicit_order || headers[:parts_order] m.body.set_sort_order(parts_order) m.body.sort_parts! end m end protected def set_content_type(m, user_content_type, class_default) params = m.content_type_parameters || {} case when user_content_type.present? user_content_type when m.has_attachments? if m.attachments.detect { |a| a.inline? } ["multipart", "related", params] else ["multipart", "mixed", params] end when m.multipart? ["multipart", "alternative", params] else m.content_type || class_default end end # Translates the +subject+ using Rails I18n class under [:actionmailer, mailer_scope, action_name] scope. # If it does not find a translation for the +subject+ under the specified scope it will default to a # humanized version of the action_name. def default_i18n_subject #:nodoc: mailer_scope = self.class.mailer_name.gsub('/', '.') I18n.t(:subject, :scope => [mailer_scope, action_name], :default => action_name.humanize) end def collect_responses_and_parts_order(headers) #:nodoc: responses, parts_order = [], nil if block_given? collector = ActionMailer::Collector.new(lookup_context) { render(action_name) } yield(collector) parts_order = collector.responses.map { |r| r[:content_type] } responses = collector.responses elsif headers[:body] responses << { :body => headers.delete(:body), :content_type => self.class.default[:content_type] || "text/plain" } else templates_path = headers.delete(:template_path) || self.class.mailer_name templates_name = headers.delete(:template_name) || action_name each_template(templates_path, templates_name) do |template| self.formats = template.formats responses << { :body => render(:template => template), :content_type => template.mime_type.to_s } end end [responses, parts_order] end def each_template(paths, name, &block) #:nodoc: templates = lookup_context.find_all(name, Array.wrap(paths)) templates.uniq_by { |t| t.formats }.each(&block) end def create_parts_from_responses(m, responses) #:nodoc: if responses.size == 1 && !m.has_attachments? responses[0].each { |k,v| m[k] = v } elsif responses.size > 1 && m.has_attachments? container = Mail::Part.new container.content_type = "multipart/alternative" responses.each { |r| insert_part(container, r, m.charset) } m.add_part(container) else responses.each { |r| insert_part(m, r, m.charset) } end end def insert_part(container, response, charset) #:nodoc: response[:charset] ||= charset part = Mail::Part.new(response) container.add_part(part) end ActiveSupport.run_load_hooks(:action_mailer, self) end end actionmailer-3.2.16/lib/action_mailer/version.rb0000644000175000017500000000025512247655405021200 0ustar ondrejondrejmodule ActionMailer module VERSION #:nodoc: MAJOR = 3 MINOR = 2 TINY = 16 PRE = nil STRING = [MAJOR, MINOR, TINY, PRE].compact.join('.') end end actionmailer-3.2.16/metadata.yml0000644000175000017500000000443512247655405016121 0ustar ondrejondrej--- !ruby/object:Gem::Specification name: actionmailer version: !ruby/object:Gem::Version version: 3.2.16 platform: ruby authors: - David Heinemeier Hansson autorequire: bindir: bin cert_chain: [] date: 2013-12-03 00:00:00.000000000 Z dependencies: - !ruby/object:Gem::Dependency name: actionpack requirement: !ruby/object:Gem::Requirement requirements: - - '=' - !ruby/object:Gem::Version version: 3.2.16 type: :runtime prerelease: false version_requirements: !ruby/object:Gem::Requirement requirements: - - '=' - !ruby/object:Gem::Version version: 3.2.16 - !ruby/object:Gem::Dependency name: mail requirement: !ruby/object:Gem::Requirement requirements: - - "~>" - !ruby/object:Gem::Version version: 2.5.4 type: :runtime prerelease: false version_requirements: !ruby/object:Gem::Requirement requirements: - - "~>" - !ruby/object:Gem::Version version: 2.5.4 description: Email on Rails. Compose, deliver, receive, and test emails using the familiar controller/view pattern. First-class support for multipart email and attachments. email: david@loudthinking.com executables: [] extensions: [] extra_rdoc_files: [] files: - CHANGELOG.md - README.rdoc - MIT-LICENSE - lib/action_mailer/base.rb - lib/action_mailer/collector.rb - lib/action_mailer/delivery_methods.rb - lib/action_mailer/log_subscriber.rb - lib/action_mailer/mail_helper.rb - lib/action_mailer/railtie.rb - lib/action_mailer/test_case.rb - lib/action_mailer/test_helper.rb - lib/action_mailer/version.rb - lib/action_mailer.rb - lib/rails/generators/mailer/mailer_generator.rb - lib/rails/generators/mailer/templates/mailer.rb - lib/rails/generators/mailer/USAGE homepage: http://www.rubyonrails.org licenses: - MIT metadata: {} post_install_message: rdoc_options: [] require_paths: - lib required_ruby_version: !ruby/object:Gem::Requirement requirements: - - ">=" - !ruby/object:Gem::Version version: 1.8.7 required_rubygems_version: !ruby/object:Gem::Requirement requirements: - - ">=" - !ruby/object:Gem::Version version: '0' requirements: - none rubyforge_project: rubygems_version: 2.0.2 signing_key: specification_version: 4 summary: Email composition, delivery, and receiving framework (part of Rails). test_files: [] actionmailer-3.2.16/MIT-LICENSE0000644000175000017500000000206212247655405015244 0ustar ondrejondrejCopyright (c) 2004-2011 David Heinemeier Hansson Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.