<?xml version="1.0" encoding="utf-8"?>
<!-- If you are running a bot please visit this policy page outlining rules you must respect. http://www.livejournal.com/bots/ -->
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:lj="http://www.livejournal.com">
  <id>urn:lj:livejournal.com:atom1:emdin_dev</id>
  <title>emdin_dev</title>
  <subtitle>emdin_dev</subtitle>
  <author>
    <name>emdin_dev</name>
  </author>
  <link rel="alternate" type="text/html" href="http://emdin-dev.livejournal.com/"/>
  <link rel="self" type="text/xml" href="http://emdin-dev.livejournal.com/data/atom"/>
  <updated>2038-01-19T03:14:07Z</updated>
  <lj:journal userid="9810889" username="emdin_dev" type="personal"/>
  <link rel="service.feed" type="application/x.atom+xml" href="http://emdin-dev.livejournal.com/data/atom" title="emdin_dev"/>
  <link rel="hub" href="http://pubsubhubbub.appspot.com/"/>
  <entry>
    <id>urn:lj:livejournal.com:atom1:emdin_dev:5042</id>
    <link rel="alternate" type="text/html" href="http://emdin-dev.livejournal.com/5042.html"/>
    <link rel="self" type="text/xml" href="http://emdin-dev.livejournal.com/data/atom/?itemid=5042"/>
    <title>Ruby on Rails / ActionMailer / embedded images</title>
    <published>2038-01-19T03:14:07Z</published>
    <updated>2038-01-19T03:14:07Z</updated>
    <category term="ror"/>
    <lj:music>Nature And Organisation - Wicker Man Song</lj:music>
    <content type="html">Если отправка html письма с аттачами встроенными средствами RoR в документации более-менее &lt;a href="http://api.rubyonrails.org/classes/ActionMailer/Base.html"&gt;отражена&lt;/a&gt;, то с отправкой письма в формате HTML со встроенными картинками (emdedded images/objects) дело обстоит куда хуже. Работающий вариант удалось подобрать путём длительных алхимических манипуляций. &lt;br /&gt;&lt;br /&gt;&lt;a name="cutid1"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Контроллер:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;    mail = Mailer.create_mailer&lt;br /&gt;    mail.set_content_type("multipart/related")&lt;br /&gt;&lt;br /&gt;    Mailer.deliver(mail)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Тут всё понятно. Строка с content_type важна -- в принципе, ActionMailer и сам определяет тип письма, но при этом MS Office Outlook, например, картинок в упор не видит.  &lt;br /&gt;&lt;br /&gt;Самое интересное в модели (наверняка можно записать всё гораздо приятнее и короче, но пока не было времени причесать):&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;class Mailer &amp;lt; ActionMailer::Base&lt;br /&gt;&lt;br /&gt;  def mailer(sent_at = Time.now)&lt;br /&gt;&lt;br /&gt;    @subject      =  'here will be dragons'&lt;br /&gt;    @body          =  {}&lt;br /&gt;    @recipients  =  'addressee1@domain.com,addressee2@domain.com,addressee3@domain.com'&lt;br /&gt;    @from          =  'from_name &amp;lt;from@address.com&amp;gt;'&lt;br /&gt;    @sent_on    =  sent_at&lt;br /&gt;    @headers    =  {}&lt;br /&gt;&lt;br /&gt;     part      :content_type =&amp;gt; 'text/html',&lt;br /&gt;                 :body =&amp;gt; '&amp;lt;h4&amp;gt;hohoho&amp;lt;/h4&amp;gt;&amp;lt;img src="cid:part1@domain.com"&amp;gt;',&lt;br /&gt;                 :content_disposition =&amp;gt; 'inline',&lt;br /&gt;                 :headers =&amp;gt; { 'content-id' =&amp;gt; '&amp;lt;html-1@domain.com&amp;gt;' }&lt;br /&gt;&lt;br /&gt;     part     :content_type =&amp;gt; 'image/jpeg',&lt;br /&gt;                 :content_disposition =&amp;gt; 'inline',&lt;br /&gt;                 :transfer_encoding =&amp;gt; 'base64',&lt;br /&gt;                 :body =&amp;gt; File.read(RAILS_ROOT+"/files/some_filename.jpg"),&lt;br /&gt;                 :filename =&amp;gt; 'some_filename.jpg',&lt;br /&gt;                 :headers =&amp;gt; { 'content-id' =&amp;gt; '&amp;lt;part1@domain.com&amp;gt;' }&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;end&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Письмо представляет собой набор кусков разных типов, которые в любых количествах присоединяются через метод part. &lt;br /&gt;&lt;br /&gt;В процессе выяснилось, что у ruby [i386-mswin] есть глюк при чтении бинарных файлов через File.read(путь к файлу), выдаётся только несколько сотен байт из начала (что-то там с pipes, мало что в этом понимаю). Поэтому я пользовался конструкцией File.open(путь к файлу,"rb").read. Впрочем, редко кто держит рабочие версии ror-приложений под виндами, так что это не очень страшно.&lt;br /&gt;&lt;br /&gt;Мне не удалось пока заставить заработать html, подключаемый из view. Как видно из примера, html часть просто присоединяется прямо в коде и снабжается необходимым content-type id и disposition. &lt;br /&gt;&lt;br /&gt;Назначение content-id долго отказывалось работать, а без этого никакой embedding, понятно, не действует. Порылся в исходниках ActonMailer (TMail), мало что понял, но там видно, что для content-id используется какой-то фильтр на формат. Попробовал разные варианты -- сработал вышеописанный, в формате &amp;lt;идентификатор@домен&amp;gt;.&lt;br /&gt;&lt;br /&gt;Вобщем, у меня всё это сработало в GMail, MS Office Outlook, Mozilla Thunderbird и Safari Mail. Дольше всех сопротивлялись Outlook и Thunderbird -- последний сдался только тогда, когда я указал content-id для html части письма, а Outlook успокоился на content-type: multipart/related для всего письма. Самым добрым оказался GMail -- видимо, внутренний парсер там так колбасит сообщения, что ему не очень важен правильный формат, он так или и наче разберётся, что там пишут.</content>
  </entry>
</feed>
