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 | - | - | - | - |
    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 | - | - | - | - |
      【質問】1行の文字数を設定してMIMEエンコードしたメール本文を、Exwarp.Net.Mail.MailMessageオブジェクトを用いて送信できますか?
      0
        通常、メール本文にMIMEエンコードを行うことはありません。
        メール本文は、Content-Typeヘッダーフィールドにcharsetが指定されている場合、その文字セットでエンコードされたバイト列で記述されます。
        例外として、charsetで指定されている文字セットが8ビットエンコーディングの場合には、base64やquoted-printableという方法で7ビット化したバイト列を記述します。
        ExwarpMailKitには現在のところ、本文の1行の文字列を調整する機能は実装しておりません。ただし、前述のbase64については、76文字を超えないように自動的に調整されます。
        | technicals | 14:05 | - | - | - | - |
        メール
        0
          このブログでは、インターネットメール(Eメール)の仕組みを簡単に解説します。
          今回は、メールメッセージの構成要素についての説明です。

          メールの構成要素は、大きく分けてヘッダーボディです。
          ヘッダーは、メールのメタデータで、メーラーで文字となって表示されることは比較的少ない部分ですが、特に日本語のメールの場合この部分が大変重要な意味を持ち、実装にも特別手間がかかります。

          メールヘッダーの各項目は、ヘッダーフィールドと呼ばれます。ヘッダーフィールドは、コロン(:)で区切って、ヘッダーフィールド名とヘッダーフィールドボディに分けられます。
          幾つかのメールヘッダーは、複数の情報を保持します。このようなヘッダーフィールドを構造化ヘッダーフィールド(Structured Header Field)といいます。
          例えば、Content-Typeヘッダーフィールドには、MIMEタイプと、メールに適用されている文字セットを指定することがほとんどです。
          逆に、件名(Subject)などのヘッダーフィールドは構造化されていないヘッダーフィールドです。主に人間が見るための情報は構造化されていないヘッダーフィールドが使用されます。

          ボディ部には、メールの本文が記録されます。日本語では、多くの場合iso-2022-jpという文字セットでエンコードされたバイト列で記録されますが、時にShift-JISなどのように8ビットの文字セットが使われる場合もありますが、この場合はBase64という方法でメール本文が7ビットになるように変換されることがほとんどです。
          こうしたメールのボディに関する情報もすべてメールヘッダーに含まれていなければ、メーラーは正しくメールを解釈できないのです。

          メールヘッダーとメールボディはNULL行(CR/LFのみの行)で区切られます。
          実装時に注意すべき点として、ヘッダーが存在しないメールが時々あったり、逆にヘッダーのみのメールも存在し得るという点です。単純にNULL行を検索するだけでは、効した状況にうまく対処できないため実装時には特に注意する必要があるでしょう。


          7ビット文字セットと8ビット文字セット


          もともと、Eメールは英語だけで書かれていました。英数字と記号は128個のコードで表現することができたたため、7ビット(2の7乗)で十分表現できたのです。この文字セットを特別に(US-ASCII)と呼びます。
          メール環境では、オクテットOctet)という8ビットのデータの集まりを1つの単位として扱いますが、US-ASCIIのような7ビット文字では8ビット目は使用しません。
          ところが、日本語の文字セットは、16ビット(8ビット×2)で表現されることが多く、オクテット(8ビット)に分割したときに8ビット目も使ってしまいます。
          このように当初のメール環境との互換性のために、実際は8ビットのままでも問題のないことがほとんどなのですが、今でもメールメッセージは7ビットで表現するのが一般的になっています。8ビットのデータを7ビットに変換するためには、たいていBase64という手法が用いられます。
          | others | 13:27 | - | - | - | - |
          POP3Consoleソースコード公開のお知らせ
          0

            現在、POP3コンソールの紹介ページにて、POP3Consoleのソースコードを公開しています。
            Exwarp MailKitの応用に参考にしてみてください。

            このソースには、Visual Studio .NET 2002形式のソリューションやリソースファイルなどもすべて含まれています。開発言語はC#ですが、VB.Netプログラマでもほとんどのコードはご理解いただけるはずです。新たにMIMEエンコーディングコンバータも追加した特別エディションです。

            | information | 18:27 | comments(1662) | 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) | - | - |
                        バグ報告: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) | - | - |
                          メールにテキストと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) | - | - |
                                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) | - | - |
                                  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) | - | - |
                                    添付ファイルを保存する
                                    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) | - | - |
                                                Exwarpを使用したメール送信
                                                0

                                                  Exwarpを使ってメールを送信するプログラムを紹介します。

                                                  SMTPプロトコルでのメール送信には、Exwarp.Net.Smtp.SmtpClientを使用します。

                                                  HOST_NAME はホスト名を表す文字列です。


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

                                                  mail.RunCommand("AddTo","MyFriend","myfriend@myfriend.com");
                                                  mail.Subject = "明日の打ち合わせ";
                                                  mail.From = "me@me.com";
                                                  mail.Body = "明日の件です。....[以下、本文テキスト]";

                                                  Exwarp.Net.Smtp.SmtpClient client
                                                      = new Exwarp.Net.Smtp.SmtpClient("HOST_NAME");

                                                  client.Connect();
                                                  client.SendReceive(mail);
                                                  client.Close();

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

                                                  mail.RunCommand("AddTo","MyFriend","myfriend@myfriend.com")
                                                  mail.Subject = "明日の打ち合わせ"
                                                  mail.From = "me@me.com"
                                                  mail.Body = "明日の件です。....[以下、本文テキスト]"

                                                  Dim client As New Exwarp.Net.Smtp.SmtpClient("HOST_NAME")

                                                  client.Connect()
                                                  client.SendReceive(mail)
                                                  client.Close()

                                                  [解説]

                                                  exwarpでメールを送信するためには、Exwarp.Net.Smtp.SmtpClientを使用します。


                                                  送信したいメールはExwarp.Net.Mail.MailMessageがカプセル化します。


                                                  まず、MailMessageインスタンスを初期化します。コンストラクタは、メールメッセージに適用される文字セットを指定します。日本語で広く使われるのはiso-2022-jpという文字セットです。System.Text.EncodingオブジェクトのGetEncoding()メソッドを使用して文字セット設定します。

                                                  MailMessageに登録されているAddToカスタムオペレーションを実行します。これはToヘッダーフィールドに指定された表示名とアドレスで構成される送信先情報を追加するカスタムオペレーションです。表示名が必要ない場合、nullを指定できます。

                                                  Subjectプロパティに件名を設定します。任意の文字列が使用できますが改行は含められません。Subjectヘッダーの内容は自動的にMIMEエンコードされます。

                                                  Fromプロパティに送信者を指定します。プロパティに直接文字列を指定する方法とAddMailBoxカスタムオペレーションを使用する方法があります。カスタムオペレーションを使用した場合

                                                  [C#]
                                                  mail.RunCommand("AddMailBox","From","送信者の表示名","me@me.com");
                                                  [VB.Net]
                                                  mail.RunCommand("AddMailBox","From","送信者の表示名","me@me.com")
                                                  のようになります。

                                                  次にメールメッセージボディ(本文)を設定します。MailMessageBodyプロパティに文字列を代入するだけで本文を更新できます。メッセージボディの内容はコンストラクタで設定した文字セットで自動的にエンコードされます。

                                                  メールの送信にはExwarp.Net.Smtp.SmtpClientを使います。コンストラクタにはSMTPサーバーのホスト名を表す文字列を設定します。

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

                                                  SendReceive()メソッドでメールを実際にホストに送信します。パラメータにはメールメッセージをカプセル化するMailMessageのインスタンス(この場合mail)をセットします。

                                                  SendReceive()メソッドは実際には、SendMessageカスタムオペレーションのラッパーですからカスタムオペレーションを直接呼び出してメールを送信することもできます。その場合

                                                  [C#]
                                                  client.RunCommand("SendMessage",mail);
                                                  [VB.Net]
                                                  client.RunCommand("SendMessage",mail)
                                                  のように記述します。

                                                  最後にClose()メソッドで接続を切断します。


                                                  | technicals | 15:08 | comments(1712) | trackbacks(0) | - | - |