0

我正在尝试制作一个简单的联系我们表格,因此我需要实现邮件程序。

我创建了一个控制器:

class ContactusController < ApplicationController
   def index
      @contact_us = Contactus.new
   end

   def new
      redirect_to(action: 'index')
   end

   def create
      @contact_us = Contactus.new(params[:contactus])
      if @contact_us.deliver
         flash[:notice] = "Thank-you, We will contact you shortly."
      else
         flash[:error] = "Oops!!! Something went wrong. Your mail was not sent."
      end
      render :index
    end
 end

因为我不想保存我使用 ActiveModel 的数据:

class Contactus
   extend ActiveModel::Naming
   include ActiveModel::Conversion
   include ActiveModel::Validations
   include ActionView::Helpers::TextHelper
   attr_accessor :name, :email, :message

   validate :name,
       :presence => true

   validates :email,
        :format => { :with => /\b[A-Z0-9._%a-z\-]+@(?:[A-Z0-9a-z\-]+\.)+[A-Za-z]{2,4}\z/ }

   validates :message,
        :length => { :minimum => 10, :maximum => 1000 }

   def initialize(attributes = {})
      attributes.each do |name, value|
          send("#{name}=", value)
      end
   end

   def deliver
       return false unless valid?
   mail(
        :to => "XXXXXXXX@gmail.com",
        :from => %("#{name}" <#{email}>),
        :reply_to => email,
        :subject => "Website inquiry",
        :body => message,
        :html_body => simple_format(message)
       )
   true
 end

 def persisted?
     false
 end
end

一切正常。路由很好,验证有效,但我得到的唯一错误是:undefined method mail for #<Contactus:0x007f9da67173e8>

我试图在其中制作名称为 Contactus 和用户模型代码的邮件程序,但出现以下错误:private method new used

如何在 ActiveModel 中使用 ActionMailer 功能?

4

2 回答 2

2

要详细说明如何设置邮件程序,请运行以下命令来生成邮件程序:

rails generate mailer ContactMailer

将以下内容添加到名为app/mailers/contact_mailer

class ContactMailer < ActionMailer::Base
  default from: #{from_email}

  def contact_mail(contact)
    @contact = contact
    mail(to: #{email}, subject: #{Whatever your subject would be})
  end
end

ActionMailer 使用视图来呈现其消息的布局。我检查了文档html_body,但在您在这里使用的选项上找不到任何内容。也许尝试删除它并使用body: simple_format(message)或只是创建模板app/views/mailers/contact_mailer/contact_mail.html.erb并将消息放入自己。你可以看到我@contact故意创建了一个实例变量,所以如果我要创建这样一个模板,我可以访问对象的所有可用属性,所以如果你愿意,你可以进一步定制。

换个说法...

我有点担心您将new操作转发到index此处的操作。你真的有充分的理由改变 RESTful 方法吗?十分之九,当我遇到奇怪的问题private method called或其他一些神秘的错误时,这是​​我试图欺骗系统的时候。如果您重新分配new操作以创建新Contactus对象,是否可以解决您的问题?

更新 SMTP 设置

我的雇主对这些设置的标准可能不是最好的,但这是我迄今为止所做的。在我的environments/production.rb

config.action_mailer.raise_delivery_errors = false
config.action_mailer.perform_deliveries = true
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
  :hash => 'of',
  :mail => 'client',
  :smtp => 'settings'
}

在我的environments/development.rb我复制相同的块,但将第一行替换为

config.action_mailer.raise_delivery_errors = true

在我的environments/test.rb我没有添加以上任何内容。相反,我添加了这一行

config.action_mailer.delivery_method = :test

但那是因为我喜欢测试电子邮件是否在我的 RSpec 测试中发送。

我不确定你的配置在你的 中是什么样的environment.rb,但你可能想确保你通过 ActionMailer 像这样进行配置。当然,在进行这些更改后重新启动您的应用程序,看看您是否仍然存在身份验证问题。

对于特定的身份验证问题

我的个人 SMTP 设置通过 gmail 进行身份验证,因此我在这些文件中的设置包括以下对:

:address => 'smtp.gmail.com',
:port => #{port_number},
:domain => #{our_email_domain},
:authentication => 'plain',
:enable_starttls_auto => true

尝试查找您的portand domain。如果您不是为拥有自己域的企业执行此操作,则谷歌搜索就足够了。如果您的密码没有被正确解释, and 设置应该会有所帮助authenticationsmarttls

于 2013-07-06T17:00:41.200 回答
1

您必须在其中创建一个单独的类,该类app/mailers继承自ActionMailer::Base. 在该类中,您可以调用该mail方法。你不能mail直接在你的ContactUs课堂上打电话。

一旦你设置了你的邮件类,就可以像这样使用它ContactUs

ContactMailer.contact_mail(self).deliver
于 2013-07-06T15:58:20.377 回答