fc2ブログ

記事一覧

MailKit(2)

MailKit(2)

MailKit の続きです。


添付ファイルの送信(SMTP)

添付ファイルを送信します。MimeKit.MimePart を作成して、添付するファイルやファイル名、Encoding などを指定します。


// 本文
TextPart textPart = new TextPart(MimeKit.Text.TextFormat.Plain)
{
    Text = @"テスト送信です。"
};

// 添付ファイル
var file = @"E:\Book1.xlsx";
var attachment = new MimePart("application", "vnd.openxmlformats-officedocument.spreadsheetml.sheet")
{
    Content = new MimeContent(File.OpenRead(file)),
    ContentDisposition = new ContentDisposition(),
    ContentTransferEncoding = ContentEncoding.Base64,
    FileName = Path.GetFileName(file)
};

var multipart = new Multipart("mixed")
{
    textPart,
    attachment
};

message.Body = multipart;

Excel ファイルを添付してみました。MimePart を作成するときに Context-Type を指定するのですが、上記の様に記述するのが正解なのかよくわかりませんでした。 引数を省略すると application/octet-stream という Context-Type がセットされるのですが、それでも問題なく(私の SMTP サーバでは)送信できました。


Content には添付したいファイルを Stream にしてセットします。


MimePart を作成したら、Multipart を作成して TextPart と MimePart をセットして message.Body に渡します。SMTP サーバとの通信部分は前回と同じです。


メールの受信(POP3)

POP3 サーバからメールを受信します。とりあえずデコードもせず受け取るだけ。1メール=1ファイルで受信します。


using (var pop3 = new Pop3Client(new ProtocolLogger("pop3.log")))
{
    // 接続
    pop3.Connect("pop3.xxxxx.jp", 110, false);

    // 認証
    pop3.Authenticate("account", "password");

    for (int i = 0; i < pop3.Count; i++)
    {
        MimeMessage message = pop3.GetMessage(i);

        // メッセージをファイルに出力
        message.WriteTo(string.Format("{0}.msg", i));

        // メッセージをサーバから削除する場合は、以下の文をコメントアウトする
        //pop3.DeleteMessage(i);
    }

    // 切断
    pop3.Disconnect(true);
}

  1. Pop3Client を作成(引数にログファイル)
  2. ホスト名、ポート、SSLの使用の有無を指定して接続
  3. アカウントとパスワードを利用して認証
  4. メールを受信してファイルに出力
  5. 切断

という流れです。受信してサーバ上のメールを削除することも、残すことも可能です。


POP over SSL を使用する場合は、ポート番号は995を指定します。


MimeMessage には、以下のプロパティが用意されているので、特定のメッセージだけを処理することが可能です。


type name
MailboxAddress Sender
InternetAddressList From
InternetAddressList ReplyTo
InternetAddressList To
InternetAddressList Cc
InternetAddressList Bcc
string Subject
DateTimeOffset Date
MessageIdList References
string InReplyTo
string MessageId
Version MimeVersion
MimeEntity Body
string TextBody
string HtmlBody
HeaderList Headers
IEnumerable<MimeEntity> BodyParts
IEnumerable<MimeEntity> Attachments
MailboxAddress ResentSender
InternetAddressList ResentFrom
InternetAddressList ResentReplyTo
InternetAddressList ResentTo
InternetAddressList ResentCc
InternetAddressList ResentBcc
DateTimeOffset ResentDate
string ResentMessageId

添付ファイルの保存(POP3)

添付ファイルをデコードして保存します。MimeMessage.Attachments に格納されていますので、順次保存していきます。MimeMessage を受け取るところまでは同じです。


foreach(var attachment in message.Attachments)
{
    if(attachment is MessagePart)
    {
        var fileName = attachment.ContentDisposition.FileName ?? string.Forma(("attached{0}.eml",i);
        var messagePart = (MessagePart)attachment;
        using (var stream = File.Create(fileName))
        {
            messagePart.WriteTo(stream);
        }
    }
    else
    {
         var mimePart = (MimePart)attachment;
         var fileName = mimePart.FileName;
         using (var stream = File.Create(fileName))
         {
            mimePart.Content.DecodeTo(stream);
         }
     }
}

分かりやすくするためにいろいろ端折ってますが、MimeEntity(attachment)が MessagePart か MimePart かで処理が分かれます。


MessagePart の場合は、MimeEntity をキャストして attachment.ContentDisposition.FileName に値が設定されていればファイル名に使用し、設定されていない場合(= NULL)は、適当なファイル名を用意します。後はファイル名で Stream を作成して出力します。


MimePart の場合も、MimeEntity をキャストして FileName を取得、Stream を用意して Content.DecodeTo メソッドでデコードしながら出力します。


上記のようなコードだとファイル名が被ると思いますので、メッセージごとにフォルダを作るなどする必要がありますね。






コメント

コメントの投稿

非公開コメント