C++ にて VMime を使って 埋め込み画像付きのメールをファイルから読む

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 で見るとこうなる。

f:id:ken_ohwada:20210124105801p:plain
mail embed

全体のコードは、githubに公開した。
https://github.com/ohwada/MAC_cpp_Samples/tree/master/vmime/read