10000 rails/actionmailer at master · abasjr/rails · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content
{"payload":{"allShortcutsEnabled":false,"path":"actionmailer","repo":{"id":140833620,"defaultBranch":"master","name":"rails","ownerLogin":"abasjr","currentUserCanPush":false,"isFork":true,"isEmpty":false,"createdAt":"2018-07-13T10:28:36.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/36306922?v=4","public":true,"private":false,"isOrgOwned":false},"currentUser":null,"refInfo":{"name":"master","listCacheKey":"v0:1617714896.994116","canEdit":false,"refType":"branch","currentOid":"ac2ada3e00247c1525257b8d56b2e8660d586f11"},"tree":{"items":[{"name":"bin","path":"actionmailer/bin","contentType":"directory"},{"name":"lib","path":"actionmailer/lib","contentType":"directory"},{"name":"test","path":"actionmailer/test","contentType":"directory"},{"name":"CHANGELOG.md","path":"actionmailer/CHANGELOG.md","contentType":"file"},{"name":"MIT-LICENSE","path":"actionmailer/MIT-LICENSE","contentType":"file"},{"name":"README.rdoc","path":"actionmailer/README.rdoc","contentType":"file"},{"name":"Rakefile","path":"actionmailer/Rakefile","contentType":"file"},{"name":"actionmailer.gemspec","path":"actionmailer/actionmailer.gemspec","contentType":"file"}],"templateDirectorySuggestionUrl":null,"readme":{"displayName":"README.rdoc","richText":"\u003carticle class=\"markdown-body entry-content container-lg\" itemprop=\"text\"\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch1 id=\"user-content-label-action+mailer+--+easy+email+delivery+and+testing\" tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eAction Mailer – Easy email delivery and testing\u003cspan\u003e\u003ca href=\"#label-Action+Mailer+--+Easy+email+delivery+and+testing\"\u003e¶\u003c/a\u003e \u003ca href=\"#top\"\u003e↑\u003c/a\u003e\u003c/span\u003e\u003c/h1\u003e\u003ca id=\"user-content-action-mailer--easy-email-delivery-and-testing-\" class=\"anchor\" aria-label=\"Permalink: Action Mailer – Easy email delivery and testing¶↑\" href=\"#action-mailer--easy-email-delivery-and-testing-\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\n\u003cp dir=\"auto\"\u003eAction 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.\u003c/p\u003e\n\n\u003cp dir=\"auto\"\u003eAction 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.\u003c/p\u003e\n\n\u003cp dir=\"auto\"\u003eAdditionally, 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).\u003c/p\u003e\n\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 id=\"user-content-label-sending+emails\" tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eSending emails\u003cspan\u003e\u003ca href=\"#label-Sending+emails\"\u003e¶\u003c/a\u003e \u003ca href=\"#top\"\u003e↑\u003c/a\u003e\u003c/span\u003e\u003c/h2\u003e\u003ca id=\"user-content-sending-emails-\" class=\"anchor\" aria-label=\"Permalink: Sending emails¶↑\" href=\"#sending-emails-\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\n\u003cp dir=\"auto\"\u003eThe framework works by initializing any instance variables you want to be available in the email template, followed by a call to \u003ccode\u003email\u003c/code\u003e to deliver the email.\u003c/p\u003e\n\n\u003cp dir=\"auto\"\u003eThis can be as simple as:\u003c/p\u003e\n\n\u003cpre\u003e\u003cspan\u003eclass\u003c/span\u003e \u003cspan\u003eNotifier\u003c/span\u003e \u003cspan\u003e\u0026lt;\u003c/span\u003e \u003cspan\u003eActionMailer\u003c/span\u003e\u003cspan\u003e::\u003c/span\u003e\u003cspan\u003eBase\u003c/span\u003e\n \u003cspan\u003edefault\u003c/span\u003e \u003cspan\u003efrom:\u003c/span\u003e \u003cspan\u003e'system@loudthinking.com'\u003c/span\u003e\n\n \u003cspan\u003edef\u003c/span\u003e \u003cspan\u003ewelcome\u003c/span\u003e(\u003cspan\u003erecipient\u003c/span\u003e)\n \u003cspan\u003e@recipient\u003c/span\u003e = \u003cspan\u003erecipient\u003c/span\u003e\n \u003cspan\u003email\u003c/span\u003e(\u003cspan\u003eto:\u003c/span\u003e \u003cspan\u003erecipient\u003c/span\u003e,\n \u003cspan\u003esubject:\u003c/span\u003e \u003cspan\u003e\"[Signed up] Welcome #{recipient}\"\u003c/span\u003e)\n \u003cspan\u003eend\u003c/span\u003e\n\u003cspan\u003eend\u003c/span\u003e\n\u003c/pre\u003e\n\n\u003cp dir=\"auto\"\u003eThe 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.\u003c/p\u003e\n\n\u003cp dir=\"auto\"\u003eSo the corresponding body template for the method above could look like this:\u003c/p\u003e\n\n\u003cpre\u003eHello there,\n\nMr. \u0026lt;%= @recipient %\u0026gt;\n\nThank you for signing up!\u003c/pre\u003e\n\n\u003cp dir=\"auto\"\u003eIf the recipient was given as “david@loudthinking.com”, the email generated would look like this:\u003c/p\u003e\n\n\u003cpre\u003eDate: Mon, 25 Jan 2010 22:48:09 +1100\nFrom: system@loudthinking.com\nTo: david@loudthinking.com\nMessage-ID: \u0026lt;4b5d84f9dd6a5_7380800b81ac29578@void.loudthinking.com.mail\u0026gt;\nSubject: [Signed up] Welcome david@loudthinking.com\nMime-Version: 1.0\nContent-Type: text/plain;\n\tcharset=\"US-ASCII\";\nContent-Transfer-Encoding: 7bit\n\nHello there,\n\nMr. david@loudthinking.com\n\nThank you for signing up!\u003c/pre\u003e\n\n\u003cp dir=\"auto\"\u003eIn order to send mails, you simply call the method and then call \u003ccode\u003edeliver_now\u003c/code\u003e on the return value.\u003c/p\u003e\n\n\u003cp dir=\"auto\"\u003eCalling the method returns a Mail Message object:\u003c/p\u003e\n\n\u003cpre\u003e\u003cspan\u003emessage\u003c/span\u003e = \u003cspan\u003eNotifier\u003c/span\u003e.\u003cspan\u003ewelcome\u003c/span\u003e(\u003cspan\u003e\"david@loudthinking.com\"\u003c/span\u003e) \u003cspan\u003e# =\u0026gt; Returns a Mail::Message object\u003c/span\u003e\n\u003cspan\u003emessage\u003c/span\u003e.\u003cspan\u003edeliver_now\u003c/span\u003e \u003cspan\u003e# =\u0026gt; delivers the email\u003c/span\u003e\n\u003c/pre\u003e\n\n\u003cp dir=\"auto\"\u003eOr you can just chain the methods together like:\u003c/p\u003e\n\n\u003cpre\u003e\u003cspan\u003eNotifier\u003c/span\u003e.\u003cspan\u003ewelcome\u003c/span\u003e(\u003cspan\u003e\"david@loudthinking.com\"\u003c/span\u003e).\u003cspan\u003edeliver_now\u003c/span\u003e \u003cspan\u003e# Creates the email and sends it immediately\u003c/span\u003e\n\u003c/pre\u003e\n\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 id=\"user-content-label-setting+defaults\" tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eSetting defaults\u003cspan\u003e\u003ca href=\"#label-Setting+defaults\"\u003e¶\u003c/a\u003e \u003ca href=\"#top\"\u003e↑\u003c/a\u003e\u003c/span\u003e\u003c/h2\u003e\u003ca id=\"user-content-setting-defaults-\" class=\"anchor\" aria-label=\"Permalink: Setting defaults¶↑\" href=\"#setting-defaults-\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\n\u003cp dir=\"auto\"\u003eIt 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 \u003ccode\u003edefault\u003c/code\u003e which you get for free from \u003ccode\u003eActionMailer::Base\u003c/code\u003e. This method accepts a Hash as the parameter. You can use any of the headers, email messages have, like \u003ccode\u003e:from\u003c/code\u003e 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.\u003c/p\u003e\n\n\u003cp dir=\"auto\"\u003eNote that every value you set with this method will get overwritten if you use the same key in your mailer method.\u003c/p\u003e\n\n\u003cp dir=\"auto\"\u003eExample:\u003c/p\u003e\n\n\u003cpre\u003eclass AuthenticationMailer \u0026lt; ActionMailer::Base\n default from: \"awesome@application.com\", subject: Proc.new { \"E-mail was generated at #{Time.now}\" }\n .....\nend\u003c/pre\u003e\n\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 id=\"user-content-label-receiving+emails\" tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eReceiving emails\u003cspan\u003e\u003ca href=\"#label-Receiving+emails\"\u003e¶\u003c/a\u003e \u003ca href=\"#top\"\u003e↑\u003c/a\u003e\u003c/span\u003e\u003c/h2\u003e\u003ca id=\"user-content-receiving-emails-\" class=\"anchor\" aria-label=\"Permalink: Receiving emails¶↑\" href=\"#receiving-emails-\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\n\u003cp dir=\"auto\"\u003eTo receive emails, you need to implement a public instance method called \u003ccode\u003ereceive\u003c/code\u003e that takes an email object as its single parameter. The Action Mailer framework has a corresponding class method, which is also called \u003ccode\u003ereceive\u003c/code\u003e, that accepts a raw, unprocessed email as a string, which it then turns into the email object and calls the receive instance method.\u003c/p\u003e\n\n\u003cp dir=\"auto\"\u003eExample:\u003c/p\u003e\n\n\u003cpre\u003e\u003cspan\u003eclass\u003c/span\u003e \u003cspan\u003eMailman\u003c/span\u003e \u003cspan\u003e\u0026lt;\u003c/span\u003e \u003cspan\u003eActionMailer\u003c/span\u003e\u003cspan\u003e::\u003c/span\u003e\u003cspan\u003eBase\u003c/span\u003e\n \u003cspan\u003edef\u003c/span\u003e \u003cspan\u003ereceive\u003c/span\u003e(\u003cspan\u003eemail\u003c/span\u003e)\n \u003cspan\u003epage\u003c/span\u003e = \u003cspan\u003ePage\u003c/span\u003e.\u003cspan\u003efind_by\u003c/span\u003e(\u003cspan\u003eaddress:\u003c/span\u003e \u003cspan\u003eemail\u003c/span\u003e.\u003cspan\u003eto\u003c/span\u003e.\u003cspan\u003efirst\u003c/span\u003e)\n \u003cspan\u003epage\u003c/span\u003e.\u003cspan\u003eemails\u003c/span\u003e.\u003cspan\u003ecreate\u003c/span\u003e(\n \u003cspan\u003esubject:\u003c/span\u003e \u003cspan\u003eemail\u003c/span\u003e.\u003cspan\u003esubject\u003c/span\u003e, \u003cspan\u003ebody:\u003c/span\u003e \u003cspan\u003eemail\u003c/span\u003e.\u003cspan\u003ebody\u003c/span\u003e\n )\n\n \u003cspan\u003eif\u003c/span\u003e \u003cspan\u003eemail\u003c/span\u003e.\u003cspan\u003ehas_attachments?\u003c/span\u003e\n \u003cspan\u003eemail\u003c/span\u003e.\u003cspan\u003eattachments\u003c/span\u003e.\u003cspan\u003eeach\u003c/span\u003e \u003cspan\u003edo\u003c/span\u003e \u003cspan\u003e|\u003c/span\u003e\u003cspan\u003eattachment\u003c/span\u003e\u003cspan\u003e|\u003c/span\u003e\n \u003cspan\u003epage\u003c/span\u003e.\u003cspan\u003eattachments\u003c/span\u003e.\u003cspan\u003ecreate\u003c/span\u003e({\n \u003cspan\u003efile:\u003c/span\u003e \u003cspan\u003eattachment\u003c/span\u003e, \u003cspan\u003edescription:\u003c/span\u003e \u003cspan\u003eemail\u003c/span\u003e.\u003cspan\u003esubject\u003c/span\u003e\n })\n \u003cspan\u003eend\u003c/span\u003e\n \u003cspan\u003eend\u003c/span\u003e\n \u003cspan\u003eend\u003c/span\u003e\n\u003cspan\u003eend\u003c/span\u003e\n\u003c/pre\u003e\n\n\u003cp dir=\"auto\"\u003eThis Mailman can be the target for Postfix or other MTAs. In Rails, you would use the runner in the trivial case like this:\u003c/p\u003e\n\n\u003cpre\u003e\u003cspan\u003erails\u003c/span\u003e \u003cspan\u003erunner\u003c/span\u003e \u003cspan\u003e'Mailman.receive(STDIN.read)'\u003c/span\u003e\n\u003c/pre\u003e\n\n\u003cp dir=\"auto\"\u003eHowever, 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 process more than just a limited amount of email.\u003c/p\u003e\n\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 id=\"user-content-label-configuration\" tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eConfiguration\u003cspan\u003e\u003ca href=\"#label-Configuration\"\u003e¶\u003c/a\u003e \u003ca href=\"#top\"\u003e↑\u003c/a\u003e\u003c/span\u003e\u003c/h2\u003e\u003ca id=\"user-content-configuration-\" class=\"anchor\" aria-label=\"Permalink: Configuration¶↑\" href=\"#configuration-\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\n\u003cp dir=\"auto\"\u003eThe Base class has the full list of configuration options. Here’s an example:\u003c/p\u003e\n\n\u003cpre\u003e\u003cspan\u003eActionMailer\u003c/span\u003e\u003cspan\u003e::\u003c/span\u003e\u003cspan\u003eBase\u003c/span\u003e.\u003cspan\u003esmtp_settings\u003c/span\u003e = {\n \u003cspan\u003eaddress:\u003c/span\u003e \u003cspan\u003e'smtp.yourserver.com'\u003c/span\u003e, \u003cspan\u003e# default: localhost\u003c/span\u003e\n \u003cspan\u003eport:\u003c/span\u003e \u003cspan\u003e'25'\u003c/span\u003e, \u003cspan\u003e# default: 25\u003c/span\u003e\n \u003cspan\u003euser_name:\u003c/span\u003e \u003cspan\u003e'user'\u003c/span\u003e,\n \u003cspan\u003epassword:\u003c/span\u003e \u003cspan\u003e'pass'\u003c/span\u003e,\n \u003cspan\u003eauthentication:\u003c/span\u003e \u003cspan\u003e:plain\u003c/span\u003e \u003cspan\u003e# :plain, :login or :cram_md5\u003c/span\u003e\n}\n\u003c/pre\u003e\n\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 id=\"user-content-label-download+and+installation\" tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eDownload and installation\u003cspan\u003e\u003ca href=\"#label-Download+and+installation\"\u003e¶\u003c/a\u003e \u003ca href=\"#top\"\u003e↑\u003c/a\u003e\u003c/span\u003e\u003c/h2\u003e\u003ca id=\"user-content-download-and-installation-\" class=\"anchor\" aria-label=\"Permalink: Download and installation¶↑\" href=\"#download-and-installation-\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\n\u003cp dir=\"auto\"\u003eThe latest version of Action Mailer can be installed with RubyGems:\u003c/p\u003e\n\n\u003cpre\u003e$ gem install actionmailer\u003c/pre\u003e\n\n\u003cp dir=\"auto\"\u003eSource code can be downloaded as part of the Rails project on GitHub:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ca href=\"https://github.com/rails/rails/tree/master/actionmailer\"\u003egithub.com/rails/rails/tree/master/actionmailer\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\u003c/ul\u003e\n\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 id=\"user-content-label-license\" tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eLicense\u003cspan\u003e\u003ca href=\"#label-License\"\u003e¶\u003c/a\u003e \u003ca href=\"#top\"\u003e↑\u003c/a\u003e\u003c/span\u003e\u003c/h2\u003e\u003ca id=\"user-content-license-\" class=\"anchor\" aria-label=\"Permalink: License¶↑\" href=\"#license-\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\n\u003cp dir=\"auto\"\u003eAction Mailer is released under the MIT license:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ca href=\"https://opensource.org/licenses/MIT\" rel=\"nofollow\"\u003eopensource.org/licenses/MIT\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\u003c/ul\u003e\n\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 id=\"user-content-label-support\" tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eSupport\u003cspan\u003e\u003ca href=\"#label-Support\"\u003e¶\u003c/a\u003e \u003ca href=\"#top\"\u003e↑\u003c/a\u003e\u003c/span\u003e\u003c/h2\u003e\u003ca id=\"user-content-support-\" class=\"anchor\" aria-label=\"Permalink: Support¶↑\" href=\"#support-\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\n\u003cp dir=\"auto\"\u003eAPI documentation is at\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ca href=\"http://api.rubyonrails.org\" rel=\"nofollow\"\u003eapi.rubyonrails.org\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\u003c/ul\u003e\n\n\u003cp dir=\"auto\"\u003eBug reports for the Ruby on Rails project can be filed here:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ca href=\"https://github.com/rails/rails/issues\"\u003egithub.com/rails/rails/issues\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\u003c/ul\u003e\n\n\u003cp dir=\"auto\"\u003eFeature requests should be discussed on the rails-core mailing list here:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ca href=\"https://groups.google.com/forum/?fromgroups#!forum/rubyonrails-core\" rel=\"nofollow\"\u003egroups.google.com/forum/?fromgroups#!forum/rubyonrails-core\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\u003c/ul\u003e\n\u003c/article\u003e","errorMessage":null,"headerInfo":{"toc":[{"level":1,"text":"Action Mailer – Easy email delivery and testing¶↑","anchor":"action-mailer--easy-email-delivery-and-testing-","htmlText":"Action Mailer – Easy email delivery and testing¶↑"},{"level":2,"text":"Sending emails¶↑","anchor":"sending-emails-","htmlText":"Sending emails¶↑"},{"level":2,"text":"Setting defaults¶↑","anchor":"setting-defaults-","htmlText":"Setting defaults¶↑"},{"level":2,"text":"Receiving emails¶↑","anchor":"receiving-emails-","htmlText":"Receiving emails¶↑"},{"level":2,"text":"Configuration¶↑","anchor":"configuration-","htmlText":"Configuration¶↑"},{"level":2,"text":"Download and installation¶↑","anchor":"download-and-installation-","htmlText":"Download and installation¶↑"},{"level":2,"text":"License¶↑","anchor":"license-","htmlText":"License¶↑"},{"level":2,"text":"Support¶↑","anchor":"support-","htmlText":"Support¶↑"}],"siteNavLoginPath":"/login?return_to=https%3A%2F%2Fgithub.com%2Fabasjr%2Frails%2Ftree%2Fmaster%2Factionmailer"}},"totalCount":8,"showBranchInfobar":true},"fileTree":{"":{"items":[{"name":".github","path":".github","contentType":"directory"},{"name":"actioncable","path":"actioncable","contentType":"directory"},{"name":"actionmailer","path":"actionmailer","contentType":"directory"},{"name":"actionpack","path":"actionpack","contentType":"directory"},{"name":"actionview","path":"actionview","contentType":"directory"},{"name":"activejob","path":"activejob","contentType":"directory"},{"name":"activemodel","path":"activemodel","contentType":"directory"},{"name":"activerecord","path":"activerecord","contentType":"directory"},{"name":"activestorage","path":"activestorage","contentType":"directory"},{"name":"activesupport","path":"activesupport","contentType":"directory"},{"name":"ci","path":"ci","contentType":"directory"},{"name":"guides","path":"guides","contentType":"directory"},{"name":"railties","path":"railties","contentType":"directory"},{"name":"tasks","path":"tasks","contentType":"directory"},{"name":"tools","path":"tools","contentType":"directory"},{"name":".codeclimate.yml","path":".codeclimate.yml","contentType":"file"},{"name":".gitattributes","path":".gitattributes","contentType":"file"},{"name":".gitignore","path":".gitignore","contentType":"file"},{"name":".rubocop.yml","path":".rubocop.yml","contentType":"file"},{"name":".travis.yml","path":".travis.yml","contentType":"file"},{"name":".yardopts","path":".yardopts","contentType":"file"},{"name":"Brewfile","path":"Brewfile","contentType":"file"},{"name":"CODE_OF_CONDUCT.md","path":"CODE_OF_CONDUCT.md","contentType":"file"},{"name":"CONTRIBUTING.md","path":"CONTRIBUTING.md","contentType":"file"},{"name":"Gemfile","path":"Gemfile","contentType":"file"},{"name":"Gemfile.lock","path":"Gemfile.lock","contentType":"file"},{"name":"MIT-LICENSE","path":"MIT-LICENSE","contentType":"file"},{"name":"RAILS_VERSION","path":"RAILS_VERSION","contentType":"file"},{"name":"README.md","path":"README.md","contentType":"file"},{"name":"RELEASING_RAILS.md","path":"RELEASING_RAILS.md","contentType":"file"},{"name":"Rakefile","path":"Rakefile","contentType":"file"},{"name":"rails.gemspec","path":"rails.gemspec","contentType":"file"},{"name":"version.rb","path":"version.rb","contentType":"file"}],"totalCount":33}},"fileTreeProcessingTime":19.817266,"foldersToFetch":[],"treeExpanded":true,"symbolsExpanded":false,"csrf_tokens":{"/abasjr/rails/branches":{"post":"Z7AfFAxGamZBon1gOr_KOMevZS3wJva4DG48TRa4SuH4RagZvOnsNu6bTgk9XLGfORzV80ABzqGyfEA11HNrZA"},"/abasjr/rails/branches/fetch_and_merge/master":{"post":"qFInNYugIeIAgMJwCD9HAaKKE5xKs3_22zqA9-NsHuVD6JcAkk7QxEufwamlXQb-coaeqkhL87gpR4p5Z4r4kw"},"/abasjr/rails/branches/fetch_and_merge/master?discard_changes=true":{"post":"3E9pOj4CmoTpX3fWEu1aCpq0kYRiSlRCitRUtvEdh9Q39dkPJ-xroqJAdA-_jxv1SrgcsmCy2Ax4qV44dfthog"}}},"title":"rails/actionmailer at master · abasjr/rails","appPayload":{"helpUrl":"https://docs.github.com","findFileWorkerPath":"/assets-cdn/worker/find-file-worker-263cab1760dd.js","findInFileWorkerPath":"/assets-cdn/worker/find-in-file-worker-d30550df4878.js","githubDevUrl":null,"enabled_features":{"code_nav_ui_events":false,"react_blob_overlay":false,"accessible_code_button":true}}}
0