VMime Book 日本語訳 第6章 6-5

VMime Book 日本語訳 第6章 6-5
2020-07-01 K.OHWADA

原文
VMime Book: A Developer’s Guide To VMime
https://www.vmime.org/public/documentation/book/vmime-book.pdf

全体目次

第6章 メッセージングサービスの操作

ページ内 目次
6.5 ストアサービスの使用
6.5.1 ストアへの接続
6.5.2 フォルダを開く
6.5.3 メッセージの取得
6.5.4 メッセージとパーツの抽出
6.5.5 メッセージの削除
6.5.6 イベント

第6章 メッセージングサービスの操作

Working with Messaging Services

6.5 ストアサービスの使用

Using store service

6.5.1 ストアへの接続

Connecting to a store

ストアサービスを使用するための最初の基本的な手順は、ストアサービスに接続することです。 次の例は、セッションを初期化し、ストアサービスをインスタンス化する方法を示しています。

リスト6.5:ストアサービスへの接続
Listing 6.5: Connecting to a store service

// Create a new session
vmime:: utility :: url url( "imap://vincent:password@imap:example.org" ); 
vmime::shared_ptr <vmime::net::session> sess = vmime::net::session::create();
// Create an instance of the transport service
vmime::shared_ptr <vmime::net::store> store = sess−>getStore(url); 
// Connect it
store−>connect();

注: Example6には、カスタムオーセンティケーターをサポートする、ストアサービスに接続するためのより完全な例が含まれています。

6.5.2 フォルダを開く

Opening a folder

読み取り専用モード(メッセージのフラグと内容のみを読み取ることができる)または読み取り/書き込みモード(メッセージを読み取るだけでなく、メッセージを削除または新しいメッセージを追加することもできる)の2つの異なるアクセスモードを使用してフォルダーを開くことができます。 )。 フォルダへの参照がある場合は、目的のアクセスモードでopen()メソッドを呼び出すだけです。

folder->open(vmime::net::folder::MODE_READ_WRITE);

注: すべてのストアが読み取り/書き込みモードをサポートしているわけではありません。 デフォルトでは、読み取り/書き込みモードが使用できない場合、open()のfailIfModeIsNotAvailable引数がtrueに設定されていない限り、フォルダーはサイレントに読み取り専用モードにフォールバックします。

ストアでgetDefaultFolder()を呼び出して、デフォルトフォルダー(通常はINBOXフォルダー(メッセージが受信されたときにメッセージが到着する場所))への参照を取得します。 パスを指定して特定のフォルダを開くこともできます。 次の例では、ルートフォルダー内のfooの子であるbarという名前のフォルダーを開きます。

リスト6.6:パスからフォルダーを開く
Opening a folder from its path

vmime::net::folder::path path;
path /= vmime::net::folder::path::component(”foo”); path /= vmime::net::folder::path::component(”bar”);
vmime::shared ptr <vmime::net::folder> fld = store−>getFolder(path); f l d −> o p e n ( v m i m e : : n e t : : f o l d e r : : M O D E R E A D W R I T E ) ;

注: 区切り文字を使用する方法がないため、パスを文字列として指定できます パスコンポーネントを区切ります。 常にoperator / =またはappendComponentを使用してください。

注: パスコンポーネントのタイプはvmime :: wordです。 これは、VMimeが7ビットのUS-ASCIIだけでなく、拡張文字を含むフォルダー名をサポートすることを意味します。 ただし、これは基盤となるストアプロトコルでサポートされていない可能性があることに注意してください(IMAPは内部で変更されたUTF-7エンコーディングを使用するためサポートしています)。

6.5.3 メッセージの取得

Fetching messages

メッセージ全体をダウンロードしなくても、メッセージに関する情報を取得できます。 さらに、フォルダは、パフォーマンスを向上させるために、1回のリクエストで複数のメッセージのフェッチをサポートします。現在、次のアイテムをフェッチできます。

  • エンベロープ (envelope): 送信者、受信者、日付、件名。 •構造 (structure): メッセージenvelope)のMIME構造。

  • content-info: ルート部分のcontent-type。

  • フラグ (flags): メッセージフラグ。

  • サイズ (size): メッセージサイズ。

  • header: メッセージのすべてのヘッダーフィールドを取得します。

  • uid: メッセージの一意の識別子。

  • 重要性 (importance): misc :: importanceHelperでの使用に適したヘッダーフィールドをフェッチします。

注: すべてのサービスがすべてのフェッチ可能なアイテムをサポートしているわけではありません。 フォルダーでgetFetchCapabilities()を呼び出して、サービスがフェッチできる情報を確認します。

次のコードは、フォルダ内のすべてのメッセージを一覧表示し、基本的な情報を取得してユーザーに表示する方法を示しています。

リスト6.7:複数のメッセージに関する情報の取得
Fetching information about multiple messages

