HTMLメールに画像を埋め込んで、sendmailで送信する

HTMLに画像を埋め込む時はimgタグにBase64エンコードした画像を書くだけ。

<img border="0" src="data:image/png;base64,(Base64 Image)" />

しかし、HTMLメールをRubyで自動生成し、同じ方法で画像を埋めこもうとしたら上手くいかなかった。

メール送信に使っているsendmailに1行あたりの文字数制限があったらしく、画像の途中で勝手に改行が入ってしまっていたのが原因だったようだ。

とはいえ改行付きのBase64をimgタグに挿入することも出来ず、仕方なしに方法を探していたところ、以下のページを見つけた。

stackoverflow.com

どうもContent-Type: multipart/related;指定で本文と画像を別個に記述できるらしい。

色々試したところ、下のような感じでメールに画像を埋め込むことができた。

To: foo@bar.com
Subject: Test
Mime-Version: 1.0
Content-Type: multipart/related; boundary="boundary-test"; type="text/html"

--boundary-test
Content-Type: text/html;

(メール本文)
(画像はContent-IDで指定した名前を``cid:``の後に続けて入力する)
(例: <img src="cid:test.png" />)

--boundary-test
Content-Type: image/png; name="test.png"
Content-Disposition: inline; filename="test.png"
Content-Transfer-Encoding: base64
Content-ID: <test.png>
Content-Location: test.png

(Base64エンコードされた画像)

--boundary-test--

これをsendmailしてあげた所上手くいってくれた。

cat test | /usr/lib/sendmail -t

参考情報

Content-Type: image/png;はじまりのboundaryをいくつか作れば、画像を複数埋め込むこともできる。

(--boundary-test--はboundaryの終端のため、1度しか現れないことに注意)