不使用Rails的ActionMailer 3

28

我正在编写一个小的 Ruby 程序,每天从数据库中获取记录并发送 HTML 邮件。我尝试使用 ActionMailer 3.0.3 实现这个功能,但是遇到了问题。到目前为止,我所做的所有关于在 Rails 之外使用 ActionMailer 的搜索都适用于版本 3 之前的版本。有人能指导我在哪里找到如何实现这一点的资源吗?下面是我的邮件发送文件:

# lib/bug_mailer.rb
require 'action_mailer'

ActionMailer::Base.delivery_method = :file

class BugMailer < ActionMailer::Base
  def daily_email
    mail(
            :to      => "example@mail.com",
            :from    => "example@mail.com",
            :subject => "testing mail"
    )
  end
end

BugMailer.daily_email.deliver

我肯定不知道该把视图放在哪里。 我尝试让ActionMailer知道我的模板所在的位置,但每次都失败了。

我想我也应该问一下是否有不同的方法来完成这个程序。 基本上,我现在正在从零开始做所有事情。 显然,Rails之所以很棒就是它的约定,那么单独使用Rails的部分是否浪费时间? 有没有一种方法可以创建类似于Rails的环境而不必创建完整的Rails应用程序?

2个回答

49

经过一番严格的调试,我找到了如何进行配置。

文件 mailer.rb

require 'action_mailer'

ActionMailer::Base.raise_delivery_errors = true
ActionMailer::Base.delivery_method = :smtp
ActionMailer::Base.smtp_settings = {
   :address   => "smtp.gmail.com",
   :port      => 587,
   :domain    => "domain.com.ar",
   :authentication => :plain,
   :user_name      => "test@domain.com.ar",
   :password       => "passw0rd",
   :enable_starttls_auto => true
  }
ActionMailer::Base.view_paths= File.dirname(__FILE__)

class Mailer < ActionMailer::Base

  def daily_email
    @var = "var"

    mail(   :to      => "myemail@gmail.com",
            :from    => "test@domain.com.ar",
            :subject => "testing mail") do |format|
                format.text
                format.html
    end
  end
end

email = Mailer.daily_email
puts email
email.deliver

文件 mailer/daily_email.html.erb

<p>this is an html email</p>
<p> and this is a variable <%= @var %> </p>

文件 mailer/daily_email.text.erb

this is a text email

and this is a variable <%= @var %>

好问题!它帮助我更好地理解了Rails 3的工作原理 :)


这实际上是我在研究Rails之外的ActionMailer时查看的第一篇文章。我按照那里提到的方法进行了操作,但没有成功。这是我目前的设置方式。邮件程序在这里:bugs_email/lib/bug_mailer.rb。视图在这里:bugs_email/lib/bug_mailer/daily_email.html.erb。所以除非我漏掉了什么(这是有可能的!),否则我已经按照那个例子设置好了。 - Spencer R
我不确定这是否真的“合适”,但是通过对邮件 gem 文件进行一些挖掘,我想出了一个解决方案。我在 daily_email 方法内部的 mail() 方法调用中添加了这行代码 :body => File.read(File.dirname(__FILE__) + "/../views/bug_mailer/daily_email.html.erb")。所以,现在我可以愉快地使用它啦! - Spencer R
3
太好了!我找到解决办法了!!! :D... 我对Ruby和Rails还比较陌生,所以这是一个很好的挑战 :) - Augusto
再次感谢。也感谢您提供的代码。这将为我节省一些周一的步骤 :) 我还应该提到一些让我困惑的事情(以防其他人遇到同样的问题)。我完全忘记了我工作的网络会阻止外发SMTP连接。因此,有时候当我走在正确的路上时,我没有意识到它,因为我无法连接到gmail。 - Spencer R
谢谢!我遇到的唯一问题是邮件发送程序找不到模板。后来发现是文件名的问题。当我将myfile.html.erb重命名为myfile.erb时,它就正常工作了。 - Julian Mann
显示剩余3条评论

2

我花了一些时间才在(非)Rails 4中使它工作。我怀疑这是因为我的Gemfile中到处都有“:require => false”,但我需要添加以下内容才能使其正常工作:

require 'action_view/record_identifier'
require 'action_view/helpers'
require 'action_mailer'

没有上述代码,我一直收到一个NoMethodError,其中包含“undefined method 'assign_controller'”。
之后,我按照以下方式配置了ActionMailer:
ActionMailer::Base.smtp_settings = {
  address: 'localhost', port: '25', authentication: :plain
}
ActionMailer::Base.default from: 'noreply@example.com'
ActionMailer::Base.raise_delivery_errors = true
ActionMailer::Base.logger = Logger.new(STDOUT)
ActionMailer::Base.logger.level = Logger::DEBUG
ActionMailer::Base.view_paths = [
  File.join(File.expand_path("../../", __FILE__), 'views', 'mailers')
  # Note that this is an Array
]

模板放在 lib/<GEM_NAME>/views/mailers/<MAILER_CLASS_NAME>/<MAILER_ACTION_NAME>.erb(MAILER_ACTION_NAME是您调用以发送电子邮件的电子邮件发送器类的公共实例方法)。

最后别忘了将这个添加到你的spec_helper中:

ActionMailer::Base.delivery_method = :test

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接