メールの添付ファイルを取得できない場合がある

文書番号 : 37382     文書種別 : 不具合     登録日 : 2014/06/13     最終更新日 : 2019/06/20
文書を印刷する
対象製品
Secure iNetSuite for .NET 4.0J
状況
修正済み
詳細
次の場合にメールの添付ファイルを取得できません。

1.ContentTypeヘッダーの nameパラメータに引用符「"」なしで値が設定されている場合

 (例)
 Content-Type: image/jpg; name==?iso-2022-jp?B?GyRCPi5EOxsoQg==?=.jpg

 次のように、引用符「"」付きで設定されている場合は、添付ファイルを取得することができます。

 Content-Type: image/jpg; name="=?iso-2022-jp?B?GyRCPi5EOxsoQg==?=.jpg"

2.Content-Type: text/plain、Content-Disposition: inline で添付されている場合

 テキストファイルやCSVファイルなどのテキスト形式のファイルが Content-Type: text/plain、Content-Disposition: inline の設定で添付されている場合は、添付ファイルまたはリソースとして取得できません。
回避方法
本内容はService Pack 2(4.0.2014.0625)にて修正されました。
不具合を修正した最新のサービスパックをご使用ください。

上記2.のケースについては[制限]となります。
回避方法として下記のようなコードでファイルを取得します。

◎サンプルコード(VB)
' msg はDart.Mail.MailMessageです
For Each p As Dart.Mail.Part In msg.Parts
  ' テキストタイプで「Content-Disposition」ヘッダがある場合は添付ファイルの可能性があると判断します
  If TypeOf p Is Dart.Mail.Textpart AndAlso p.Headers.ContainsKey("Content-Disposition") Then
    Dim tp As Dart.Mail.Textpart = DirectCast(p, Dart.Mail.Textpart)

    ' 配置タイプが「Inline」の場合(「Attachment」の場合は、通常の添付ファイルとして取得できます)
    If tp.ContentDisposition.Inline Then
      Dim filename As String = ""

      ' ContentDisposition.FileName または ContentType.Name からファイル名を取得します
      If tp.ContentDisposition.FileName IsNot Nothing Then
        filename = tp.ContentDisposition.FileName
      ElseIf tp.ContentType.Name IsNot Nothing Then
        filename = tp.ContentType.Name
      Else
        ' ファイル名が無い場合は、添付ファイルではないと判断します
        Continue For
      End If

      ' コンテンツの内容をファイルに保存します
      Using fs As New System.IO.FileStream(filename, System.IO.FileMode.Create)
        Dim body() As Byte

        If tp.TransferEncoding = Dart.Mail.TransferEncoding.Base64 Then
          Dim b64body As String = System.Text.Encoding.Default.GetString(tp.ToArray(False))
          body = Convert.FromBase64String(b64body)
        Else
          body = tp.Encoding.GetBytes(tp.ToString(False, False, Nothing))
        End If

        fs.Write(body, 0, body.Length)
      End Using
    End If

  End If
Next

◎サンプルコード(C#)
// msg はDart.Mail.MailMessageです
foreach (Dart.Mail.Part p in msg.Parts)
{
  // テキストタイプで「Content-Disposition」ヘッダがある場合は添付ファイルの可能性があると判断します
  if (p.GetType() == typeof(Textpart) && p.Headers.ContainsKey("Content-Disposition"))
  {
    Textpart tp = (Textpart)p;

    // 配置タイプが「Inline」の場合(「Attachment」の場合は、通常の添付ファイルとして取得できます)
    if (tp.ContentDisposition.Inline){
      string filename = "";

      // ContentDisposition.FileName または ContentType.Name からファイル名を取得します
      if (tp.ContentDisposition.FileName != null)
      {
        filename = tp.ContentDisposition.FileName;
      }
      else if (tp.ContentType.Name != null)
      {
        filename = tp.ContentType.Name;
      }
      else
      {
        // ファイル名が無い場合は、添付ファイルではないと判断します
        continue;
      }

      // コンテンツの内容をファイルに保存します
      using (System.IO.FileStream fs = new System.IO.FileStream(filename, System.IO.FileMode.Create))
      {
        Byte[] body;

        if (tp.TransferEncoding == TransferEncoding.Base64)
        {
          string b64body = System.Text.Encoding.Default.GetString(tp.ToArray(false));
          body = Convert.FromBase64String(b64body);
        }
        else
        {
          body = tp.Encoding.GetBytes(tp.ToString(false, false, null));
        }

        fs.Write(body, 0, body.Length);
      }
    }
  }
}