GrapeCity Secure Mail for .NET 4.0J > メールの受信(POP) > 添付ファイルを保存する(POP) |
POPサーバーから取得したメールに添付されていたファイルは、MailMassageクラスのAttachmentsプロパティ(Attachment型のコレクション)に格納されています。
以下のサンプルコードでは、For Each文でAttachmentsプロパティの各添付ファイルにアクセスしています。Contentプロパティ(System.IO.FileInfo型)のMoveToメソッドを使用して、任意のフォルダにファイルを移動しています。
|
Imports Dart.Mail Imports Dart.Mail.Pop Private Sub getMessages(ByVal sender As Object) ' サーバー上に保存されているすべてのメールを処理します。 For Each popMessage As PopMessage In Pop1.Messages Try ' メールを取得します。 popMessage.Get() ' 取得したメールをファイルに保存します。 popMessage.Message.Save("c:\temp\" & (popMessage.Message.Date).ToString("yyyyMMdd_hhmmss") & ".eml") ' メールに添付されているすべてのファイルを処理します。 For Each attachment As Attachment In popMessage.Message.Attachments ' 添付ファイルを保存します。 If attachment.FileName IsNot Nothing Then attachment.Content.MoveTo(getUniqueName("c:\temp\" & attachment.FileName)) End If Next attachment Catch ex As Exception Pop1.Marshal(New Exception(popMessage.Id & ": " & ex.Message, ex)) End Try Next popMessage ' POPサーバーとの接続を閉じます。 Pop1.Close() End Sub ' 同名のファイルが存在したとき、ユニークなファイル名に変更します。 Private Function getUniqueName(ByVal filename As String) As String Dim count As Integer = -1 Dim extensionLocation As Integer = filename.LastIndexOf(".") Dim newName As String = filename Do While File.Exists(newName) count += 1 If extensionLocation = -1 Then newName = filename & "(" & count.ToString() & ")" Else newName = filename.Substring(0, extensionLocation) & "(" & count.ToString() & ")" & filename.Substring(extensionLocation) End If Loop Return newName End Function
using Dart.Mail; using Dart.Mail.Pop; private void getMessages(object sender) { // サーバー上に保存されているすべてのメールを処理します。 foreach (PopMessage popMessage in pop1.Messages) { try { // メールを取得します。 popMessage.Get(); // 取得したメールをファイルに保存します。 popMessage.Message.Save(@"c:\temp\" + (popMessage.Message.Date).ToString("yyyyMMdd_hhmmss") + ".eml"); // メールに添付されているすべてのファイルを処理します。 foreach (Attachment attachment in popMessage.Message.Attachments) { // 添付ファイルを保存します。 if (attachment.FileName != null) { attachment.Content.MoveTo(getUniqueName(@"c:\temp\" + attachment.FileName)); } } } catch (Exception ex) { pop1.Marshal(new Exception(popMessage.Id.ToString() + ": " + ex.Message, ex)); } } // POPサーバーとの接続を閉じます。 pop1.Close(); } // 同名のファイルが存在したとき、ユニークなファイル名に変更します。 private string getUniqueName(string filename) { int count = -1; int extensionLocation = filename.LastIndexOf("."); string newName = filename; while (System.IO.File.Exists(newName)) { count ++; if (extensionLocation == -1) { newName = filename + "(" + count.ToString() + ")"; } else { newName = filename.Substring(0, extensionLocation) + "(" + count.ToString() + ")" + filename.Substring(extensionLocation); } } return newName; }
PopサーバーおよびImapサーバーから添付ファイルがあるメールを取得した場合や、MailMessage.Openメソッドで添付ファイル付きのメールをMailMessageオブジェクトに展開した場合には、デフォルトの状態では添付ファイルは Dart.Mail.Attachment.Directoryプロパティによって返されたフォルダに一時ファイルとして保存されます。
Dart.Mail.Attachment.Directoryプロパティのデフォルトは、アプリケーションの作業ディレクトリにある"Attachments”サブフォルダです。
<例> <アプリケーションの作業ディレクトリ>\Attachments |
Dart.Mail.Attachment.Directoryプロパティには任意のディレクトリを指定することができます。
一時フォルダに作成されたファイルは、あくまで一時ファイルのため、一時的なファイル名で作成されます。作成された一時ファイルは、Attachment.Content.MoveToメソッドで任意のローカルフォルダに保存された場合や、メールを展開した MailMessageオブジェクトを破棄(Dispose)した場合に削除されます。
また、メールを受信した Dart.Mail.Popオブジェクトや Dart.Mail.Imapオブジェクトを破棄(Dispose)した場合は、一時フォルダごと削除されます。
一時ファイルを作成せずに、添付ファイルをメモリ上に格納する場合は、Dart.Mail.Attachment.DecodeToMemoryプロパティをTrueに設定します。
DecodeToMemoryプロパティは静的な(Staticな)プロパティですので、たとえばForm_Loadイベントなどで、下記のようなコードで設定します。
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Dart.Mail.Attachment.DecodeToMemory = True End Sub
private void Form1_Load(object sender, EventArgs e) { Dart.Mail.Attachment.DecodeToMemory = true; }
DecodeToMemoryプロパティをTrueに設定し、添付ファイルがメモリ上に保存された場合、Attachment.Contentプロパティはnull(Visual BasicではNothing)を返します。この場合、添付ファイルをローカルフォルダに保存するには、Attachment.GetContentStreamメソッドを使用します。Attachment.Content.MoveToメソッドは使用できませんので、ご注意ください。
' msg(MailMessageクラスのオブジェクト)に添付されたファイルを保存します。 For Each att As Dart.Mail.Attachment In msg.Attachments Using f As New System.IO.FileStream("c:\temp\" & att.FileName, IO.FileMode.Create) att.GetContentStream.CopyTo(f) End UsingNext
// msg(MailMessageクラスのオブジェクト)に添付されたファイルを保存します。 foreach (Dart.Mail.Attachment att in msg.Attachments) { using (System.IO.FileStream f = new System.IO.FileStream(@"c:\temp\" + att.FileName, IO.FileMode.Create)) { att.GetContentStream.CopyTo(f); } }