HTML电子邮件模板中的Sinatra变量

时间:2015-08-29 21:30:58

标签: ruby email sinatra sendmail

我在Sinatra有一份工作联系表格。我现在正在尝试使用HTML模板发送电子邮件,但我无法使我的变量正常工作,它们只是以纯文本形式显示。这是代码。

# for contact form
def send_message
  senders_name = params[:name]
  senders_email = params[:email]
  senders_message = params[:message]

  Mail.deliver do
    to 'me@mywebsite.com'
    from senders_name + " <" + senders_email + ">"
    subject 'Email from contact form on Website'
    # body senders_message
    html_part do
      content_type 'text/html; charset=UTF-8'
      body File.read('views/contact_form.erb')
    end
  end
end

On&#34; views / contact_form.erb&#34; ...

<html>
  <head>
    <title>pygo Contact Form</title>
  </head>
  <body>
    <p>
      Message from <strong><%= senders_name %></strong>
    </p>
    <p>
      <%= senders_message %>
    </p>
  </body>
</html>

表格发送,一切正常,除非电子邮件发送时变量读作&#34;&lt;%= senders_name%&gt;&#34;而不是实际值。

1 个答案:

答案 0 :(得分:2)

File.read只返回文件的文字值,而不是ERB解析的版本。这就是为什么你在电子邮件正文中看到ERB标签而不是你想要的。

另外,这里有一个问题不是你的错。由于Mail.deliver使用它自己的self覆盖块的上下文以获得“方便”,因此您无法像通常应该那样访问实例变量或Sinatra方法。这就是你获得NoMethodError

的原因

解决这个问题的方法是将Sinatra模板渲染到Mail.deliver块之外,并将变量作为本地传递,如下所示:

def send_message
  senders_name = params[:name]
  senders_email = params[:email]
  senders_message = params[:message]

  html_body = erb :contact_form, locals: { senders_name: senders_name, senders_message: senders_message }

  Mail.deliver do
    to 'me@mywebsite.com'
    from senders_name + " <" + senders_email + ">"
    subject 'Email from contact form on Website'
    # body senders_message
    html_part do
      content_type 'text/html; charset=UTF-8'
      body html_body
    end
  end
end