ブログビューワーのリリースを行おうかとおもっとりましたが、その間にADPもアップデートがあったのと、その中で、久しぶりにC++/STLネタができたので、今回はC++/STLネタを披露いたします。
ちなみに、このブログで一番アクセス数が多い記事は、C++/STLでCSVファイルの読み込みで、一時期、自作機向けWindows7のKernel-Power 41病対策のアクセス数が首位に躍り出たのですが、再びCSVが首位に返り咲きました。『おまえらどれだけCSVやねん』と突っ込みたくなるのですが、次の刺客ということで、日本語メール送信を送り込みます。
コードは長くなるので呼び出し部分のみ以下に示します。全ソースのダウンロードは、プラットホーム別に以下のとおりです(ソースの内容自体は同じでプラットフォームに合わせて日本語のエンコードを変えています)。
Windows版(Shift_JIS)
Linux版(utf-8)
int main(void)
{
#ifdef _WIN32
WSADATA wsaData;
WSAStartup( 0x0101, &wsaData);
string charset = "Shift_JIS ";
#else
string charset = "utf-8";
#endif
string smtpserver("mail");
string to("to_address@example.com");
string cc("");
string bcc("");
string from("from_address@example.com");
string subject("サブジェクト");
string text("メール本文");
cout << subject << ":" << text << endl;
if ( !sendmail( smtpserver, to, cc, bcc, from, subject, text, charset) ) {
cout << "Error Send Mail.";
return 1;
}
#ifdef _WIN32
WSACleanup();
#endif
return 0;
}
各パラメータに値をセットして、sendmail関数を呼び出します。あて先(to,cc等)が複数ある場合はコンマ , で区切ります。サブジェクト(件名)とメールの本文のみ日本語OKです。使用している文字コードをcharsetで指定します。
例では、WindowsがShift_JISで、それ以外がutf-8になっていますが、Windowsでutf-8を使うことも可能です。
(もちろんメールの件名や本文で使用する文字コードをutf-8にする必要があります)。
日本語の取り扱いについてですが、昔、日本語メールと言えば、JISコードに変換して送るという風にやっておったのですが、最近のメーラは適切に処理をすれば(文字コードを指定し、base64等で適切にエンコードする)文字コードを変換する必要がなくそのまま送信できるようです。このプログラムもそのまま送信しています。
ちなみに、このプログラムにはbase64のエンコード・デコードも入っています。詳しくはソースをご覧ください。
コンパイルに際して注意があります。char をunsigned charとしてコンパイルする必要があります。
gccでは、
g++ -funsigned-char sendmail.cppのように -funsigned-char オプションを使用してコンパイルします。
Visual Studio 2008の場合は、プロジェクトのプロパティ→構成プロパティ→C/C++→言語→char型を規定でunsigned を はい にします(または/Jオプションを指定します)。
このプログラムは、以下の環境で動作確認しました。
Linux:Centos 5.5
Windows: Visual Studio 2008 professional / Windows 7 ulitimate 64bit (32ビットモードでコンパイル)
2015-02-10 09:39:54
Visual Studio 2013でビルダして、実行するとエラーになります。sendmailルーチンの中の「if ( tcp_connect( sofd, smtpserver.c_str(), 587) != 0 ) return false;」に変更し、「if ( !smtp_send_command( sofd, "MAIL FROM:", from, 250) ) goto error_out;」でエラーになります。fromは、「string from("ruu_honguu@yahoo.co.jp");」で指定しています。サーバは「string smtpserver("smtp.mail.yahoo.co.jp");」です。解決方法があれば、教えてください。