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

Sinatra Variables in HTML Email Template

我在 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

在 "views/contact_form.erb"...

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

表单发送并且一切正常,除了发送电子邮件时变量读取为“<%= senders_name %>”而不是实际值。

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

此外,这里有一个问题不是你的错。由于 Mail.deliver 用它自己的 self 为 "convenience" 覆盖块上下文的方式,您不能像通常那样访问实例变量或 Sinatra 方法。这就是为什么你得到 NoMethodError.

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

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