📅  最后修改于: 2020-10-20 05:19:43             🧑  作者: Mango
ActionMailer是Rails组件,使应用程序能够发送和接收电子邮件。在本章中,我们将看到如何使用Rails发送电子邮件。
让我们从使用以下命令创建电子邮件项目开始。
C:\ruby> rails -d mysql emails
在这里,我们使用-d mysql选项来指定使用MySQL数据库的兴趣。我们可以使用-d选项指定其他任何数据库名称,例如oracle或postgress 。默认情况下,Rails使用SQLite数据库。
即使我们没有在应用程序中使用数据库,但Rails仍需要它进行处理。因此,让我们执行这些附加步骤。
下面给出的是创建数据库的方式-
mysql> create database emails;
Query OK, 1 row affected (0.01 sec)
mysql> grant all privileges on emails.*
to 'root'@'localhost' identified by 'password';
Query OK, 0 rows affected (0.00 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
要指示Rails定位数据库,请编辑配置文件〜\ upload \ config \ database.yml,并将数据库名称更改为cookbook。完成后,它应如下所示-
development:
adapter: mysql
encoding: utf8
database: emails
username: root
password: password
host: localhost
test:
adapter: mysql
encoding: utf8
database: emails
username: root
password: password
host: localhost
production:
adapter: mysql
encoding: utf8
database: emails
username: root
password: password
host: localhost
以下是在继续实际工作之前必须完成的配置步骤。 –
转到电子邮件项目的config文件夹,然后打开environment.rb文件,并在此文件底部添加以下行。
ActionMailer::Base.delivery_method = :smtp
它通知ActionMailer您要使用SMTP服务器。如果使用的是基于Unix的操作系统,例如Mac OS X或Linux,也可以将其设置为:sendmail。
还要在environment.rb的底部添加以下代码行。
ActionMailer::Base.smtp_settings = {
:address => "smtp.tutorialspoint.com",
:port => 25,
:domain => "tutorialspoint.com",
:authentication => :login,
:user_name => "username",
:password => "password",
}
将每个哈希值替换为简单邮件传输协议(SMTP)服务器的正确设置。如果您还不知道,可以从Internet服务提供商处获取此信息。如果使用标准SMTP服务器,则无需更改端口号25和身份验证类型。
您也可以更改默认电子邮件格式。如果您希望以HTML而非纯文本格式发送电子邮件,请将以下行也添加到config / environment.rb-
ActionMailer::Base.default_content_type = "text/html"
ActionMailer :: Base.default_content_type可以设置为“ text / plain”,“ text / html”和“ text / enriched”。默认值为“文本/纯文本”。
下一步是创建邮件程序。
使用以下命令生成邮件程序,如下所示:
C:\ruby\> cd emails
C:\ruby\emails> ruby script/generate mailer Emailer
它将在app / models目录中创建一个文件emailer.rb。检查此文件的内容,如下所示:
class Emailer < ActionMailer::Base
end
现在,让我们在ActionMailer :: Base类中创建一个方法,如下所示:
class Emailer < ActionMailer::Base
def contact(recipient, subject, message, sent_at = Time.now)
@subject = subject
@recipients = recipient
@from = 'no-reply@yourdomain.com'
@sent_on = sent_at
@body["title"] = 'This is title'
@body["email"] = 'sender@yourdomain.com'
@body["message"] = message
@headers = {}
end
end
contact方法具有四个参数:收件人,主题,消息和send_at,它们定义了何时发送电子邮件。该方法还定义了六个标准参数,它们是每个ActionMailer方法的一部分-
@subject定义电子邮件主题。
@body是一个Ruby哈希,其中包含可用于填充邮件模板的值。您创建了三个键值对:标题,电子邮件和消息
@recipients是要向其发送消息的人员的列表。
@from定义电子邮件的来源。
@sent_on使用send_at参数并设置电子邮件的时间戳。
@headers是另一个哈希,使您可以修改电子邮件标题。例如,如果要发送纯文本或HTML电子邮件,则可以设置电子邮件的MIME类型。
现在,我们将为此应用程序创建一个控制器,如下所示:
C:\ruby\emails> ruby script/generate controller Emailer
让我们在app / controllers / emailer_controller.rb中定义一个控制器方法sendmail ,它将调用Model方法来发送实际的电子邮件,如下所示-
class EmailerController < ApplicationController
def sendmail
recipient = params[:email]
subject = params[:subject]
message = params[:message]
Emailer.deliver_contact(recipient, subject, message)
return if request.xhr?
render :text => 'Message sent successfully'
end
end
要使用邮递员的联系方法发送电子邮件,您必须在方法名称的开头添加delivery _。如果在request.xhr?中添加了return,那么如果浏览器不支持JavaScript,则可以转至Rails Java脚本(RJS),然后指示该方法呈现文本消息。
除了准备一个屏幕之前,您几乎已经完成了工作,您将从屏幕上获取用于发送电子邮件的用户信息。让我们在控制器中定义一个屏幕方法索引,然后在下一节中,我们将定义所有必需的视图-
在emailer_controller.rb文件中添加以下代码。
def index
render :file => 'app\views\emailer\index.html.erb'
end
在app \ views \ emails \ index.html.erb中定义一个视图。这将被称为应用程序的默认页面,并将允许用户输入消息并发送所需的电子邮件-
Send Email
'sendmail' do %>
:
:
除了以上视图之外,我们还需要一个模板,该模板将由Emailer的联系方法在发送消息时使用。这只是带有标准Rails <%=%>占位符的文本。
只需将以下代码放入app / views / contact.html.erb文件中。
Hi!
You are having one email message from with a title
and following is the message:
Thanks
在测试之前,请确保您的计算机已连接到Internet,并且电子邮件服务器和Web服务器已启动并正在运行。
现在,使用http://127.0.0.1:3000/Emailer/index测试您的应用程序。它显示以下屏幕,通过使用此屏幕,您可以将消息发送给任何人。
发送消息后,它将显示文本消息“消息发送成功”。
要将邮件以HTML格式发送,请确保您的视图(.erb文件)生成HTML,然后在emails / app / models / emailer.rb文件中将内容类型设置为html,如下所示-
class Emailer < ActionMailer::Base
def contact(recipient, subject, message, sent_at = Time.now)
@subject = subject
@recipients = recipient
@from = 'no-reply@yourdomain.com'
@sent_on = sent_at
@body["title"] = 'This is title'
@body["email"] = 'sender@yourdomain.com'
@body["message"] = message
@headers = {content_type => 'text/html'}
end
end
有关ActionMailer的完整详细信息,请查阅标准Ruby文档。