ruby-on-rails - 如何在 Rails 中真正发送电子邮件
问题描述
我想使用真实帐户从我的应用程序向 Gmail 发送电子邮件我的代码库在这个网站上https://guides.rubyonrails.org/action_mailer_basics.html
,但是当我运行源代码时,电子邮件显示在终端上,但它没有发送到我的 Gmail 帐户。我应该怎么做才能将电子邮件发送到我的 Gmail 帐户,以便我可以在 中查看https://mail.google.com/mail/u/0/#inbox
?
这是我的代码:
user_mailer.rb
class UserMailer < ApplicationMailer
default from: 'xuanle.khtn@gmail.com'
def sample_email
mail to: 'leanhxuan_t59@hus.edu.vn', subject: 'Test Mail Rails'
end
end
用户控制器.rb
def index
UserMailer.sample_email.deliver_now
end
生产.rb
config.action_mailer.delivery_method = :smtp
# SMTP settings for gmail
config.action_mailer.smtp_settings = {
:address => "mail.google.com",
:port => 587,
:user_name => 'xuanle.khtn@gmail.com',
:password => '********',
:authentication => "plain",
:enable_starttls_auto => true
}
解决方案
要将电子邮件功能添加到 rails 项目:
第一次运行
rails g mailer <mailername>
这会给你这个(你可以附加函数名,但让它保持简单)
create app/mailers/mailername_mailer.rb
invoke erb
create app/views/mailername_mailer
invoke test_unit
create test/mailers/mailername_mailer_test.rb
create test/mailers/previews/mailername_mailer_preview.rb
接下来转到应用程序/邮件程序并更改default from:
class ApplicationMailer < ActionMailer::Base
default from: 'example@gmail.com'
layout 'mailer'
end
这将告诉您的应用程序您是从这封电子邮件发送的(稍后您必须提供凭据...)
接下来进入您创建的邮件程序文件app/mailers/mailername_mailer.rb
注意:它继承自 ApplicationMailer,因此您将获得我们上面声明的“默认来源”。
class MailernameMailer < ApplicationMailer
def request(arg)
@arg = arg
mail(to: "example@gmail.com", subject: @arg)
end
end
这个邮件程序本质上是一个类,但实例化的工作方式有点不同。当您静态调用它时,它会创建一个实例……就像您调用模型一样。mail(to: x) 是您要将其邮寄到的帐户。您可以在控制器中使用它。像这样:
ExampleController.rb
def index
MailernameMailer.request("Hi I'm paul").deliver_later
end
对于视图:
电子邮件的一个很酷的功能是内置于 Rails 中的预览。可以在您的文件中调用测试操作,该mailername_mailer_preview.rb
文件位于test/mailers/previews
.
这是它的样子:
def request(args)
@name = args
MailernameMailer.request(@name)
end
就像上面在控制器中一样,您将添加实例化并调用函数..然后在您的视图中使用该数据:app/views/mailername_mailer/request.html.erb
并在以下位置预览:
http://localhost:3000/rails/mailers/mailername_mailer
您的邮件操作将自动路由到与函数同名的视图...
现在验证发件人帐户...(Gmail 需要一个有效帐户才能发送电子邮件)。将您的 production.rb 文件更改为如下所示..尽管您可能应该在进入生产之前将其用于开发,但考虑到您在推动生产之前并不总是需要最佳实践。
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
address: "smtp.gmail.com",
port: 587,
domain: "gmail.com",
user_name: ENV["username"],
password: ENV["password"],
authentication: "plain"
}
config.action_mailer.default_url_options = {host: domain_name}
domain_name 应该只是 localhost:3000 用于开发。
推荐阅读
- deep-learning - 使用 PyTorch 将训练数据集拆分为 CIFAR10 的训练集和验证集后,如何增加数据?
- sharepoint - 错误:将查找字段添加到列表时,“对象在与对象关联的上下文不同的上下文中使用”
- swift - 如何使用 SwiftUI 在 iPhone 上显示弹出视图,就像在 iPad 上一样?
- uwp - 如何在 UWP 中检测用户空闲?
- python - 如何通过基于 Pandas 中的其他列对列进行分组来选择具有最大值的行
- for-loop - 将 For 循环变成 While 循环
- javascript - 在 Google App Engine 上重命名 index.html
- javascript - window.open 适用于 localhost 但不适用于 Web 服务器
- laravel - 如何在 Laravel 中弹出警报消息并告诉用户/回退用户的错误消息?
- javascript - 如何根据vue js选择的另一个选择选项更改选择选项