使用Rails 4创建联系表单邮件程序

20

我正在尝试在Rails 4中构建联系表单,其中表单包括姓名、电子邮件和正文,并将其发送到我的电子邮件地址。点击“提交”后,应用程序正确地重定向回Contact页面,但似乎没有发送电子邮件。

routes.rb

match '/send_mail', to: 'contact#send_mail', via: 'post'

联系邮箱.html.erb

<!DOCTYPE html>
<html>
    <head>
        <%= stylesheet_link_tag    "application", media: "all", "data-turbolinks-track" => true %>
        <%= javascript_include_tag "application", "data-turbolinks-track" => true %>
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
    </head>
    <body>
        <p>You have received the following email from <%= "#{ @name } (#{ @email }):" %></p>
        <p><%= @body %></p>
    </body>
</html>

联系人控制器

def send_mail
    name = params[:name]
    email = params[:email]
    body = params[:comments]
    ContactMailer.contact_email(name, email, body).deliver
    redirect_to contact_path, notice: 'Message sent'
end

联系邮件发送器contact_mailer.rb

class ContactMailer < ActionMailer::Base
    default to: # my email address

    def contact_email(name, email, body)
        @name = name
        @email = email
        @body = body`enter code here`

        mail(from: email, subject: 'Contact Request')
    end
end

联系我们.html.erb

<div class="container-content">
    <div class="container">
        <%= form_tag(send_mail_path) do %>
            <div class="form-group">
                <%= label_tag 'name', 'Name' %>
                <%= text_field_tag 'name', nil, class: 'form-control', placeholder: 'Your Name' %>
            </div>
           <div class="form-group">
               <%= label_tag 'email', 'Email' %>
               <%= email_field_tag 'email', nil, class: 'form-control', placeholder: 'Your Email Address' %>
           </div>
           <div class="form-group">
               <%= label_tag 'comments', 'Comments' %>
               <%= text_area_tag 'comments', nil, class: 'form-control', rows: 4, placeholder: 'Comments...' %>
           </div>
           <%= submit_tag nil, class: 'btn btn-default btn-about pull-right' %>
       <% end %>
  </div>
</div>

application.rb

config.action_mailer.delivery_method = :sendmail
config.action_mailer.perform_deliveries = true
config.action_mailer.raise_delivery_errors = true

你是否在开发模式下运行,并将 delivery_method 设置为 :test?你能在日志中看到你的电子邮件吗? - jb_314
也许这是一个愚蠢的问题:你改变了config.action_mailer.perform_deliveries = true吗?默认情况下,它是false,防止从开发环境发送邮件... - Danny
@Danny Van Hoof,我已将其设置为true,但无论我处于开发还是生产环境中,都没有发送电子邮件。 - sethfri
2
你的代码看起来没问题。所以,我猜测问题可能与你的smtp设置有关... 它以前工作过吗?换句话说,你确定你的smtp设置没问题吗? - Danny
你从表单提交中得到了哪些参数?你确定它们只是 params[:name] 等吗? - Richard Peck
显示剩余6条评论
1个回答

14

结果发现我没有为我的Heroku应用程序配置外部SMTP服务(因为我以前从未处理过电子邮件,所以不知道要这样做)。由于我对MailChimp相对熟悉,特别是它们的Mandrill服务具有免费层次(我正在为一个学生组织构建此应用程序),因此我轻松地将Mandrill添加到我的Heroku应用程序中,并在application.rb中包含以下设置:

ActionMailer::Base.smtp_settings = {
    address: 'smtp.mandrillapp.com',
    port: 587,
    user_name: ENV['MANDRILL_USERNAME'],
    password: ENV['MANDRILL_APIKEY']
}

这些环境变量是由插件自动设置的。


你需要那些环境文本吗?你不能只是“用引号括起来”吗? - smatthewenglish
2
你的意思是不是用原始字符串作为用户名和密码,而不是检索ENV变量?这样做是可行的,但这不是一个好的实践。将其设置在ENV中更安全,因为它不会轻易地暴露给任何有源代码访问权限的人。此外,如果您需要修改这些值,可以在不重新部署整个应用程序的情况下进行修改。只需修改ENV并重新启动应用程序即可。 - sethfri

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