Это намек Джеймсу, так как это помогло мне правильно настроить почтовую программу.
Небольшое уточнение: во-первых, мы используем аргументы блока внутри блоков для добавления деталей (у меня были проблемы, когда я этого не делал).
Также, если вы хотите использовать макеты, вы должны использовать #render напрямую. Вот пример обоих принципов на работе. Как показано выше, вы должны убедиться, что HTML-часть остается последней.
def message_with_attachment_and_layout( options )
from options[:from]
recipients options[:to]
subject options[:subject]
content_type "multipart/mixed"
part :content_type => 'multipart/alternative' do |copy|
copy.part :content_type => 'text/plain' do |plain|
plain.body = render( :file => "#{options[:render]}.text.plain",
:layout => 'email', :body => options )
end
copy.part :content_type => 'text/html' do |html|
html.body = render( :file => "#{options[:render]}.text.html",
:layout => 'email', :body => options )
end
end
attachment :content_type => "application/pdf",
:filename => options[:attachment][:filename],
:body => File.read( options[:attachment][:path] + '.pdf' )
end
В этом примере используется хэш параметров для создания универсального составного сообщения с вложениями и макетом, которое вы бы использовали следующим образом:
TestMailer.deliver_message_with_attachment_and_layout(
:from => 'a@fubar.com', :to => 'b@fubar.com',
:subject => 'test', :render => 'test',
:attachment => { :filename => 'A Nice PDF',
:path => 'path/to/some/nice/pdf' } )
(На самом деле мы этого не делаем: лучше, чтобы каждый почтовик заполнил для вас множество этих деталей, но я подумал, что это облегчит понимание кода.)
Надеюсь, это поможет. Желаем удачи.
С уважением,
Dan