VC++2005 メール送信プログラムが正しく動かず困っています。。。
開発環境:Windows XP sp3 / Visual C++ 2005
以下のソースでメール送信を行うと、送信は出来るのですが
受信したメッセージが 「件名なし&本文文字化け」 となってしまいます。
(※変数の型や格納値には問題ないことを確認済みです)
//--------------------------------------------(抜粋ここから)
CMimeMessage msg;
BOOL bSetSbj;
BOOL bAddTxt;
msg.AddRecipient( szToAddr, NULL, 50221 );
msg.SetSender( szFromAddr );
bSetSbj = msg.SetSubject( szSubject );
bAddTxt = msg.AddText( szBodyMessage );
CSmtpConnection con;
con.Connect( szSmtpSvr );
con.SendMessage( msg );
//--------------------------------------------(抜粋ここまで)
bSetSbj には FALSE(0)が返ってきます。。。
なぜうまくいかないのか不明です。
bAddTxt にはTRUE(1)が返ってきますが、受信メールは文字化け状態です。
(ソースのほかの箇所で文字コードの設定等していません)
なお、コードページ番号として使用している「50221」は
参考にしたソースが使用していた値のため根拠不明です。
(参考ソースではこれで正常に送信出来ています)
解決方法、ご存じありませんでしょうか??
参考にしたソースって?
俺は50221すら指定していないサンプルしか見つけてないけど。
>wclrp ( 'o')さん
業務用アプリの一部なんです。
参考にしたソースは社内のソースなのでネット上には置いてないんです。
試してみましたが、普通に文字化けせずに受信できましたよ。
お宅のSMTP/POP3サーバがコードページ50221に対応してないのでは?
コードページの指定やめてみたら?
コードページ50221はWindowsフォーマットのようなので、
LinuxなどWindows以外のメールサーバだと駄目かもという話ね。
ちなみに、コードページ50221の解説です。
-----------------------------------------
[コードページ 50221]
Microsoft Windowsで使われている、ISO-2022-JPの亜種の一つ。
ISO-2022-JPに対し、CP932全文字(重複を除くWindows-31Jの文字)が扱えるよう拡張をし
た符号である。
Microsoft Outlook Express、Internet Explorerなどで使われている。
-----------------------------------------
>bunさん
わざわざ確認までしていただきありがとうございました。
コードページの指定を外して再確認してみましたが、
やはり件名なし&文字化けになってしまいます。。。
これからVCの設定なども見直してみます。
受信したメールが読めるかどうかはメールクライアントにもよるので
パケットモニターやメールクライアントの機能などを使って
ほんとにエンコードできているかどうかをまず確認した方がよさそうです。
SetSubjectとAddTextメソッドの方も引数にコードページの指定があるので
こっちも設定しないといけないのかもしれません。
#エンコードが正しくできたとしても
#CMimeMessage がちゃんとヘッダーを作ってくれるかどうか怪しいですが・・
CMimeMessage::SetSubject って使えるんですか?
メンバ一覧にないんですけど。
http://msdn.microsoft.com/ja-jp/library/xz2741yh.aspx
CMimeHeader::SetSubject ならありますね。
http://msdn.microsoft.com/ja-jp/library/sfh7tfsb.aspx
試してないので推測ですが、ひょっとして、過去のバージョンとの互換性のためにあるダ
ミーメソッドで、常に FALSE を返すように実装されていたりして?
ごめん、CMimeMessage は CMimeHeader を継承してますね。
投稿した後で「もしかして…!」って思ったけど遅かったです。恥ずかしい。
自己解決してしまいました、すみません。。。
CoInitialize()を呼び出していなかったのが原因でした。
---< 以下引用 >---------------------------------------------------------
CoInitialize() 関数は、CoCreateInstance() を呼び出す前に、1回だけ呼び出す必要が
あります。
COM を扱うようなプロジェクトの場合は CoInitialize() を呼び出すコードが自動的に用
意されるようですけど、Win32 コンソールに ATL をサポートさせたときには、自分で呼
び出す必要があるようです。
---< 引用元 >-----------------------------------------------------------
http://program.station.ez-net.jp/memorandum/VC/7/com-create.asp
みなさん、親身な回答ありがとうございました m(_ _)m
あれ...
実は私もそれと同じようなことを思ったんですね。
で、AfxOleInit()の呼び出しをわざとやめてみたんですね。
すると、文字化けどころか、メール送信そのものができなく
なりました(正確には一般保護違反)。
なので、その線はないかと思っていたんですが、
中間的な状態が存在したんですね。
・メール送信 → 送信OK
・文字化け → 起こる
なんにせよ、解決してよかったです(^-^)