VC++2005 メール送信プログラムが正しく動かず困っています

[戻る]
Telfair 2009/04/23(木) 09:17:33
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」は
参考にしたソースが使用していた値のため根拠不明です。
(参考ソースではこれで正常に送信出来ています)

解決方法、ご存じありませんでしょうか??

wclrp ( 'o') 2009/04/23(木) 09:24:54
関連リンク
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1225461237

wclrp ( 'o') 2009/04/23(木) 09:28:27
参考にしたソースって?
俺は50221すら指定していないサンプルしか見つけてないけど。

Telfair 2009/04/23(木) 09:32:34
>wclrp ( 'o')さん
業務用アプリの一部なんです。
参考にしたソースは社内のソースなのでネット上には置いてないんです。

bun 2009/04/23(木) 11:13:55
試してみましたが、普通に文字化けせずに受信できましたよ。
お宅の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などで使われている。
-----------------------------------------

Telfair 2009/04/23(木) 11:50:30
>bunさん
わざわざ確認までしていただきありがとうございました。
コードページの指定を外して再確認してみましたが、
やはり件名なし&文字化けになってしまいます。。。
これからVCの設定なども見直してみます。

subaru 2009/04/23(木) 13:03:31
受信したメールが読めるかどうかはメールクライアントにもよるので
パケットモニターやメールクライアントの機能などを使って
ほんとにエンコードできているかどうかをまず確認した方がよさそうです。

SetSubjectとAddTextメソッドの方も引数にコードページの指定があるので
こっちも設定しないといけないのかもしれません。
#エンコードが正しくできたとしても
#CMimeMessage がちゃんとヘッダーを作ってくれるかどうか怪しいですが・・

aetos 2009/04/23(木) 14:39:51
CMimeMessage::SetSubject って使えるんですか?
メンバ一覧にないんですけど。
http://msdn.microsoft.com/ja-jp/library/xz2741yh.aspx

CMimeHeader::SetSubject ならありますね。
http://msdn.microsoft.com/ja-jp/library/sfh7tfsb.aspx

試してないので推測ですが、ひょっとして、過去のバージョンとの互換性のためにあるダ
ミーメソッドで、常に FALSE を返すように実装されていたりして?

aetos 2009/04/23(木) 14:41:01
ごめん、CMimeMessage は CMimeHeader を継承してますね。
投稿した後で「もしかして…!」って思ったけど遅かったです。恥ずかしい。

Telfair 2009/04/23(木) 17:36:36
[[解決]]
自己解決してしまいました、すみません。。。

CoInitialize()を呼び出していなかったのが原因でした。

---< 以下引用 >---------------------------------------------------------
CoInitialize() 関数は、CoCreateInstance() を呼び出す前に、1回だけ呼び出す必要が
あります。

COM を扱うようなプロジェクトの場合は CoInitialize() を呼び出すコードが自動的に用
意されるようですけど、Win32 コンソールに ATL をサポートさせたときには、自分で呼
び出す必要があるようです。
---< 引用元 >-----------------------------------------------------------
http://program.station.ez-net.jp/memorandum/VC/7/com-create.asp


みなさん、親身な回答ありがとうございました m(_ _)m

bun 2009/04/24(金) 09:02:30
あれ...

実は私もそれと同じようなことを思ったんですね。
で、AfxOleInit()の呼び出しをわざとやめてみたんですね。

すると、文字化けどころか、メール送信そのものができなく
なりました(正確には一般保護違反)。
なので、その線はないかと思っていたんですが、

中間的な状態が存在したんですね。
  ・メール送信 → 送信OK
  ・文字化け   → 起こる

なんにせよ、解決してよかったです(^-^)

古いスレッドには追加発言できません。