我有一个rails 2.3应用程序,希望将premailer gem集成到其中。
我发现如何在rails 3.x应用程序中做到这一点:
How to Integrate 'premailer' with Rails
有人知道如何为Action Mailer 2.3.10做吗?

最佳答案

在过去的几天里,我花了很多时间在这个问题上,但似乎没有什么好的解决方案。可以显式地呈现消息,然后通过premailer传递结果,但是如果模板使用ascii-8bit以外的其他编码,那么它与多部分电子邮件和html布局结合起来会变得混乱。
在没有多部分的直接html电子邮件中,假设使用ascii-8bit编码模板,这对我很有用:

def some_email
    recipients   "Reciever <[email protected]>"
    from         "Sender <[email protected]>"
    subject      "Hello"
    content_type "text/html"

    message = render_message("some_email", { }) # second argument is a hash of locals
    p.body = Premailer.new(message, with_html_string: true).to_inline_css
end

但是,如果模板使用ascii-8bit以外的其他编码进行编码,premailer将销毁所有非ascii字符。有一个修复程序合并到premailer repo中,但此后没有发布任何版本。使用最新版本并调用Premailer.new(message, with_html_string: true, input_encoding: "UTF-8").to_inline_css或类似的方法应该可以工作。合并提交是https://github.com/alexdunae/premailer/commit/5f5cbb4ac181299a7e73d3eca11f3cf546585364
在多部分电子邮件的情况下,我并没有真正让ActionMailer在内部使用正确的内容类型来呈现模板。这会导致通过模板文件名进行的隐式键入不起作用,从而导致布局错误地应用于文本版本。解决方法是显式地对文本版本不使用布局,从而产生类似的结果(请注意模板名称):
def some_multipart_email
    recipients   "Reciever <[email protected]>"
    from         "Sender <[email protected]>"
    subject      "Hello"
    content_type "text/html"

    part "text/html" do |p|
        message = render_message("some_email_html", { })
        p.body = Premailer.new(message, with_html_string: true).to_inline_css
    end

    part "text/plain" do |p|
        p.content_type = "text/plain"
        p.body = render(file: "some_email_text", body: { }, layout: false)
    end
end

关于ruby-on-rails - 将premailer gem与Rails 2.X应用程序集成,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11191341/

10-13 04:45