Ruby on Rails - 发送邮件



Action Mailer 是 Rails 组件,它使应用程序能够发送和接收电子邮件。 在本章中,我们将了解如何使用 Rails 发送电子邮件。 让我们开始使用以下命令创建 emails 项目。

tp> rails new mailtest

这将创建所需的框架以继续进行。 现在,我们将开始配置 ActionMailer。

Action Mailer - 配置

以下是在继续实际工作之前必须遵循的步骤 -

转到 emails 项目的 config 文件夹并打开 environment.rb 文件,并在该文件的底部添加以下行。

config.action_mailer.delivery_method = :smtp

它告诉 ActionMailer 您希望使用 SMTP 服务器。 如果您使用的是基于 Unix 的操作系统(例如 Mac OS X 或 Linux),您也可以将其设置为 :sendmail。

在您的 environment.rb 的底部也添加以下代码行。

config.action_mailer.smtp_settings = {
   address:              'smtp.gmail.com',
   port:                 587,
   domain:               'example.com',
   user_name:            '<username>',
   password:             '<password>',
   authentication:       'plain',
   enable_starttls_auto: true  
}

将每个哈希值替换为您自己的简单邮件传输协议 (SMTP) 服务器的正确设置。 如果您还不知道,您可以从您的互联网服务提供商处获取此信息。 如果您使用的是标准 SMTP 服务器,则无需更改端口号 25 和身份验证类型。

您还可以更改默认的电子邮件消息格式。 如果您希望以 HTML 格式而不是纯文本格式发送电子邮件,请在 config/environment.rb 中也添加以下行 -

ActionMailer::Base.default_content_type = "text/html"

ActionMailer::Base.default_content_type 可以设置为“text/plain”、“text/html”和“text/enriched”。 默认值为“text/plain”。

下一步将是创建一个邮件程序

生成邮件程序

使用以下命令生成邮件程序,如下所示 -

tp> cd emails
emails> rails generate mailer Usermailer

这将在 app\mailer 目录中创建一个文件 user_mailer.rb。 检查此文件的内容,如下所示 -

class Emailer < ActionMailer::Base
end

让我们创建一个方法,如下所示 -

class UserMailer < ApplicationMailer
   default from: '[email protected]'
   
   def welcome_email(user)
      @user = user
      @url  = 'http://www.gmail.com'
      mail(to: @user.email, subject: 'Welcome to My Awesome Site')
   end
   
end
  • default Hash - 这是您从此邮件程序发送的任何电子邮件的默认值的哈希。 在这种情况下,我们正在将 :from 标头设置为此类中所有消息的值。 这可以在每个电子邮件的基础上被覆盖

  • mail - 实际的电子邮件消息,我们正在传递 :to 和 :subject 标头。

在 app/views/user_mailer/ 中创建一个名为 welcome_email.html.erb 的文件。 这将是用于电子邮件的模板,以 HTML 格式化 -

<html>
   
   <head>
      <meta content = 'text/html; charset = UTF-8' http-equiv = 'Content-Type' />
   </head>
   
   <body>
      <h1>Welcome to example.com, <%= @user.name %></h1>
      
      <p>
         You have successfully signed up to example.com,your username is: 
         <%= @user.login %>.<br>
      </p>
      
      <p>
         To login to the site, just follow this link: 
         <%= @url %>.
      </p>
      
      <p>Thanks for joining and have a great day!</p>
      
   </body>
</html>

接下来,我们将为此应用程序创建一个文本部分,如下所示 -

Welcome to example.com, <%= @user.name %>
===============================================
 
You have successfully signed up to example.com,
your username is: <%= @user.login %>.
 
To login to the site, just follow this link: <%= @url %>.
 
Thanks for joining and have a great day!

调用邮件程序

首先,让我们创建一个简单的用户脚手架

$ bin/rails generate scaffold user name email login
$ bin/rake db:migrate

Action Mailer 与 Active Job 很好地集成在一起,因此您可以在请求-响应循环之外发送电子邮件,因此用户不必等待它 -

class UsersController < ApplicationController
   # POST /users
   # POST /users.json
   def create
   @user = User.new(params[:user])
   
      respond_to do |format|
         if @user.save
            # Tell the UserMailer to send a welcome email after save
            UserMailer.welcome_email(@user).deliver_later
            
            format.html { redirect_to(@user, notice: 'User was successfully created.') }
            format.json { render json: @user, status: :created, location: @user }
         else
            format.html { render action: 'new' }
            format.json { render json: @user.errors, status: :unprocessable_entity }
         end
         
      end
      
   end
end

现在,使用 http://127.0.0.1:3000/users/new 测试您的应用程序。 它显示以下屏幕,并使用此屏幕,您将能够向任何人发送您的消息。

Send Email

这将发送您的消息,并将显示文本消息“消息发送成功”并输出如下 -

sent mail to [email protected] (2023.Sms)
[ActiveJob] [ActionMailler::DeliveryJob] [2cfde3c-260e-4a33-1a6ada13a9b] Date: Thu, 09 Jul 2015 11:44:05 +0530
From: [email protected]
To: [email protected]
Message-Id: <[email protected]>
Subject: Welcome to My Awesome Site
Mime-Version: 1.0
Content-Type: multipart/alternative;
boundary="--mimepart_559e112d601c8_f1031e7f20233f5";
charset=UTF-8
Content-Transfer-Encoding:7bit

有关如何使用 Rails 发送电子邮件的更多信息,请参阅 ActionMailer

广告