C++ にて VMime を使って 埋め込み画像付きのメールを作成する
の続きです。
埋め込み画像付きのメールの構造
下記のように、multipart の中に plain の本文とHTMLのパートと埋め込み画像がある。
Content-Type: multipart/alternative
Content-Type: text/plain
本文のデータContent-Type: multipart/related
Content-Type: text/html
HTML のデータContent-Type: image/jpg
Content-Id:
Content-Disposition: inline
Content-Transfer-Encoding: base64
埋め込み画像 のデータ
埋め込み画像は、画像としてファイルに保存する。 HTML のデータは、 埋め込み画像の参照を画像ファイルへの参照に置き換えて、HTMLとしてファイルに保存する。
メールメッセージから埋め込み画像を取得する
C++ にて VMime を使って 添付ファイル付きのメールをファイルから読む で紹介したように、vmime::bodyPart を使用する。
Content-Type が image で、
Content-Disposition が inline なら、埋め込み画像である。
multipartの中にmultipartがある入れ子構造です。 解析も入れ子構造にする。
for(i=0; i<cout1; i++){ // multipart/alternative の処理 for(j=0; j<cout2; j++){ // multipart/related の処理 } }
内側のforループは、下記のように記述する。
for(j=0; j<cout2; j++){ // multipart/related の処理 vmime::shared_ptr<vmime::bodyPart> part_j = part_body_i->getPartAt(j); vmime::shared_ptr< vmime::header > part_hdr = part->getHeader(); // Content-Type を取得する vmime::shared_ptr< const vmime::headerField > hdr_type = hdr->ContentType(); vmime::shared_ptr< const vmime::mediaType > media_type = hdr_type->getValue<vmime::mediaType>(); std::string type = media_type->getType(); std::string subtype = media_type->getSubType(); // Content-Disposition を取得する vmime::shared_ptr< const vmime::headerField > hdr_disposition = hdr->ContentDisposition(); vmime::shared_ptr< const vmime::contentDisposition > content_disposition = hdr_disposition->getValue<vmime::contentDisposition>(); std::string disposition = content_disposition->getName(); if ( ( disposition == "inline") && ( type == "text" )&& ( subtype == "html" ) ){ // HTMLの処理 // HTMLのデータを取得する } if ( ( disposition == "inline") && ( type == "image" ) ){ // 埋め込み画像の処理 // Content-Id を取得する // 埋め込み画像を画像としてファイルに保存する } } // HTMLのデータの処理 // 埋め込み画像への参照を画像ファイルへの参照に置き換える // HTMLとしてファイルに保存する。
保存したHTMLをブラウザアプリの Chrome で見るとこうなる。
全体のコードは、githubに公開した。
https://github.com/ohwada/MAC_cpp_Samples/tree/master/vmime/read