C++/STLで日本語メール送信(base64)

地震でここしばらくブログの更新を自粛しておりましたが、自分でできることをやるのが一番ということで、ブログの更新を再開します。
 
ブログビューワーのリリースを行おうかとおもっとりましたが、その間に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ビットモードでコンパイル)
2011-03-29 | コメント:2件
本宮裕二より
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");」です。解決方法があれば、教えてください。
ohfujiより
2015-02-11 10:32:50
エラーの箇所を鑑みますと、当該のfromのメールアドレスがサーバーから拒否されているようです。
おそらくですが、メールサーバーが踏み台に利用されるのを防ぐための措置の結果エラーになっているようです。

解決方法ですが、外部組織へメールを送信する場合は自組織のネットワークのsmtpサーバーに対して行います。
不正リレー中継、第三者中継等のキーワードで検索して勉強してみてください。

コメントをどうぞ


『不適切なコメントへの対応』を一読下さい。
現在コメントは承認制となっております。

Previous Page | Next Page