C++ にて VMime を使って メールを送信する

VMime

VMimeは、電子メールを送受信するためのC ++クラスライブラリです。

主な機能
- IMAP、POP、SMTPに対応している
- フリーソフトウェア GNU GPLライセンス
- RFCに準拠した実装
- オブジェクト指向のモジュラー設計
- 十分に文書化されている

https://www.vmime.org/

使い方はこちらに
VMime Book: A Developer’s Guide To VMime
https://www.vmime.org/public/documentation/book/vmime-book.pdf

日本語訳はこちら
https://ken-ohwada.hatenadiary.org/entry/2020/12/31/121901

VMime のインストール

ソースコードをダウンロードしてビルドする。

VMime Bookに、構築とインストールについて掲載されている。

VMime Book VMimeの構築とインストール

必要なもの

 ソースファイルの取得

% git clone git://github.com/kisli/vmime

コンパイルとインストール

% cd vmime
% mkdir build
% cd build
% cmake .. -G "Unix Makefiles"
% cmake --build .
% sudo make install

brew doctor を実行すると、下記のワーニングが出る。

% brew doctor
Unexpected dylibs:
/usr/local/lib/libvmime.1.0.0.dylib

気になるのであれば、 ファイルの配置を変更する。

% bash setup.sh

vmime のプログラム例

vmime::messageBuilder を使って、メッセージを組み立てる。

下記は、VMime Book に掲載されている例

VMime Book メッセージの作成

vmime::messageBuilder mb;

// 題名
mb.setSubject(vmime::text(”Message subject”)); 

// 送信アドレス
mb.setExpeditor(vmime::mailbox(”me@vmime.org”)); 

// 受信アドレス
mb.getRecipients().appendAddress
(vmime::make shared <vmime::mailbox>(”you@vmime.org”));

// 本文
mb.getTextPart()−>setCharset(vmime::charsets::ISO8859 15); mb.getTextPart()−>setText(vmime::make shared <vmime::stringContentHandler>
(”This is the text of your message...”) );

// メッセージ構築
vmime::shared ptr<vmime::message>msg = mb.construct();

// メッセージデータを標準出力に出力します
vmime::utility::outputStreamAdapter out(std::cout);
msg−>genarate(out);

同封されているサンプルコード https://github.com/kisli/vmime/blob/master/examples/example1.cpp

メッサージを送信する

トランスポートサービス (mime::net::transport)を使って、メッサージを送信する。

下記は、VMime Book に掲載されている例

VMime Book トランスポートサービスの利用

// メッセージ
const vmime: : string msgData;

// SMTPサーバーのURL
vmime:: utility :: url url( smtp://example.com" );

// セッションを作成する
vmime::shared ptr <vmime::net::session> sess = vmime::net::session::create();

// トランスポートサービスを作成する
vmime::shared ptr <vmime::net::transport> tr = sess−>getTransport(url); 

// 接続する
tr−>connect();

// メッセージ
vmime:: utility ::inputStreamStringAdapter is(msgData);

// 送信アドレス
vmime::mailbox from("me@example.org"); 
vmime::mailboxList to;

// 受信アドレス
to.appendMailbox(vmime::make shared <vmime::mailbox>("you@example.org"));

// メッセージを送信する
tr->send(
/∗ expeditor ∗/ from,
/∗ recipient(s) ∗/ to,
/∗ data ∗/ is,
/∗ total length ∗/ msgData.length());

// 切断する
tr->disconnect();

同封されているサンプルコード https://github.com/kisli/vmime/blob/master/examples/example6.cpp

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