RECOMMEND
C# 言語リファレンス Black Book
C# 言語リファレンス Black Book (JUGEMレビュー »)
ビル ワグナー, Bill Wagner, スリーエーシステムズ, アクロバイト
RECOMMEND
RECOMMEND
SELECTED ENTRIES
CATEGORIES
ARCHIVES
MOBILE
qrcode
LINKS
PROFILE
OTHERS

12
--
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
--
>>
<<
--

メール

主に、メール送受信ライブラリを紹介します。各種ソフトウェア、PHPコンテンツ制作、SEO対策もお任せください。
絵文字付のメールを作成する
0

    ExwarpMailKit1.0.438.*以降のライブラリ+Exwarp.Module.EmojiModuleを利用すると、絵文字を簡単に作成することができます。


    最新版をダウンロードしてください。


    [C#]
    Exwarp.Net.RFC.MIME.MIMETransform.RawEncoding = true; //(0)

    Exwarp.Net.Mail.MailMessage mail = new Exwarp.Net.Mail.MailMessage(System.Text.Encoding.ASCII); //(1)

    Exwarp.Module.ModuleLoader ml = new Exwarp.Module.ModuleLoader(mail); //(2)
    ml.LoadModule("Exwarp.Module.EmojiModule.dll"); //(3)

    mail.To = "mail_to@docomo.ne.jp"; //(4)
    mail.From = "mail_from@myhost.com";

    mail.RunCommand("Emoji_SetSubject","<emoji:1>絵文字メール"); //(5)
    mail.RunCommand("Emoji_SetBody","<emoji:100>絵文字本文"); //(6)

    Exwarp.Net.Smtp.SmtpClient client = new Exwarp.Net.Smtp.SmtpClient("HOST_NAME");
    if(client.Connect())
    {
      client.SendReceive(mail);
      client.Close();
    }

    [VB.NET]
    Exwarp.Net.RFC.MIME.MIMETransform.RawEncoding = True '(0)

    Dim mail As New Exwarp.Net.Mail.MailMessage(System.Text.Encoding.ASCII) '(1)

    Dim ml As New Exwarp.Module.ModuleLoader(mail) '(2)
    ml.LoadModule("Exwarp.Module.EmojiModule.dll") '(3)

    mail.To = "mail_to@docomo.ne.jp" '(4)
    mail.From = "mail_from@myhost.com"

    mail.RunCommand("Emoji_SetSubject","<emoji:1>絵文字メール") '(5)
    mail.RunCommand("Emoji_SetBody","<emoji:100>絵文字本文") '(6)
    Dim client As New Exwarp.Net.Smtp.SmtpClient("HOST_NAME")
    If client.Connect() Then
      client.SendReceive(mail)
      client.Close()
    End If

    [解説]
    (0)Exwarp.Net.RFC.MIME.MIMETransformのRawEncodingプロパティにTrueをセットします。
    これは、1.0.438より前のバージョンでau携帯への絵文字付の件名が表示されないバグに対処するために必要です。

    (1)Exwarp.Net.Mail.MailMessageのインスタンスを作成します。このときのエンコーディングは何でもOKです。

    (2)Exwarp.Module.ModuleLoaderのインスタンスを作成します。このときパラメータにモジュールを追加したいMailMessageインスタンスを渡します。

    (3)LoadModuleメソッドを呼び出して、モジュールをロードします。
    モジュールdllへのパスを表す文字列をセットします。実行ファイルと同じディレクトリにコピーしておくとファイル名だけで済むのでお勧めです。(別にモジュールの位置はどこでも構いません。参照を追加しておく必要もありません。)

    (4)必ず最初にMailMessageToプロパティをセットしておきます。この値を元に絵文字データが変換されます。

    (5)モジュールをロードするとEmoji_SetSubjectカスタムオペレーションが実行できるようになります。通常の文字列の任意の場所に<emoji:***>と記述すると内部でバイナリに自動変換します。(***の部分はdocomoの絵文字番号を入力します。)

    (6)(5)と同じ要領でEmoji_SetBodyカスタムオペレーションを実行します。絵文字の挿入方法は同じです。

    あとは通常のメール送信を行います。特別な操作は必要ありません。


    追加事項

    Emoji_SetSubjectおよびEmoji_SetBodyカスタムオペレーションに2番目の引数をセットすることができます。これは任意の絵文字変換テーブルファイルへのパスを表す文字列です。
    mail.RunCommand("Emoji_SetBody","<emoji:1>","MyEmojiTable.txt")

    上の様に記述すると、デフォルトの変換テーブルではなく、自由にカスタマイズした変換テーブルを使って絵文字の変換が行われます。
    デフォルトの変換テーブルは、こちらからダウンロードできます。
    絵文字コードは必ず半角大文字の英数4桁タブ区切りで記述します。
    docomo,softbankは必ずShift-JISバイナリ用コード、auはEメール送出用JISコードに対応したShift-JISコードを記述します。
    176以上の番号を設定することも可能ですが、上限は999です。


    注意事項

    メールの宛先はひとつに限定するか、同じキャリアのメールアドレスを設定してください。
    絵文字によっては表示されないものがあります。これはdocomoの絵文字番号を元にほかのキャリアの絵文字の中からよく似た絵文字に変換しているためで、該当する絵文字が存在しない番号は欠番となります。
    | technicals | 17:34 | - | - | - | - |
    【質問】送信時間を指定するにはどうすればよいですか?
    0
      送信時間を指定するには、Exwarp.Net.Mail.MailMessageクラスのDateプロパティに日付情報を文字列で設定します。
      [C#]
      mail.Date = "9 Sep 2008 17:00:00 +0900";

      [VB.Net]
      mail.Date = "9 Sep 2008 17:00:00 +0900"

      [解説]
      mailはExwarp.Net.Mail.MailMessageのインスタンスをあらわします。設定値はRFC 1123準拠の文字列型である必要があります。
      +0900でタイムゾーンを設定しない場合GMT(世界標準時)で解釈される場合があります。
      | technicals | 18:56 | - | - | - | - |
      Exwarp MailKit 1.0.406.*リリースのお知らせ
      0
        ExwarpMailKit1.0.406.*をリリースいたしました。
        主な変更点は次のとおりです。
        ■Exwarp.Net.RFC.MIME.MIMETransform.SafeModeプロパティ(STATICプロパティ)を追加しました。これは一部のSMTPサーバーがメールのリレー時に?=の後ろに強制的にホワイトスペースを追加する仕様に対処するために使用します。上記プロパティをTrueに設定した場合、ASCII文字列も強制的にMIMEエンコードして?= =?が出現しなくなります。
        ■Exwarp.Net.Mail.MailOperations.GetAttachmentsOperationクラスの仕様を一部修正いたしました。
        これは一部のメールエージェントが本文なしのメールを送信してきた場合でも添付ファイルの取得を可能にするためです。本仕様変更により、Content-Typeがmultipart/mixedであり、サブコンテンツにtext/*が含まれない場合でもGetAttachmentsカスタムオペレーションで添付ファイルを取得できるようになります。
        | information | 16:40 | - | - | - | - |
        Exwarp MailKit 1.0 Beta1 rc2(バージョン1.0.307.1)公開のお知らせ
        0

          SMTP-AUTHRFC2231などに対応したExwarp MailKit 1.0 Beta1 rc2を公開しました。

          以前のバージョンとの大きな違いは次のとおりです。

          • SMTP-AUTHに対応(PLAIN、LOGIN、CRAM-MD5に対応)
          • HMACMD5Transformクラスの追加
          • ByteBufferクラスのストリーム対応
          • RFC2231形式のヘッダーフィールドパラメータに対応(RFC2231形式での書き出しには非対応)
          • メール本文でBare LF/Bare CR(LF及びCR単体での使用)をCR/LFに自動変換機能の追加
          • text/htmlメディアタイプのcharsetパラメータ自動付加を抑止
          • Exwarp.Net.Mail.MailContext.MyMailAddressプロパティをExwarp.Net.Mail.MailContext.SenderAddressに変更(互換性維持のため、Obsoleteとなります。)
          • Exwarp.Net.Mail.MailContext.GetMyAddress()メソッドをExwarp.Net.Mail.MailContext.GetSenderAddress()に変更(互換性維持のため、Obsoleteとなります。)
          • その他の微細な仕様変更を追加

          本バージョンの公開は短期間で終了いたします。その後製品版の公開となり、無料バージョンは機能制限のついたトライアル版へ移行いたします。

          | information | 17:57 | comments(1938) | trackbacks(0) | - | - |
          メールのMessage-Idをカスタマイズする
          0

            メールのメッセージID(Message-Id)は自由なカスタマイズ可能です。
            デフォルトでは、日時+ランダムな16進数にメールアドレス(コンピューター名)を連結した文字列となりますが、Exwarp.Net.Mail.MailContextMessageIdGeneratorプロパティに任意のExwarp.Net.RFC.MIME.MIMEContext.IStringGeneratorをセットすることで任意のメッセージIDを生成できます。

            [C#]
            public class CustomMsgIdGenerator:
              Exwarp.Net.RFC.MIME.MIMEContext.IStringGenerator
            {
              public string Create(object seed)
              {
                return "<1234567890@myhost.com>";
              }
            }
            解説

            Exwarp.Net.RFC.MIME.MIMEContext.IStringGeneratorインターフェースを実装した新しいクラスを定義します。IStringGeneratorインターフェースには、Create()メソッドが定義されています。このメソッドに任意の文字列を返すよう記述することで、メッセージIDをカスタマイズできます。(パラメータseedは使用しません。)

            上記のように定数を記述すると、常に同じ値のメッセージIDが生成されるため、望ましくありません。実際は常に一意な値が生成されるように実装してください。

            このクラスをExwarp.Net.Mail.MailContextMessageIdGeneratorプロパティにセットします。

            [C#]
            Exwarp.Net.Mail.MailContext.GetContext().MessageIdGenerator = new CustomMsgIdGenerator();
            | technicals | 15:01 | comments(2335) | trackbacks(0) | - | - |
            ByteBufferのストリーム対応、及びRFC2231対応のお知らせ
            0

              Exwarp MailKitの機能を増強しました。時期バージョンにて使用できる機能は以下のとおりです。

              Exwarp.ByteBufferのストリームサポートExwarp.ByteBufferは、内部的にバイト配列を使用していましたが,次期バージョンから任意のSystem.IO.Streamを内部バッファとして使用することができます。
              これはサイズの大きなメッセージのメモリ消費対策の一環です。今後さらに対策強化してゆきます。

              Exwarp.Net.RFC.MIME.MIMEHeaderFieldのRFC2231対応これまでのバージョンのMIMEHeaderFieldRFC2311に対応していませんでしたが,次期バージョンから対応します。例えば次のようなヘッダーフィールドを認識できます。

              Content-Disposition: inline; filename*0*=iso-2022-jp''Read%20;
               filename*1*=My%20Text
              上記のフィールドはmsg.GetHeaderFieldParameterBody("Content-Disposition","filename")で戻り値"Read My Text"を取得できます。
              RFC2231形式での出力については現在非対応です。

              これらの機能は1.0.300.2より後のバージョンで提供されます。

              | information | 13:48 | comments(1985) | trackbacks(0) | - | - |
              MIMEデコードを実行する
              0

                MIMEエンコードされた文字列を元の文字列に戻すには、MIMETransformDecode()メソッドを使用します。今回はMIMEエンコードを実行するでMIMEエンコードした文字列をデコードしてみます。

                [C#]
                string encoded = "=?iso-2022-jp?B?GyRCJDMkTko4O3pOcyRyGyhC?= MIME =?iso-2022-jp?B?GyRCJSglcyUzITwlSSQ3JF4kOSEjGyhC?=";
                System.Text.Encoding enc = System.Text.Encoding.GetEncoding("iso-2022-jp");

                Exwarp.Net.RFC.MIME.MIMETransform trans = new Exwarp.Net.RFC.MIME.MIMETransform(enc);
                byte[] decoded = trans.Decode(System.Text.Encoding.ASCII.GetBytes(encoded));
                [VB.Net]
                Dim encoded As String = "=?iso-2022-jp?B?GyRCJDMkTko4O3pOcyRyGyhC?= MIME =?iso-2022-jp?B?GyRCJSglcyUzITwlSSQ3JF4kOSEjGyhC?="
                Dim enc As System.Text.Encoding = System.Text.Encoding.GetEncoding("iso-2022-jp")

                Dim trans As New Exwarp.Net.RFC.MIME.MIMETransform(enc)
                Dim decoded() As Byte = trans.Decode(System.Text.Encoding.ASCII.GetBytes(encoded))
                解説

                MIMEデコードを実行するために、MIMETransformのインスタンスを生成します。コンストラクタは、MIMEエンコードに適用される文字セットを表すSystem.Text.Encodingを受け取ります。デコードの場合、デコード時に対象バイト列から自動的に文字セットが取得されますので、どんな文字セットで初期化しても構いません。一般的にはiso-2022-jpが使用されます。

                MIMETransformDecode()メソッドを使用して、デコードを実行します。パラメータにデコード対象のバイト列を設定します。System.Text.Encoding.ASCII.GetBytes()メソッドを使用するとMIMEエンコードされた文字列を簡単にバイト列に変換できます。Decode()メソッドはMIMEデコードされたバイト列を返します。

                Decode()メソッドを実行すると、MIMETransformEncodingプロパティは、デコード時に取得した、文字セットを表すSystem.Text.Encodingを返すようになります。同様にMIMEEncodingプロパティは、デコード時に解析した、MIMEエンコーディングの種類を表すExwarp.Net.RFC.MIME.MIMEEncodingを返します。

                上のコードの後に次のように記述すると、デコードされた内容を確認できます。sには、"この文字列をMIMEエンコードします。"という文字列が代入されます。

                [C#]
                string s = trans.Encoding.GetString(decoded);
                [VB.Net]
                Dim s As String = trans.Encoding.GetString(encoded)
                | technicals | 14:12 | comments(2042) | trackbacks(0) | - | - |
                1行の文字数を設定してMIMEエンコードを実行する
                0

                  この記事を読む前にこちらを参照してください。

                  MIMEエンコードの際に1行の文字数を設定したいこともよくあります。例えばメールメッセージは1行が78文字を超えないことが推奨されています。Exwarpはこうした処理もとても簡単に実現します。

                  [C#]
                  System.Text.Encoding enc = System.Text.Encoding.GetEncoding("iso-2022-jp");
                  Exwarp.Net.RFC.MIME.MIMETransform trans = new Exwarp.Net.RFC.MIME.MIMETransform(enc);
                  byte[] encoded = trans.Encode(enc.GetBytes("このMOJIをMIMEEncodeします。"),50);
                  [VB.Net]
                  Dim enc As System.Text.Encoding = System.Text.Encoding.GetEncoding("iso-2022-jp")
                  Dim trans As New Exwarp.Net.RFC.MIME.MIMETransform(enc)
                  Dim encoded() As Byte = trans.Encode(enc.GetBytes("このMOJIをMIMEEncodeします。"),50)
                  解説

                  MIMETransformについての解説はこちらを参照してください。

                  MIMETransformEncode()メソッドの2番目のパラメータに1行の文字数を設定します。今回は、50に設定しています。

                  上のコードを実行するとencodedには下のようなバイト列が代入されます。設定された文字数を超えないように自動的にフォールディング処理(RFC準拠の改行処理)されます。

                  =?iso-2022-jp?B?GyRCJDMkThsoQg==?= MOJI
                   =?iso-2022-jp?B?GyRCJHIbKEI=?= MIMEEncode
                   =?iso-2022-jp?B?GyRCJDckXiQ5ISMbKEI=?=
                  | technicals | 16:14 | comments(1903) | trackbacks(0) | - | - |
                  MIMEエンコードを実行する
                  0

                    RFC/822では、非ASCII文字をメールに含めることができませんでしたが,MIMEが規定されることにより、非ASCII文字をASCII文字に変換してメールに含めることができるようになりました。MIMEエンコードは煩雑な処理ですが,Exwarpを使用するととても簡単に実装できます。

                    [C#]
                    System.Text.Encoding enc = System.Text.Encoding.GetEncoding("iso-2022-jp");
                    Exwarp.Net.RFC.MIME.MIMETransform trans =
                        new Exwarp.Net.RFC.MIME.MIMETransform(enc);
                    byte[] encoded = trans.Encode(enc.GetBytes("この文字列をMIMEエンコードします。"));
                    [VB.Net]
                    Dim enc As System.Text.Encoding = System.Text.Encoding.GetEncoding("iso-2022-jp")
                    Dim trans As New Exwarp.Net.RFC.MIME.MIMETransform(enc)
                    Dim encoded() As Byte = trans.Encode(enc.GetBytes("この文字列をエンコードします。"))
                    解説

                    MIMEエンコードを実行するために、Exwarp.Net.RFC.MIME.MIMETransformのインスタンスを作成します。コンストラクタはMIMEエンコードに適用される文字セットを表すSystem.Text.Encodingを受け取ります。通常iso-2022-jpが使用されます。

                    Encode()メソッドを使用して、MIMEエンコードを実行します。Encode()メソッドはエンコードされる前の文字列のバイト列を受け取ります。System.Text.EncodingオブジェクトのGetBytes()メソッドを使用して、このバイト列を生成します。Encode()メソッドはMIMEエンコードされたバイト列を返します。

                    このコードを実行するとencodedには次のようなバイト列が代入されます。

                    =?iso-2022-jp?B?GyRCJDMkTko4O3pOcyRyGyhC?= MIME =?iso-2022-jp?B?GyRCJSglcyUzITwlSSQ3JF4kOSEjGyhC?=


                    | technicals | 11:34 | comments(1731) | trackbacks(0) | - | - |
                    メールにバイナリ形式などの特殊な本文を含める
                    0

                      RFCの規定では、メールの本文はどんな形式でもかまわないことになっています。テキストやhtml形式などは一般的ですが、画像データを本文として扱うこともできます。Exwarpはこのような特殊な本文の追加も簡単に実現します。

                      BINDATAはバイナリデータを表すByte配列を表します。

                      [C#]
                      Exwarp.Net.Mail.MailMessage mail =
                          new Exwarp.Net.Mail.MailMessage(System.Text.Encoding.GetEncoding(iso-2022-jp"));
                      mail.Body = "これが本文のテキストです。";

                      Exwarp.Net.RFC.MIME.MIMEContentMessage content =
                          new Exwarp.Net.RFC.MIME.MIMEContentMessage(System.Text.Encoding.ASCII);
                      content.ContentType = "image/jpeg";
                      content.BinaryBody = BINDATA;

                      mail.RunCommand("AddMailMessage",content);
                      [VB.Net]
                      Dim mail As New Exwarp.Net.Mail.MailMessage(System.Text.Encoding.GetEncoding("iso-2022-jp"))
                      mail.Body = "これが本文のテキストです。"

                      Dim content As New Exwarp.Net.RFC.MIME.MIMEContentMessage(System.Text.Encoding.ASCII)
                      content.ContentType = "image/jpeg"
                      content.BinaryBody = BINDATA

                      mail.RunCommand("AddMailMessage",content)
                      解説

                      MailMessageの新しいインスタンスを作成します。コンストラクタは、メッセージに適用される文字セットを表すSystem.Text.Encodingを受け取ります。通常iso-2022-jpが使用されます。

                      次にメールにテキストの本文を追加します。MailMessageBodyプロパティに本文を表す文字列を設定します。

                      特殊な本文をカプセル化するために、Exwarp.Net.RFC.MIME.MIMEContentMessageのインスタンスを作成します。コンストラクタはこのメッセージに適用される文字セットを表すSystem.Text.Encodingを受け取ります。バイナリ形式の本文のため,基本的に文字セットは関係ありませんので、US-ASCII(ASCII)を設定します。

                      次にバイナリ形式の本文を設定します。BinaryBodyプロパティにバイナリデータを表すByte配列をセットします。通常の設定では、自動的にBase64エンコード処理されます。バイナリデータを設定したら,AddMailMessageカスタムオペレーションを使用して,メールに本文を追加します。このカスタムオペレーションは本文のコンテンツを表すExwarp.Net.RFC.MIME.MIMEContentMessageを受け取ります。

                      MailMessageMessageSourceプロパティを参照すると、次のようなバイト列を確認できます。(*****は削除してあります。)

                      MIME-Version: 1.0
                      Message-ID: <20060704173042_5cf58a1a@*****>
                      Content-Type: multipart/alternative;
                          boundary="__NEXTPART_20060704_6FAB76BB_35387A18"

                      This is a multipart message in MIME format.

                      --__NEXTPART_20060704_6FAB76BB_35387A18
                      Content-Type: text/plain; charset=iso-2022-jp
                      Content-Transfer-Encoding: 7bit

                      ・$B$3$l$,K¥J8$N%F%-%9%H$G$9!#・(B
                      --__NEXTPART_20060704_6FAB76BB_35387A18
                      Content-Type: image/jpeg
                      Content-Transfer-Encoding: base64

                      /9j/4AAQSkZJRgABAgAAZABkAAD//gASQWRvYmUgSW1hZ2VSZWFkef/sABFE
                      *****
                      jan8/wCCEISjPsUQ+SlNtRZ9LoQg5oGR4qPp/wAkqd0IQl7vcv/Z

                      --__NEXTPART_20060704_6FAB76BB_35387A18--

                      このような特殊なメッセージボディをメールに含めても、メールを受信する側のエージェント(メーラー)では正しく表示できないことがほとんどですが、PDFやPostScriptなどの一部の形式はメール本文としては適切かも知れません。

                      | technicals | 17:28 | comments(1750) | trackbacks(0) | - | - |
                      Dateヘッダーフィールドを.NetのDateTimeに変換する。
                      0

                        Dateヘッダーフィールドの値は解析されてRFCDateTimeHeaderFieldオブジェクトがカプセル化しますが,このオブジェクトを使うと、DateTimeへの変換が簡単にできます。

                        [C#]
                        Exwarp.Net.RFC.RFCDateTimeHeaderField hdr =
                            (Exwarp.Net.RFC.RFCDateTimeHeaderField)msg.GetCustomHeaderField("Date");

                        Exwarp.Net.RFC.Entities.RFCDateTime rfcDateTime = hdr.RFCDateTime;
                        System.DateTime dt = rfcDateTime.ToDateTime();
                        [VB.Net]
                        Dim hdr As Exwarp.Net.RFC.RFCDateTimeHeaderField = _
                            CType(msg.GetCustomHeaderField("Date"),Exwarp.Net.RFC.RFCDateTimeHeader)

                        Dim rfcDateTime As Exwarp.Net.RFC.Entities.RFCDateTime = hdr.RFCDateTime
                        Dim dt As System.DateTime = rfcDateTime.ToDateTime()
                        解説

                        msgExwarp.Net.RFC.RFCMessage及びその派生クラスのインスタンスを表します。このインスタンスの生成方法についてはこちらを参照してください。

                        RFCMessageGetCustomHeaderField()メソッドは、メッセージに追加されているヘッダーフィールドを取得するメソッドです。一つ目のパラメータに取得したいヘッダーフィールド名を受け取ります。戻り値としてRFCHeaderFieldオブジェクトを返します。該当するヘッダーフィールドが追加されていない場合、nullが返されます。

                        Dateヘッダーフィールドは、RFCDateTimeHeaderFieldオブジェクトとしてカプセル化されるので、GetCustomHeaderField()メソッドの戻り値をRFCDateTimeHeaderField型にキャストすることで、日付ヘッダー固有の値を取得することができます。

                        RFCDateTimeHeaderFieldRFCDateTimeプロパティは、RFCの日付をカプセル化するExwarp.Net.RFC.Entities.RFCDateTimeオブジェクトを返します。このオブジェクトのToDateTime()メソッドを呼び出すと、RFCの日付を.Net BCLDateTimeに変換することができます。


                        | technicals | 18:53 | comments(1844) | trackbacks(0) | - | - |
                        バグ報告:TOPコマンドがマルチパートのメッセージで失敗する。
                        0

                          詳細TOPコマンドでメッセージのヘッダーのみを受信する際、multipartメディアタイプ型のメッセージの受信に失敗します。これはボディサイズが0であるにもかかわらずBounary(行区切)を検索する処理が誤って実行されるために発生する現象です。


                          確認された日付2006/6/27


                          アセンブリ名Exwarp.Net.RFC.MIME.dll


                          バージョン1.0.291.0


                          種類バグ


                          状態次期バージョンにて修正済み


                          対処1.0.300.2以降のバージョンにバージョンアップしてください。

                          | technicals | 18:45 | comments(1663) | trackbacks(0) | - | - |
                          RFC準拠の複雑なメールアドレスの妥当性を検証する
                          0

                            RFC2822では、"in(nested(comment))fo"@[192.168.0.1]のようなアドレス表記も許可されますが、Exwarpを使うとこのような複雑なメールアドレスの妥当性の評価も簡単に行えます。

                            [C#]
                            bool ret = (bool)mail.RunCommand("ValidateEmailAddress","¥"in(nested(comment))fo¥"@[192.168.0.1]");
                            解説

                            mailは、Exwarp.Net.Mail.MailMessageインスタンスを表します。

                            ValidateEmailAddressカスタムオペレーションはメールアドレスの妥当性を検証します。このカスタムオペレーションは検証対象となるメールアドレスを表す文字列型パラメータを一つ受け取ります。妥当なメールアドレスである場合は、true、それ以外の場合はfalseを返します。カスタムオペレーションは戻り値をすべてObject型で返しますので、論理型へのキャストが必要です。

                            RFCの規定では、メールアドレスの@より左の部分には、"を使って引用句として扱えばどんな文字でも含められることになっています。ですから"info@"@mail.comのように@さえ使用することができます。また、()を使ってコメントを含めることも許可されています。コメントはネストしても構わないことになっています。さらに、@より右の部分では、[]を使って、IPアドレスのようにドメイン表記できるとも記されています。

                            Exwarpはこれらの複雑なメールアドレスも正しく評価できます。

                            ValidateEmailAddressカスタムオペレーションは、Exwarp.Operation.ICommandOperatableインターフェースを実装するオブジェクトで実行できますが、このカスタムオペレーションがデフォルトで定義されているのは、MailMessageだけです。そのほかのオブジェクトでこのカスタムオペレーションを実行する場合、AddOperation()メソッドを使用してカスタムオペレーションの追加処理を行う必要があります。詳しくはこちらを参照してください。

                            ValidateEmailAddressカスタムオペレーションは検証するメールアドレスが実際に存在するかどうかは確認しません。RFCの規定に従った妥当な文字列かどうかを判断するだけです。

                            | technicals | 11:33 | comments(1483) | trackbacks(0) | - | - |
                            メールにテキストとHTMLの本文を含める
                            0

                              メールに複数の形式の本文を含めたいことがあります。テキスト形式とhtml形式の混在したメールなどは一般的です。

                              Exwarpを使うと様々な形式の本文を含めることができます。RFCに記されているようにapplication/postscript型の本文なども含められます。今回はテキストとhtml形式の本文を含める方法を紹介します。

                              [C#]
                              Exwarp.Net.Mail.MailMessage mail =
                                  new Exwarp.Net.Mail.MailMessage(System.Text.Encoding.GetEncoding("iso-2022-jp"));

                              mail.Body = "これが本文です。";
                              mail.DefaultTextType = Exwarp.Net.Mail.TextType.Html;
                              mail.Body = "<html><body>これが本文です。</body></html>";
                              [VB.Net]
                              Dim mail As New Exwarp.Net.Mail.MailMessage(System.Text.Encoding.GetEncoding("iso-2022-jp"))

                              mail.Body = "これが本文です。"
                              mail.DefaultTextType = Exwarp.Net.Mail.TextType.Html
                              mail.Body = "<html><body>これが本文です。</body></html>"
                              解説

                              通常MailMessageBodyプロパティに文字列を指定すると、text/plainメディアタイプ型のMIMEContentMessageが生成されます。これはMailMessageDefaultTextTypeプロパティの初期値がExwarp.Net.Mail.TextType.PlainTextに設定されているためです。

                              まず、テキスト形式の本文を設定します。

                              テキストの本文を設定したら、MailMessageDefaultTextTypeプロパティをExwarp.Net.Mail.TextType.Htmlに切り替えます。これで、これ以後はBodyプロパティを通してtext/htmlメディアタイプ型のMIMEContentMessageを操作するようになります。

                              html形式の本文を設定します。

                              これでテキスト形式とhtml形式の本文が含まれるメールメッセージが生成できました。MailMessageMessageSourceプロパティを参照すると次のようなバイト列が確認できます。*****部分は省いています。

                              MIME-Version: 1.0
                              Message-ID: <20060625160155_1129b361@******>
                              Content-Type: multipart/alternative;
                               boundary="__NEXTPART_20060625_586CE275_59B1FBCE"

                              This is a multipart message in MIME format.

                              --__NEXTPART_20060625_586CE275_59B1FBCE
                              Content-Type: text/plain; charset=iso-2022-jp
                              Content-Transfer-Encoding: 7bit

                              ・$B$3$l$,K¥J8$G$9!#・(B
                              --__NEXTPART_20060625_586CE275_59B1FBCE
                              Content-Type: text/html; charset=iso-2022-jp
                              Content-Transfer-Encoding: quoted-printable

                              =1B$B$3$l$,K¥J8$G$9!#=1B(B=

                              --__NEXTPART_20060625_586CE275_59B1FBCE--

                              1.0.291.0では、html形式メッセージのContent-Transfer-Encodingヘッダーフィールドが7bitbase64となります。1.0.291.0より後のバージョンでは、自動的にquoted-printableが適用されます。

                              | technicals | 15:28 | comments(1659) | trackbacks(0) | - | - |
                              メールの添付メッセージを削除する
                              0

                                メールメッセージに含まれる添付ファイルを削除するには、RemoveAttachmentカスタムオペレーションを使用します。今回はすべての添付ファイルを削除するサンプルを紹介します。

                                [C#]
                                object atts = mail.RunCommand("GetAttachments");
                                if(atts != null)
                                {
                                    foreach(object att in (System.Collections.IEnumerable)atts)
                                    {
                                        mail.RunCommand("RemoveAttachment",att);
                                    }
                                }
                                [VB.Net]
                                Dim atts() As Object = mail.RunCommand("GetAttachments")

                                If Not(atts Is Nothing) Then
                                    Dim att As Object
                                    For Each att In CType(atts,System.Collections.IEnumerable)
                                        mail.RunCommand("RemoveAttachment",att)
                                    Next
                                End If
                                解説

                                mailExwarp.Net.Mail.MailMessageのインスタンスを表します。このインスタンスの取得方法については、こちらを参照してください。

                                すべての添付ファイルを削除するために、まずGetAttachmentsカスタムオペレーションを使用して、削除対象となる添付メッセージの配列を取得します。この配列を列挙しながら、MailMessageRemoveAttachmentカスタムオペレーションを実行します。

                                RemoveAttachmentカスタムオペレーションは削除する添付メッセージを表すExwarp.Net.RFC.MIME.MIMEContentMessage型のパラメータを一つ受け取ります。今回はキャストせずにObject型のまま渡しています。

                                | technicals | 23:19 | comments(1932) | trackbacks(0) | - | - |
                                RFC,MIME,メールメッセージのヘッダーを取得する
                                0

                                  Exwarp.Net.RFC.RFCMessageの派生クラス(MIMEMessageMailMessage)のヘッダーを取得するにはHeaderプロパティを使用します。このプロパティはメッセージに追加されているすべてのヘッダーフィールドを表すExwarp.Net.RFC.RFCHeaderFieldオブジェクト型の配列を返します。

                                  [C#]
                                  foreach(Exwarp.Net.RFC.RFCHeaderField header in msg.Header)
                                  {
                                      string body = header.Body;
                                  }
                                  [VB.Net]
                                  Dim header As Exwarp.Net.RFC.RFCHeaderField
                                  For Each header In msg.Header
                                      Dim body As String = header.Body
                                  Next
                                  解説

                                  msgExwarp.Net.RFC.RFCMessage及びその派生クラスのインスタンス(MIMEMessage,MailMessageetc.)を表します。

                                  Headerプロパティを使用してメッセージに追加されたヘッダーフィールドのコレクションを取得します。For Eachループを使用すれば簡単にすべてのヘッダーフィールドを列挙できます。

                                  HeaderFieldオブジェクトのBodyプロパティはヘッダーフィールドボディの値を返します。MIMEエンコード処理されている場合、デコードされた文字列が取得されます。

                                  デコードせずにヘッダーフィールドボディを取得したい場合、HeaderFieldSourceプロパティを使用します。このプロパティはヘッダーフィールドソースを表すバイト列を返します。

                                  | technicals | 12:07 | comments(1754) | trackbacks(0) | - | - |
                                  POP3コマンドを操作する(3) UIDL,LISTコマンド
                                  0

                                    POP3コマンドの中には応答にリストが含むものがあります。たとえばUIDLコマンドはホストに届いているメールの一意な番号のリストを返します。こうしたリストはPop3ResponseオブジェクトのStatusプロパティを解析すれば取得できますが、今回はリスト型の応答を取得する別の方法を紹介します。

                                    UIDLLISTコマンドの実行はTRANSACTION状態(ホストへのログインが正常に行われた状態)で行ってください。

                                    [C#]
                                    Exwarp.Net.RFC.IResponseMessage response;
                                    response = (Exwarp.Net.Pop3.Pop3Response)client.SendReceive(new Exwarp.Net.Pop3.Pop3Request("UIDL¥r¥n"));

                                    object o = response.GetProperty("Uidl");

                                    if(o != null)
                                    {
                                        System.Collections.IList uidl = (System.Collections.IList)o;
                                    }
                                    [VB.Net]
                                    Dim response As Exwarp.Net.Pop3.Pop3Response
                                    response = CType(client.SendReceive(new Exwarp.Net.Pop3.Pop3Request("UIDL" & vbCrLf)), _
                                        Exwarp.Net.Pop3.Pop3Response)

                                    Dim o As Object = response.GetProperty("Uidl")
                                    Dim uidl As System.Collections.IList

                                    If Not(o Is Nothing) Then
                                        uidl = CType(o,System.Collections.IList)
                                    End If
                                    解説

                                    clientはPOP3ホストへ接続済みのExwarp.Net.Pop3.Pop3Clientインスタンスを表します。このインスタンスの生成方法についてはこちらを参照してください。

                                    UIDLなどのコマンドを送信するとPOP3サーバーはリストを含む応答を返します。この応答を取得するには、Pop3ResponseオブジェクトのStatusプロパティの値を解析すればいいですが、Pop3ResponseオブジェクトのGetProperty()メソッドを使用してSystem.Collection.IList型のリストを取得することもできます。

                                    GetProperty()メソッドはカスタムプロパティの値を取得します。このメソッドはカスタムプロパティ名を表す文字列型のパラメータを一つ受け取ります。Pop3ClientオブジェクトはUIDLコマンドに対する応答を受け取った際、自動的にPop3ResponseオブジェクトにUidlカスタムプロパティを追加します。このリストを使ってすべてのメールの一意な番号を取得することができます。

                                    同じ事がLISTコマンドにも当てはまります。LISTコマンド実行後、Pop3ResponseオブジェクトにはListカスタムプロパティが追加されます。

                                    | technicals | 18:49 | comments(1327) | trackbacks(0) | - | - |
                                    MIMEメッセージに追加されている子メッセージを取得する
                                    0

                                      MIMEMessageには、複数のMIMEMessageオブジェクトを追加することができます。追加された子メッセージのコレクションを取得するにはMIMEMessagesプロパティを使用します。

                                      [C#]
                                      foreach(Exwarp.Net.RFC.MIME.MIMEMessage child in msg.MIMEMessages)
                                      {
                                          //ANY PROCESS
                                      }
                                      [VB.Net]
                                      Dim child As Exwarp.Net.RFC.MIME.MIMEMessage;
                                      For Each child In msg.MIMEMessages
                                          'ANY PROCESS
                                      Next
                                      解説

                                      msgExwarp.Net.RFC.MIME.MIMEMessage及びその派生クラス(MIMEContentMessage,MailMessageetc.)のインスタンスを表します。

                                      MIMEMessagesプロパティは、オブジェクトに格納されているすべての子MIMEメッセージのコレクションを表すExwarp.Net.RFC.MIME.MIMEMessageCollectionを返すので、For Eachループなどを使用して個々の子メッセージに対するカスタムプロセスを実行することができます。再帰的に呼び出すことで子メッセージに含まれるすべてのMIMEMessageを取得することもできます。

                                      Exwarp.Net.Mail.MailMessageにもMIMEMessageプロパティが定義されていますが、MailMessageは常に1つの子メッセージしか受け入れません。複数のメッセージを追加するとメッセージソースの取得時に例外が発生しますので注意してください。これはメールとコンテンツを分離したオブジェクトモデルによる仕様上の制限です。

                                      | technicals | 13:23 | comments(1849) | trackbacks(0) | - | - |
                                      SMTPコマンドを操作する
                                      0

                                        Exwarpでは、メール送信のほとんどの処理をカスタムオペレーションで自動化していますが、SMTPコマンドを直接操作することもできます。SMTPコマンドの操作にはExwarp.Net.Smtp.SmtpClient,Exwarp.Net.Smtp.SmtpRequest及びExwarp.Net.Smtp.SmtpResponseを使用します。

                                        [C#]
                                        Exwarp.Net.Smtp.SmtpClient client =
                                            new Exwarp.Net.Smtp.SmtpClient("HOST_NAME");

                                        client.Connect();

                                        Exwarp.Net.RFC.IResponseMessage response = null;

                                        response = client.SendReceive(new Exwarp.Net.Smtp.SmtpRequest("HELO¥r¥n"));
                                        System.Diagnostics.Debug.WriteLine(((Exwarp.Net.Smtp.SmtpResponse)response).Status);

                                        client.Close();
                                        [VB.Net]
                                        Dim client As New Exwarp.Net.Smtp.SmtpClient("HOST_NAME")

                                        client.Connect();

                                        Dim response As Exwarp.Net.RFC.IResponseMessage = Nothing

                                        response = clinet.SendReceive(New Exwarp.Net.Smtp.SmtpRequest("HELO" & vbCrLf))
                                        System.Diagnostics.Debug.WriteLine(CType(response,Exwarp.Net.Smtp.SmtpResponse).Status)

                                        client.Close()
                                        解説

                                        SMTPコマンドを操作するためにExwarp.Net.Smtp.SmtpClientのインスタンスを生成します。コンストラクタにホスト名を表す文字列を受け取ります。

                                        Connect()メソッドでSMTPホストに接続します。

                                        SendReceive()メソッドを使用してSMTPコマンドを送信します。送信するSMTPコマンドはExwarp.Net.Smtp.SmtpRequestオブジェクトがカプセル化します。コンストラクタに送信したいSMTPコマンドを表す文字列を設定します。この際必ず末尾にCR/LFを付加します。

                                        SendReceive()メソッドはExwarp.Net.RFC.IResponseMessage(インターフェース)型の戻り値を返します。このオブジェクトはホストからの応答をカプセル化しています。厳密にはExwarp.Net.Smtp.SmtpResponse型のオブジェクトが返されますので,キャストしてSMTP応答の詳細な情報が取得できます。

                                        SmtpResponseオブジェクトのStatusプロパティからSMTPホストの応答メッセージ(ステータスライン)を表す文字列が取得できます。拡張SMTPの複数行応答にも対応していますので、HELOコマンドの代わりにEHLOコマンドを使うこともできます。この場合ホストは挨拶メッセージに加えてホストがサポートしている拡張SMTPメソッドの一覧を返します。

                                        | technicals | 19:10 | comments(1831) | trackbacks(0) | - | - |
                                        POP3コマンドを操作する(2)
                                        0

                                          POP3のSTATコマンドを使用してPOP3サーバーに届いているメールの状況を確認します。

                                          [C#]
                                          Exwarp.Net.RFC.IResponseMessage response;
                                          response = client.SendReceive(new Exwarp.Net.Pop3.Pop3Request("STAT¥r¥n"));
                                          System.Diangnostics.Debug.WriteLine(((Exwarp.Net.Pop3.Pop3Response)response).Status);
                                          [VB.Net]
                                          Dim response As Exwarp.Net.RFC.IResponseMessage
                                          response = clinet.SendReceive(new Exwarp.Net.Pop3.Pop3Request("STAT" & vbCrLf))
                                          System.Diagnostics.Debug.WriteLine(CType(response,Exwarp.Net.Pop3.Pop3Response).Status)
                                          解説

                                          clientはPOP3ホストへ接続済みのExwarp.Net.Pop3.Pop3Clientのインスタンスを表します。このインスタンスの生成方法、およびホストへの接続方法についてはこちらを参照してください。

                                          SendReceive()メソッドを使用してホストへコマンドを送信します。STATコマンドは現在のPOP3サーバーのメールの状況を問い合わせるコマンドです。パラメータを渡さない場合、メールボックス全体のステータスが取得できます。パラメータにメール番号をセットする場合、特定のメールのステータスが取得できます。今回はパラメータなしでコマンド送信しています。

                                          Pop3ClientExwarp.Net.RFC.IResponseMessage型の結果を返します。これをExwarp.Net.Pop3.Pop3Response型にキャストすることでPOP3固有の情報を取得できます。

                                          Statusプロパティを使ってホストからの応答を表す文字列を取得できます。この文字列を解析すると何件のメッセージが現在届いていて、合計何オクテット(バイト)かが分かります。

                                          | technicals | 17:43 | comments(1765) | trackbacks(0) | - | - |
                                          MIMEContentMessageを操作する
                                          0

                                            メールメッセージのコンテンツを扱う場合、MIMEMessageを使うよりMIMEContentMessageを使う方が便利です。

                                            [C#]
                                            Exwarp.Net.RFC.MIME.MIMEMessage jismsg =
                                                new Exwarp.Net.RFC.MIME.MIMEContentMessage(System.Text.Encoding.GetEncoding("iso-2022-jp"));
                                            jismsg.ContentType = "text/plain";
                                            jismsg.Body = "これが本文です。";

                                            Exwarp.Net.RFC.MIME.MIMEMessage eucmsg =
                                                new Exwarp.Net.RFC.MIME.MIMEContentMessage(System.Text.Encoding.GetEncoding("euc-jp"));
                                            eucmsg.ContentType = "text/plain";
                                            eucmsg.Body="これが本文です。";
                                            [VB.Net]
                                            Dim jismsg As New Exwarp.Net.RFC.MIME.MIMEContentMessage(System.Text.Encoding.GetEncoding("iso-2022-jp"))
                                            jismsg.ContetnType = "text/plain"
                                            jismsg.Body = "これが本文です。"

                                            Dim encmsg As New Exwarp.Net.RFC.MIME.MIMEContentMessage(System.Text.Endocing.GetEncoding("euc-jp"))
                                            eucmsg.ContentType = "text/plain"
                                            eucmsg.Body = "これが本文です。"
                                            解説

                                            メールコンテンツをカプセル化するためにMIMEMessageではなく、MIMEContentMessageオブジェクトを使用します。コンストラクタは必ず文字セットを表すSystem.Text.Encodingを受け取ります。今回は、iso-2022-jpeuc-jpの二つの文字セットのメッセージを作成します。

                                            iso-2022-jpは7ビットの文字セットですから何も問題はありませんが、euc-jpは8ビットの文字セットであるため、ボディにUS-ASCIIでは表現しきれないコードが現れます。

                                            MIMEでは、こうした問題に対処するためにContent-Transfer-Encodingヘッダーフィールドを使用して8ビットの文字セットが使用されていることや、7ビットで表現できるよう特殊な処理を施していることを明示することになっています。

                                            MIMEContentMessageオブジェクトを使用するとContent-Transfer-Encodingヘッダーフィールドは自動的に追加/変更されます。7ビット文字セットか8ビットの文字セットかを意識せずに自由な文字セットでメッセージを生成することができます。デフォルトでは8ビットの文字セットが使用されている場合、本文をbase64という方法で7ビット化し、Content-Transfer-Encodingヘッダーが自動的に追加されます。8ビット文字をそのままボディに含めることもできます。その場合Allow8bitEncodingプロパティをtrueに設定します。

                                            MIMEContentMessageMIMEMessageから派生しているため、MIMEMessage型として扱うことができます。

                                            今回のサンプルを実行するとjismsgeucmsgMessageSourceプロパティには次のようなバイト列が生成されます。

                                            [jismsg]
                                            Content-Type: text/plain; charset=iso-2022-jp
                                            Content-Transfer-Encoding: 7bit

                                            ・$B$3$l$,K¥J8$G$9!#・(B
                                            [eucmsg]
                                            Content-Type: text/plain; charset=euc-jp
                                            Content-Transfer-Encoding: base64

                                            pLOk7KSsy9zKuKTHpLmhow==
                                            | technicals | 17:07 | comments(1757) | trackbacks(0) | - | - |
                                            POP3コマンドを操作する
                                            0

                                              Exwarpではホストとの通信処理をカスタムオペレーションによって自動化していますが、いろいろなプロトコルを直接操作することもできます。今回はPOP3コマンドの操作方法を説明します。

                                              POP3コマンドを扱うために、Exwarp.Net.Pop3.Pop3Client,Exwarp.Net.Pop3.Pop3Request及びExwarp.Net.Pop3.Pop3Responseオブジェクトを使用します。

                                              HOST_NAMEはホスト名,
                                              USER_NAMEはPOP3ホストにログオンするユーザー名,
                                              PASSWORDはパスワードを表す文字列です。

                                              [C#]
                                              Exwarp.Net.Pop3.Pop3Client client = new Exwarp.Net.Pop3.Pop3Client("HOST_NAME");
                                              Exwarp.Net.RFC.IResponseMessage response = null;

                                              client.Connect();

                                              response = client.SendReceive(new Exwarp.Net.Pop3.Pop3Request(""));
                                              System.Diagnostics.Debug.WriteLine(((Exwarp.Net.Pop3.Pop3Response)response).Status);

                                              response = client.SendReceive(new Exwarp.Net.Pop3.Pop3Request("USER USER_NAME¥r¥n"));
                                              System.Diagnostics.Debug.WriteLine(((Exwarp.Net.Pop3.Pop3Response)response).Status);

                                              response = client.SendReceive(new Exwarp.Net.Pop3.Pop3Request("PASS PASSWORD¥r¥n"));
                                              System.Diagnostics.Debug.WriteLine(((Exwarp.Net.Pop3.Pop3Response)response).Status);

                                              response = client.SendReceive(new Exwarp.Net.Pop3.Pop3Request("QUIT¥r¥n"));
                                              System.Diagnostics.Debug.WriteLine(((Exwarp.Net.Pop3.Pop3Response)response).Status);

                                              client.Close();
                                              [VB.Net]
                                              Dim client As New Exwarp.Net.Pop3.Pop3Client("HOST_NAME")
                                              Dim response As Exwarp.Net.RFC.IResponseMessage = Nothing

                                              client.Connect()

                                              response = client.SendReceive(new Exwarp.Net.Pop3.Pop3Request(""))
                                              System.Diagnostics.Debug.WriteLine(CType(response,Exwarp.Net.Pop3.Pop3Response).Status)

                                              response = client.SendReceive(new Exwarp.Net.Pop3.Pop3Request("USER USER_NAME" & vbCrLf))
                                              System.Diagnostics.Debug.WriteLine(CType(response,Exwarp.Net.Pop3.Pop3Response).Status)

                                              response = client.SendReceive(new Exwarp.Net.Pop3.Pop3Request("PASS PASSWORD" & vbCrLf))
                                              System.Diagnostics.Debug.WriteLine(CType(response,Exwarp.Net.Pop3.Pop3Response).Status)

                                              response = client.SendReceive(new Exwarp.Net.Pop3.Pop3Request("QUIT" & vbCrLf))
                                              System.Diagnostics.Debug.WriteLine(CType(response,Exwarp.Net.Pop3.Pop3Response).Status)

                                              client.Close()
                                              解説

                                              Exwarp.Net.Pop3.Pop3Clientの新しいインスタンスを生成します。コンストラクタはこのインスタンスが接続するホスト名を表す文字列を受け取ります。

                                              Connect()メソッドでホストに接続します。

                                              Pop3ClientSendReceive()メソッドを使ってホストにコマンドを送信します。送信するコマンドはExwarp.Net.Pop3.Pop3Requestオブジェクトを使用してカプセル化します。コンストラクタに送信したいPOP3コマンドを表す文字列を設定します。この際必ずCR/LFを末尾に付加します。長さ0の文字列はホストからの受信処理のみを行いたい場合に利用します。

                                              SendReceive()メソッドを実行するとPop3ClientExwarp.Net.RFC.IResponseMessage(インターフェース)型のリクエストを返します。このオブジェクトを使ってホストからの応答メッセージを取得できます。Pop3Clinetが返すレスポンスは正確にはExwarp.Net.Pop3.Pop3Response型なので、この型にキャストするとPOP3応答固有の情報を取得することができます。

                                              Pop3ResponseオブジェクトのStatusプロパティを使ってサーバーから返された応答に含まれるステータスラインを取得できます。

                                              今回のサンプルでは空のリクエスト、USER/PASSコマンド、及びQUITコマンドを送信してその応答をデバッグウィンドウに表示しています。

                                              | technicals | 17:17 | comments(1814) | trackbacks(0) | - | - |
                                              メールをeml形式で保存する
                                              0

                                                メールメッセージを.eml形式で保存するには、Exwarp.Net.RFC.RFCMessageに定義されているSaveToFileカスタムオペレーションを実行します。

                                                [C#]
                                                msg.RunCommand("SaveToFile","c:¥¥mail.eml");
                                                [VB.Net]
                                                msg.RunCommand("SaveToFile","c:¥mail.eml")
                                                解説

                                                msgExwarp.Net.RFC.RFCMessage及びその派生クラスののインスタンスを表します。このインスタンスを生成方法や取得方法についてはこちらを参照してください。

                                                SaveToFileカスタムオペレーションはメッセージソースを表すバイト列をシリアル化するカスタムオペレーションです。一つ目のパラメータに保存先のフルパスを表す文字列を設定します。

                                                ファイルの拡張子を.emlにすることで多くのメーラーでもこのファイルをを開くことができます。

                                                | technicals | 10:36 | comments(2182) | trackbacks(0) | - | - |
                                                添付ファイルを保存する
                                                0

                                                  添付ファイルを保存するにはSaveBinaryBodyカスタムオペレーションを使います。添付ファイルのファイル名を、Content-Typeヘッダーフィールドのnameパラメータから取得するため、GetHeaderFieldParameterBody()メソッドも使用します。(Content-Dispositionヘッダーフィールドのfilenameパラメータもを使うこともできます。)

                                                  [C#]
                                                  string filename = att.GetHeaderFieldParameterBody("Content-Type","name");
                                                  if(filename != null)
                                                  {
                                                      att.RunCommand("SaveBinaryBody","c:¥¥" + filename);
                                                  }
                                                  [VB.Net]
                                                  Dim filename As String = att.GetHeaderFieldParameterBody("Content-Type","name")
                                                  If Not(filename Is Nothing) Then
                                                      att.RunCommand("SaveBinaryBody","c:¥" & filename)
                                                  End If
                                                  解説

                                                  attExwarp.Net.RFC.MIME.MIMEContentMessageのインスタンスを表します。このオブジェクトの生成及び取得方法についてはこちらを参照して下さい。

                                                  MIMEContentMessageGetHeaderFieldParameterBody()メソッドを呼び出してヘッダーフィールドに追加されているパラメータの値を取得します。このメソッドの一つ目のパラメータは取得したいパラメータの含まれるヘッダーフィールド名を表す文字列です。二つ目のパラメータは取得したいパラメータ名を表す文字列です。該当するヘッダーフィールドパラメータが見つかった場合、その値が返されます。それ以外の場合はnull(VB.NetではNothing)が返されます。

                                                  ファイル名が取得できたら、SaveBinaryBodyカスタムオペレーションを使用して添付ファイルを保存します。このカスタムオペレーションのパラメータはファイルの保存先のフルパスを表す文字列です。(今回の例ではCドライブのルートディレクトリに保存しています。)

                                                  | technicals | 14:12 | comments(1907) | trackbacks(0) | - | - |
                                                  メールに添付された添付メッセージを取得する
                                                  0

                                                    メールに添付された添付メッセージを取得するにはExwarp.Net.Mail.MailMessageクラスに定義されているGetAttachmentsカスタムオペレーションを実行します。

                                                    [C#]
                                                    Exwarp.Net.RFC.MIME.MIMEContentMessage att;
                                                    Exwarp.Net.RFC.MIME.MIMEContentMessage[] atts;
                                                    atts = (Exwarp.Net.RFC.MIME.MIMEContentMessage[])mail.RunCommand("GetAttachments");

                                                    if(atts != null)
                                                    {
                                                        foreach(att in atts)
                                                        {
                                                            //ANY PROCESS
                                                        }
                                                    }
                                                    [VB.Net]
                                                    Dim att As Exwarp.Net.RFC.MIME.MIMEContentMessage
                                                    Dim atts() As Exwarp.Net.RFC.MIME.MIMEContentMessage

                                                    Dim wrk As Object = mail.RunCommand("GetAttachments")
                                                    If Not(wrk Is Nothing) Then
                                                        atts = CType(wrk,Exwarp.Net.RFC.MIME.MIMEContentMessage())
                                                        For Each att In atts
                                                            'ANY PROCESS
                                                        Next
                                                    End If
                                                    [解説]

                                                    mailExwarp.Net.Mail.MailMessageのインスタンスを表します。このインスタンスの生成方法及びメールメッセージの取得方法についてはこちらを参照してください。

                                                    MailMessageに定義されているGetAttachmentsカスタムオペレーションを実行します。このカスタムオペレーションはメールに含まれる全ての添付メッセージのリストをExwarp.Net.RFC.MIME.MIMEContentMessage型の配列で返します。(カスタムオペレーションは戻り値を全てObject型で返しますので,MIMEContentMessage配列型にキャストする必要があります。C#では変換演算子,VB.NetではCType関数を使います。)

                                                    もしメールに添付メッセージが追加されていない場合、GetAttachmentsカスタムオペレーションはnull(VB.NetではNothing)を返します。

                                                    添付メッセージのリストが取得できた場合、取得されたリストをForEachループで列挙しながら、それぞれの添付ファイルに対してカスタムプロセスを実行することができます。

                                                    | technicals | 11:42 | comments(1795) | trackbacks(0) | - | - |
                                                    メッセージのソースを表示する
                                                    0

                                                      RFCMessage及びその派生クラス(MIMEMessageMailMessage)にはMessageSourceプロパティが定義されています。このプロパティの値はByte型の配列ですが、このプロパティの値を取得したり更新したりすることでメッセージソースを簡単に操作できます。


                                                      [C#]
                                                      byte[] src = msg.MessageSource;
                                                      System.Diagnostics.Debug.WriteLine(System.Text.Encoding.ASCII.GetString(src));
                                                      [VB.Net]
                                                      Dim src() As Byte = msg.MessageSource
                                                      System.Diagnostic.Debug.WriteLine(System.Text.Encoding.ASCII.GetString(src))

                                                      [解説]

                                                      上記サンプルコードのmsgは、RFCMessageの派生クラスのインスタンスを表します。このインスタンスの作り方についてはこちらを参照してください。

                                                      MessageSourceプロパティの戻り値をByte型の配列(この場合src)で受け取ります。

                                                      取得したバイト列の内容をASCIIエンコーディングで文字列に変換しデバッグウィンドウに表示しています。これでバイト列のイメージが取得できます。ASCIIエンコーディングですから8ビット文字が出てくる場合正常に表示されません。文字化けします。

                                                      | technicals | 14:01 | comments(2064) | trackbacks(0) | - | - |
                                                      メールに添付ファイルを追加する
                                                      0

                                                        メールに添付ファイルを追加する方法を紹介します。

                                                        メールの添付には2つのステップが必要です。まず(1)添付メッセージの作成、次に(2)添付メッセージの追加です。具体的なコードは次のようになります。

                                                        [C#]
                                                        Exwarp.Net.Mail.MailMessage mail =
                                                            new Exwarp.Net.Mail.MailMessage(System.Text.Encoding.GetEncoding("iso-2022-jp"));

                                                        mail.RunCommand("AddTo","MyFriend","myfriend@friend.com");
                                                        mail.Subject = "添付メールサンプル";
                                                        mail.From = "me@me.com";
                                                        mail.Body = "本文です";

                                                        object o = mail.RunCommand("CreateAttachment","c:¥¥myimg.jpg");
                                                        mail.RunCommand("AddAttachment",o);

                                                        [VB.Net]
                                                        Dim msg As New Exwarp.Net.Mail.MailMessage(System.Text.Encoding.GetEncoding("iso-2022-jp"))

                                                        mail.RunCommand("AddTo","MyFriend","myfriend@friend.com")
                                                        mail.Subject = "添付メールサンプル"
                                                        mail.From = "me@me.com"
                                                        mail.Body = "本文です"

                                                        Dim o As Object = mail.RunCommand("CreateAttachment","c:¥myimg.jpg")
                                                        mail.RunCommand("AddAttachment",o)
                                                        [解説]

                                                        メールメッセージの新しいインスタンスを作成します。この部分の解説はこちらをご覧ください。

                                                        メールメッセージに追加する添付メッセージを作成します。MailMessageクラスに定義されているCreateAttachmentカスタムオペレーションを実行します。このカスタムオペレーションは添付ファイルのパスを表す文字列をパラメータとして受け取ります。戻り値として添付ファイルをカプセル化したExwarp.Net.RFC.MIME.MIMEContentMessageオブジェクトが返されます。(カスタムオペレーションは常に戻り値をObject型で返します)

                                                        次に生成された添付メッセージをメールメッセージに追加します。これはAddAttachmentカスタムオペレーションを呼び出すことで簡単に行なえます。AddAttachmentカスタムオペレーションは添付ファイルをカプセル化したExwarp.Net.RFC.MIME.MIMEContentMessageオブジェクトをパラメータとして受け取ります。(上記サンプルの場合o)戻り値は返しません。

                                                        ボディを設定しないで添付メッセージを追加しようとすると例外が発生します。これは添付ファイルのみのメールメッセージは作成できないという仕様上の制限です。そのため本文は必ず設定してください。長さ0の文字列(System.String.Empty)でも構いません。

                                                        上記の例外を発生させる部分でバグが確認されました。(アセンブリ:Exwarp.Net.Mail.dll,バージョン:1.0.291.0)エラーコードが間違って指定されていたため、リソースが見つからないというエラーメッセージが表示されます。次期バージョンにて修正済みです。


                                                        これで添付ファイルが追加されました。今回のサンプルの結果mailオブジェクトのMessageSourceプロパティには下のようなバイト列が生成されます。(*****部分は削除してあります。)

                                                        To: MyFriend<myfriend@friend.com>
                                                        Subject: =?iso-2022-jp?B?GyRCRTpJVSVhITwlayU1JXMlVyVrGyhC?=
                                                        From: me@me.com
                                                        MIME-Version: 1.0
                                                        Message-ID: <20060523185922_32ddb412@*****>
                                                        Content-Type: multipart/mixed;
                                                         boundary="__NEXTPART_20060523_77DBB3AE_A728AA9"

                                                        This is a multipart message in MIME format.

                                                        --__NEXTPART_20060523_77DBB3AE_A728AA9
                                                        Content-Type: text/plain; charset=iso-2022-jp
                                                        Content-Transfer-Encoding: 7bit

                                                        ・$BK¥J8$G$9・(B
                                                        --__NEXTPART_20060523_77DBB3AE_A728AA9
                                                        Content-Type: image/jpeg; name="myimg.jpg"
                                                        Content-Disposition: attachment; filename="myimg.jpg"
                                                        Content-Transfer-Encoding: base64

                                                        /9j/4AAQSkZJRgABAgAAZABkAAD//gASQWRvYmUgSW1hZ2VSZWFkef/sABFE
                                                        *****
                                                        jan8/wCCEISjPsUQ+SlNtRZ9LoQg5oGR4qPp/wAkqd0IQl7vcv/Z

                                                        --__NEXTPART_20060523_77DBB3AE_A728AA9--
                                                        | technicals | 18:32 | comments(1758) | trackbacks(0) | - | - |
                                                        MIMEMessageを操作する(2)
                                                        0

                                                          Exwarp.Net.RFC.MIME.MIMEMessageは、複数のMIMEMessageを保持することができます。MIMEMessageに他のMIMEMessageを追加するには次のように記述します。

                                                          [C#]
                                                          Exwarp.Net.RFC.MIME.MIMEMessage msg =
                                                              new Exwarp.Net.RFC.MIME.MIMEMessage(System.Text.Encoding.GetEncoding("iso-2022-jp"));
                                                          Exwarp.Net.RFC.MIME.MIMEMessage submsg =
                                                              new Exwarp.Net.RFC.MIME.MIMEMessage(System.Text.Encoding.GetEncoding("iso-2022-jp"));

                                                          msg.ContentType = "multipart/mixed";

                                                          submsg.ContentType = "text/plain";
                                                          submsg.Body = "これは本文です。";

                                                          msg.MIMEMessages.Add(submsg);
                                                          [VB.Net]
                                                          Dim msg As New Exwarp.Net.RFC.MIME.MIMEMessage(System.Text.Encoding.GetEncoding("iso-2022-jp"))
                                                          Dim submsg As New Exwarp.Net.RFC.MIME.MIMEMessage(System.Text.Encoding.GetEncoding("iso-2022-jp"))

                                                          msg.ContentType = "multipart/mixed"

                                                          submsg.ContentType = "text/plain"
                                                          submsg.Body = "これは本文です。"

                                                          msg.MIMEMessages.Add(submsg)
                                                          [解説]

                                                          MIMEMessageの新しいインスタンスを作成します。この際このメッセージに適用される文字セットを指定する必要があります。System.Text.Encoding.GetEncoding()メソッドを使用して文字セット指定します。同様に子メッセージも新規に作成します。

                                                          親メッセージのContent-Typeヘッダーフィールドを更新します。ContentTypeプロパティにメディアタイプを文字列で指定します。この場合、子メッセージを追加するのでmultipart/mixedとします。

                                                          次に子メッセージのContent-Typeヘッダーフィールドを設定します。今回は単純なテキストメッセージを表すtext/plainにしています。

                                                          子メッセージのメッセージボディを更新します。Bodyプロパティに文字列を代入するだけで更新されます。

                                                          最後に親メッセージ(msg)に子メッセージ(submsg)を追加します。

                                                          上のサンプルコードを実行すると親メッセージのソースは次のようになります。ソースの出力は

                                                          [C#]
                                                          System.Diagnostics.Debug.WriteLine(System.Text.Encoding.ASCII.GetString(msg.MessageSource));
                                                          [VB.Net]
                                                          System.Diagnostics.Debug.WriteLine(System.Text.Encoding.ASCII.GetString(msg.MessageSource))
                                                          のように記述すると確認できます。

                                                          Content-Type: multipart/mixed;
                                                           boundary="__NEXTPART_20060522_1C980F21_54112625"

                                                          This is a multipart message in MIME format.

                                                          --__NEXTPART_20060522_1C980F21_54112625
                                                          Content-Type: text/plain; charset=iso-2022-jp

                                                          ・$B$3$l$OK¥J8$G$9!#・(B
                                                          --__NEXTPART_20060522_1C980F21_54112625--

                                                          今回は問題ありませんがメッセージに適用される文字セットが8ビット文字セットの場合は問題があります。8ビット文字が含まれることや7ビットで表現できるよう特殊な処理を施したことを明記する必要があります。Content-Transfer-Encodingヘッダーフィールドはそのために使用されます。このヘッダーフィールドの使い方も今後紹介します。

                                                          | technicals | 17:09 | comments(1851) | trackbacks(0) | - | - |
                                                          MIMEMessageを操作する
                                                          0

                                                            MIMEMessageの基本的な使用法を紹介します。

                                                            MIMEMessageRFCMessageを拡張し、非ASCII文字セットをサポートします。また複数のMIMEMessageオブジェクトを格納することもできます。

                                                            MIMEMessageの基本操作を紹介するサンプルコードです。

                                                            [C#]
                                                            Exwarp.Net.RFC.MIME.MIMEMessage msg =
                                                                new Exwarp.Net.RFC.MIME.MIMEMessage(System.Text.Encoding.GetEncoding("iso-2022-jp"));

                                                            msg.ContentType = "text/html";
                                                            msg.ContentTransferEncoding = "quoted-printable";
                                                            msg.Body = "<html><body>本文テキスト</body></html>";
                                                            [VB.Net]
                                                            Dim msg As New Exwarp.Net.RFC.MIME.MIMEMessage(System.Text.Encoding.GetEncoding("iso-2022-jp"))

                                                            msg.ContentType = "text/html"
                                                            msg.ContentTransferEncoding = "quoted-printable"
                                                            msg.Body = "<html><body>本文テキスト</body></html>"

                                                            [解説]

                                                            MIMEMessageのインスタンスを作成します。この際このメッセージに適用される文字セットを設定する必要があります。System.Text.Encoding.GetEncoding()メソッドを使って文字セットを指定します。

                                                            MIMEMessageのメディアタイプを設定します。ContentTypeプロパティに文字列を代入するだけでメディアタイプを変更できます。ContentTypeプロパティを操作する方法に加えて、SetHeaderFieldBody()メソッドを使う方法もあります。この場合

                                                            [C#]
                                                            msg.SetHeaderFieldBody("Content-Type","text/html",true);
                                                            [VB.Net]
                                                            msg.SetHeaderFieldBody("Content-Type","text/html",True)
                                                            のようになります。一つ目のパラメータは更新したいヘッダーフィールド名、二つ目のパラメータは更新するパラメータの値、三つ目のパラメータはヘッダーフィールドが存在しない場合に新規に作成するかどうかを表すbool値です。

                                                            ContentTransferEncodingプロパティを使ってメッセージボディの変換方法を指定できます。quoted-printableを指定するとBodyプロパティに与えられる文字列はquoted-printable形式に変換されます。base64を指定すると内部データはbase64形式に変換されます。

                                                            euc-jpなどの8ビット文字セットがメッセージに適用されている場合、Content-Transfer-Encodingヘッダーフィールドの値は自動的に調整されます。どのように調整されるかはMIMEMessageの関連するプロパティの状態により異なります。

                                                            メッセージボディを設定するためにBodyプロパティに文字列データを書き込みます。この際内部データはContent-Transfer-Encodingヘッダーフィールドの値により最も適切な方法で変換されます。

                                                            上のサンプルコードにより次のようなバイト列が生成されます。このバイト列はMessageSourceプロパティで取得できます。


                                                            Content-Type: text/html; charset=iso-2022-jp
                                                            Content-Transfer-Encoding: quoted-printable

                                                            <html><body>=1B$BK¥J8%F%-%9%H=1B(B</body></html>=
                                                            上記のバイト列イメージはバイト型配列をASCIIエンコーディングを使って文字列に変換しなおしたものです。
                                                            | technicals | 16:09 | comments(2111) | trackbacks(0) | - | - |
                                                            RFCMessageを操作する
                                                            0

                                                              RFCMessageは、RFC822/2822メッセージをカプセル化するオブジェクトです。

                                                              RFCMessageの使い方を簡単に紹介します。


                                                              ボディを設定する。


                                                              [C#]
                                                              Exwarp.Net.RFC.RFCMessage msg =
                                                                new Exwarp.Net.RFC.RFCMessage(System.Text.Encoding.ASCII);

                                                              msg.Body = "Hello Exwarp!!";

                                                              [解説]

                                                              RFCMessageのインスタンスを新しく作成し、RFCMessageのBodyプロパティに文字列を設定するだけでメッセージボディを変更できます。

                                                              コンストラクタにはこのRFCMessageで使用される文字セットをセットします。RFCMessageオブジェクトは非ASCII文字セットをサポートしませんので、通常System.Text.Encoding.ASCIIを用います。


                                                              ヘッダーフィールドを追加する


                                                              例えば、Toヘッダーフィールドに"friend@friend.com"を設定してみます。
                                                              msgは上のサンプルで使用したRFCMessageインスタンスを表します。
                                                              [C#]
                                                              msg.SetHeaderFieldBody("To","friend@friend.com",true);

                                                              [解説]

                                                              RFCMessageのSetHeaderFieldBody()メソッドを使用してヘッダーフィールドを書き換えます。

                                                              一つ目のパラメータは編集するヘッダーフィールドの名前を表す文字列です。

                                                              二つ目のパラメータは更新するヘッダーフィールドの値を表す文字列です。

                                                              三つ目のパラメータは、指定されたヘッダーフィールドが存在しない場合に新しくヘッダーフィールドを作成するかどうかを設定します。falseが設定されると例外が発生します。通常の使用ではtrueが使用されます。

                                                              | technicals | 13:15 | comments(1904) | trackbacks(0) | - | - |