IdSMTPによるメールの本文文字化けについて

解決


sakura  2009-11-20 03:15:28  No: 36210

環境:Delphi2010, jconvert.pas 1.4

IdSMTPを使ってメール送信しようとしています。
メール件名は日本語で表示されるのですが、
本文は文字化け(?マークばかり)してしまいます。

調べて、jconvertを使ってみましたが、
結果は残念ながら同じで文字化けでした。

どうすれば文字化けせずに送れるのでしょうか?
どなたかアドバイスをお願い致します。

以下がコードです。
  IdSMTP1.AuthType  := satNone;
  IdSMTP1.Host      := 'xxx.xxx.ne.jp';
  IdSMTP1.Username  := 'xxx@xxx.xxx.ne.jp';
  IdSMTP1.Password  := 'xxxxxxx';
  IdSMTP1.Port      := 587;

  msg := TIdMessage.Create(IdSmtp1);
  try
    msg.Subject := 'メールタイトル';
    msg.Recipients.EMailAddresses := 'xxx@xxx.xxx.co.jp';
    msg.From.Text := 'xxx@xxx.xxx.ne.jp';
    msg.Body.Text := jconvert.ConvertJCode('メール本文', JIS_OUT);
    msg.ContentType := 'text/plain';

    IdSmtp1.Connect;
    IdSmtp1.Send(msg);
    IdSmtp1.Disconnect ;
    ShowMessage('送信完了しました。');
  finally
    msg.Free;
  end;


キホンは  2009-11-20 04:56:57  No: 36211

送信したい元の文字列の文字コードがナンであるかを確認すること。


Quest  2009-11-20 10:52:52  No: 36212

私もDelphi2010(Indy10)のメール送信で引っかかりましたが
jconvertを使わずに回避しました。
sakumaさんのコードに倣えば

msg.CharSet := 'ISO-2022-JP';
msg.Encodeing := meMIME;

を追加してみてはどうでしょう。
私はこれで、ShiftJIS文字列の文字化けを回避できました。
もっとも本文の設定方法が
msg.Body.LoadFromFile('ファイル名');
でしたけど。


sakura  2009-11-20 18:37:44  No: 36213

>キホンは さん
そ、そうですね・・・(^^;
確認方法がわからないので、また勉強します。
ありがとうございました。

>Quest さん
ありがとうございました。
この方法であっさり成功しました。
私の場合も実際は「msg.Body.Text := Memo1.Text;」です。

ところで、この方法、どうやって見つけられましたか?
何か教本などがあると良いのですが、Delphi2010の書籍は1冊も出ていないようですし・・・


Quest  2009-11-20 20:32:42  No: 36214

sakuraさん、こんにちは。
参考になったようで、よかったです。

見つけた方法ですが、やはり定番の「ググる」ですね。
Delphi、Indy、SMTPなどの関連キーワードで検索しまくり
CharSetとEncodingのプロパティがあることを見つけました。
(場所は確かfreemlだったと思います。すみません、肝心な部分がうろ覚えで)
で、とりあえず検索できた情報を総合して、「これでどうだ」とやってみたら
あっさり送信できたというわけで・・・。


sakura  2009-11-20 21:27:00  No: 36215

Questさん

そうでしたか。>ググる
私の方は「jconvert」を見つけて以降、
それを絡めてググってしまっていたため、全く行き着きませんでした。(^-^;

早く、2010対応のバイブル的な本が出て欲しいものです。
あと、大全極意本など・・・。

この度は大変助かりました。
ありがとうございました。


yamamoto  2009-11-23 21:08:03  No: 36216

ヘッダは次のように設定します。
msg.ContentType := 'text/plain';
msg.CharSet := 'ISO-2022-JP';
msg.ContentTransferEncoding := '7bit';

日本語の文字コードは自動的に変換されますが、波ダッシュ問題を回避するために「MECSUtils」のMecsMappingFix_UnicodeToJISX0208()関数を使用します。
msg.Subject := Mecsutils.MecsMappingFix_UnicodeToJISX0208(subject);

DelphiではなくC++Builderですが、次のページが参考になると思います。
C++Builder2010とIndy10でメールを送信する
http://www.gesource.jp/programming/bcb/97.html


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加