我可以选择创建一个电子邮件,其中的内容可以是HTML文档的一部分,也可以是整个HTML文档。如果它只是一个部分,Mailer应该使用模板进行渲染。如果它包含<html>
元素(表示它是一个完整的HTML文档),则在发送时不应使用模板文件。除了发送的电子邮件中的“电子邮件部分”在某些情况下出现故障和重复之外,我几乎所有的设置和工作都已完成。它搞砸了电子邮件的呈现。我认为这与我对mail
的调用以及Premailer对deliver
方法的处理方式有关,但我不确定从何处开始。
EBlast.rb
def main(m, args={})
# 'm' is an Email.rb object
ready_email 'E-Blast', args # Don't worry about this
assign_private_id_header # or this
# Read the Template
@variable_width = (@user.email =~ /@hotmail|@live|@windows/).nil?
@page_title = m.subject
m.prep_for_email # squeeze unnecessary whitespace and create 'quick-nav' links based on h1 tags
# Read in attachments
m.inline_attachments.each do |name, loc|
attachments.inline[name] = File.read(loc)
end
m.external_attachments.each do |name, loc|
attachments[name] = File.read(loc)
end
mail_object = mail(:to => @user.email, :subject => m.subject) do |format|
format.text { render :text => 'placeholder' } # This should be replaced by Premailer html > text conversion upon deliver!
if m.needs_template?
# Use the main.html.erb template
@email = m # Needed for helper methods in template view
format.html
else
# Use the content of the email as the entire HTML source
format.html { render :text => m.content }
end
end
# Apply Google Analytics tracking parameters to links pointing to this domain
m.prep_for_sending mail_object
end
Email.rb
def prep_for_sending(mail_object)
unless mail_object.html_part.nil?
# Replace the content with the generated html
self.content = mail_object.html_part.body.raw_source
# Add Google analytics tracker info to links
apply_url_tracker :source => "Eblast Generator", :medium => :email
# Replace the html raw_source
mail_object.html_part.body = content
end
# Return mail object so mailer can call deliver
mail_object
end
更新:经过一些解决方法(为“非模板内容”创建一个空白模板)后,我发现了另一个问题......我认为这个问题确实触及了正在发生的事情的核心。当存在文本,html和附件(仅内联或内联和外部)时,不会生成多部分/混合和多部分/相关部分。
更新2:部分成功!显然我是一个奇怪错误的磁铁。在阅读附件时我必须使用File.open(loc, 'rb') { |f| f.read }
而不是File.read(loc)
,因为我正在使用Windows作为开发机器。叹。有没有办法在File.read中指定'rb'标志?我无法在任何地方找到文档。我现在要尝试让Premailer工作,因为我必须禁用它来测试它。
最终更新:看起来Premailer搞砸了多部分布局。有没有一种方法可以使用Premailer而无需自己连接它?我只需要内联CSS并生成纯文本部分。
答案 0 :(得分:1)
确认这是premailer-rails3 gem here的错误。使用gem "premailer-rails3", :git => "git://github.com/tdgs/premailer-rails3.git"
并正确发送。有6个小时:))
ADDENDUM:似乎Premailer可能遇到了this thread中遇到的同样问题。它似乎也复制了html部分,这可能最终搞砸了整个电子邮件解析。所以最后它可能是ActionMailer - 或者在将内容分配给邮件部分的主体时负责哪个类。