none
DoCoMoの携帯から送信されたメールの内容を表示する方法 RRS feed

  • 質問

  • こんにちは

    現在ImapXというツールを使ってGmailからメールを読み込むアプリを作っています。ただ、ためしにドコモのガラケーから送信したメール内容がデコードできずに困っています。

     

    コード

    ImapX.ImapClient client = new ImapX.ImapClient("imap.gmail.com", 993, true);
    bool result = false;
    
    result = client.Connection();
    if (result)
      Console.WriteLine("@Connected");
    
    result = client.LogIn("username", "password");
    if (result)
      Console.WriteLine("@Logged in");
          
    ImapX.MessageCollection messages = client.Folders["INBOX"].Search("UNSEEN", true); 
    
    foreach (ImapX.Message m in messages)
    {
      m.Process();
          
      // iso-2022-jpで
      var encoding = Encoding.GetEncoding("iso-2022-jp");
      var ret = encoding.GetString(encoding.GetBytes(m.TextBody.TextData));
    }

     

    上記のコードでGmailから送信したメールは正しくデコードできたのですが、iso-20220-jpの部分をドコモ用にshift_jisに変更して実行しても正しい結果が受け取れませんでした。

    色々と調べてみてhttp://d.hatena.ne.jp/machi_pon/20091217/1261050138こちらとかも参考にいじってみたのですが、予期した結果になりませんでしたのでどなたかご教示していただけると助かります。

     

    2011年2月17日 6:03

回答

すべての返信

  • ImapXのことはわかりませんが、最後の行の

    encoding.GetString(encoding.GetBytes(m.TextBody.TextData))
    この処理は何をしようとしているのでしょうか?

    2011年2月18日 8:14
  • m.TextBody.TextDataにエンコードされたテキストが入っているので、それをデコードしようとしています。

    encoding.GetBytes(m.TextBody.TextData)
    でiso-2022-jpのバイト配列になって、
    encoding.GetStringでiso-2022-jpのテキストを取得しています(と思っているのですが間違っていますかね?Encode周りは自信がないのでおかしかったら指摘していただけると助かります・・・)。

    Gmailから送信したメールはEncodeがiso-2022-jpでされているので、前述のコーディングでうまく動作するのですが、ドコモのケータイから送信したメール(Encodeはshift_jisとなっています)を、Shift_jisでデコードしても文字化けしたテキストしか取り出せません・・・。
    2011年2月18日 14:06
  • 自己解決しました。

    machi_ponさんにアドバイスをいただいたところ(http://d.hatena.ne.jp/machi_pon/20091217/1261050138#c)問題はImapXがデータを引っ張ってくるところですでにデコードに失敗しているのでは、という話だったのでImapXには見切りをつけて他のImapライブラリをいくつか試してみました。

    その中でも下記のLumisoftがかなり自由度も高く色々といじくれるのでこちらを使ったら正常にテキストが取得できました。

    http://www.lumisoft.ee/Forum/default.aspx

    http://www.lumisoft.ee/lsWWW/Download/Downloads/Net/

    • 回答としてマーク yokyo1 2011年2月19日 14:14
    2011年2月19日 14:14
  • もう別の解決をなさっているようですが、いちおうC#の問題として。

    m.TextBody.TextDataにエンコードされたテキストが入っていると言うことはありえません。string型である時点でそれはUnicodeの(デコード済みの)文字列データです。
    というわけで、ISO-2022-JPによってGetBytes→GetStringすると何が得られるかというと、ISO-2022-JP
    形式のバイト列に変換してからC#文字列に戻したもの、つまり「元の文字列からISO-2022-JPにない文字を'?'に変換した文字列」なんです。

    2011年2月21日 9:25