【问题标题】:ActionMailer 3 without Rails没有 Rails 的 ActionMailer 3
【发布时间】:2011-06-24 11:48:09
【问题描述】:

我正在编写一个小型 Rub​​y 程序,它将从数据库中提取记录并每天发送一封 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 的环境?

【问题讨论】:

    标签: ruby ruby-on-rails-3 actionmailer


    【解决方案1】:

    经过一番认真的调试,我找到了如何配置它。

    文件ma​​iler.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
    

    文件ma​​iler/daily_email.html.erb

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

    文件ma​​iler/daily_email.text.erb

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

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

    【讨论】:

    • 谢谢...帮助。所以,我接下来要解决的问题是在哪里发表我的观点。我知道,如果我正在创建一个 Rails 应用程序,他们会住在app/views,但我不知道我应该把我的观点放在哪里。目前我的观点如下:lib/bug_mailer/daily_email.html.erb。有什么想法吗?
    • 哈,stackoverflow 有所有答案 :) stackoverflow.com/questions/741989/actionmailer-and-ramaze
    • 这实际上是我在 Rails 之外研究 ActionMailer 时看到的第一篇文章。我按照那里提到的方法,但没有去。这是我目前如何设置所有内容的方式。邮件在这里:bugs_email/lib/bug_mailer.rb。视图在这里:bugs_email/lib/bug_mailer/daily_email.html.erb。因此,除非我遗漏了某些东西(这是可能的!),否则我的设置就像那个示例一样。
    • 我不确定这是否真的“正确”,但我通过对邮件 gem 文件进行了一些挖掘,想出了一个解决方案。我将此行添加到我的daily_email 方法:body =&gt; File.read(File.dirname(__FILE__) + "/../views/bug_mailer/daily_email.html.erb") 中的mail() 方法调用中。所以,现在,我正在用煤气做饭!
    • 耶!我找到了解决方案!!! :D...我对 ruby​​ 和 rails 还很陌生,所以这是一个非常好的挑战 :)
    【解决方案2】:

    我花了一段时间才让它在(非)Rails 4 中工作。我怀疑这只是因为我的 Gemfile 中到处都是 ':require => false',但我需要添加以下内容才能实现工作:

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

    没有上面的代码,我不断收到带有undefined method 'assign_controller' 的 NoMethodError。

    之后,我配置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/&lt;GEM_NAME&gt;/views/mailers/&lt;MAILER_CLASS_NAME&gt;/&lt;MAILER_ACTION_NAME&gt;.erb(MAILER_ACTION_NAME 是您调用以发送电子邮件的邮件程序类的公共实例方法)。

    最后,别忘了把这个放在你的spec_helper

    ActionMailer::Base.delivery_method = :test
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-22
      • 1970-01-01
      • 2013-04-09
      • 2011-11-29
      • 1970-01-01
      • 2014-01-15
      • 1970-01-01
      相关资源
      最近更新 更多