GrapeCity Secure Mail for .NET 4.0J
添付ファイルを保存する(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);
  }
}

 

 


© 2003, GrapeCity inc. All rights reserved.