std::vector <ref <vmime: : net::message> > allMessages = folder->getMessages(vmime::net::messageSet::byNumber(1, −1));
// −1 is a special value to mean ”the number of the last message in the folder”
folder−>fetchMessages(allMessages , vmime::net::fetchAttributes::FLAGS | vmime::net::fetchAttributes::ENVELOPE);
for (unsigned int i = 0 ; i < allMessages.size() ; ++i) {
    vmime::sharedptr<vmime::net::messag> msg = allMessages[i];
    const int flags=msg->getFlags();
    std::cout << "Message " << i << " : " << std::endl;
    if (flags & vmime::net::message::FLAGSEEN) 
    std::cout << ” − is read” << std::endl;
    if (flags & vmime::net::message::FLAGDELETED) 
    std::cout << ” − is deleted” << std::endl;
    vmime::shared ptr <const vmime::header> hdr = msg−>getHeader();
    std::cout << "  − sent on " << hdr−>Date()−>generate() << std::endl;
    std::cout << " − sent by " << hdr−>From()−>generate() << std::endl; 
}

IMAPは、メッセージの特定のヘッダーフィールドのフェッチをサポートしています。使用方法は次のとおりです それを行うためのfetchAttributesオブジェクト:

リスト6.8:fetchAttributesオブジェクトを使用してメッセージの特定のヘッダーフィールドをフェッチする
Using fetchAttributes object to fetch specific header fields of a message

// Fetch message flags and the ”Received” and ”X−Mailer” header fields vmime::net::fetchAttributes fetchAttribs;
fetchAttribs.add(vmime::net::fetchAttributes::FLAGS); fetchAttribs.add(”Received”); fetchAttribs.add(”X−Mailer”);
folder−>fetchMessages(allMessages, fetchAttribs);

6.5.4 メッセージとパーツの抽出

Extracting messages and parts

メッセージの内容全体(ヘッダーを含む)を抽出するには、vmime :: net :: messageオブジェクトでextract()メソッドを使用します。次の例では、デフォルトフォルダの最初のメッセージを抽出します。

リスト6.9:メッセージの抽出
Extracting messages

// Get a reference to the folder and to its first message
vmime::shared_ptr <vmime::net::folder> folder = store−>getDefaultFolder(); 
vmime::shared_ptr <vmime::net::message> msg = folder−>getMessage(1);
// Write the message contents to the standard output
vmime::utility::outputStreamAdapter out(std::cout); msg−>extract(out);

一部のプロトコルIMAPなど)は、メッセージ全体をダウンロードせずに、メッセージの特定のMIME部分の抽出もサポートします。 これにより、帯域幅と時間を節約できます。 この場合、メソッドextractPart()が使用されます。

リスト6.10:メッセージの特定のMIME部分の抽出
Extracting a specific MIME part of a message

// Fetching structure is required before extracting a part
folder−>fetchMessage(msg, vmime::net::fetchAttributes::STRUCTURE); // Now, we can extract the part
m s g−> e x t r a c t P a r t ( m s g−> g e t S t r u c t u r e ( ) − > g e t P a r t A t ( 0 ) − > g e t P a r t A t ( 1 ) ) ;

次の構造のメッセージがあるとします

multipart/mixed text/html image/jpeg [*]

前の例では、image / jpegパーツのヘッダーと本文を抽出します。

6.5.5 メッセージの削除

Deleting messages

次の例では、2番目と3番目のメッセージをストアから削除します。

リスト6.11:メッセージの削除
Deleting messages

vmime::shared ptr <vmime::net::folder> folder = store−>getDefaultFolder();
folder−>deleteMessages(vmime::net::messageSet::byNumber(/∗ from ∗/ 2, /∗ to ∗/ 3));

// This is equivalent
std::vector <int> nums; nums.push back(2); nums.push back(3);
folder−>deleteMessages(vmime::net::messageSet::byNumber(nums));
// This is also equivalent (but will require 2 roundtrips to server)
folder−>deleteMessages(vmime::net::messageSet::byNumber(2)); folder−>deleteMessages(vmime::net::messageSet::byNumber(2)); // renumbered, 3 becomes 2

6.5.6 イベント

Events

何らかの操作を実行した結果(または操作が実行されていない場合でも時々)、ストアサービスはイベントを送信して、何かが変更されたこと(フォルダー内のメッセージの数など)を通知できます。 これらのイベントにより、メッセージストアに関連付けられているユーザーインターフェイスを更新できる場合があります。

現在、イベントには3つのタイプがあります。

  • メッセージの変更 (message change): フォルダ内のメッセージの数が変更された(つまり、一部のメッセージが追加または削除された)ときに送信されます。

-メッセージ数の変更 (message count change): 1つ以上のメッセージが変更されたときに送信されます(フラグや削除されたステータスなど)。

  • フォルダーの変更 (folder change): フォルダーが作成、名前変更、または削除されたときに送信されます。

フォルダーオブジェクトの対応するメソッドaddMessageChangedListener()、addMessageCountListener()、またはaddFolderListener()を使用して、各イベントタイプのリスナーを登録できます。 詳細については、vmime :: net :: events名前空間のクラスドキュメントをお読みください。