The project of U-WA-
http://uwa.potetihouse.com/
戻る
TKMP.DLL   プログラミングTips

ファイルを画像データとして添付する

 画像ファイルを「添付ファイルを付けたメールを作成する」の方法でファイルに添付すると、 受信側のメーラーの大半がただのファイルとした扱ってしまいます。 添付したのが画像ファイルであることを伝えるには、添付ファイルのパートの Content-Typeに適切な情報を設定する必要があります。 TKMP.Writer.FilePartを使用する場合は、コンストラクタのインスタンス引数に MIMEType情報を設定することでメール作成時に自動的にContent-Typeに適切な値が設定されます。
 次のサンプルは「添付ファイルを付けたメールを作成する」とほとんど同じですが、 TKMP.Writer.FilePartクラスを作成するときに「image/jpeg」を引数とすることで、 ファイルパートが画像ファイルとして扱われるように情報を設定しています。
C#.NET
//送信メールの作成クラスを定義
TKMP.Writer.MailWriter writer = new TKMP.Writer.MailWriter();

//メールの実際の差出人
writer.FromAddress = "from@mail.example.jp";
//メールヘッダの差出人情報
writer.Headers.Add("From" , "from@mail.example.jp");

//メールの実際の宛先
writer.ToAddressList.Add("to@mail.example.jp");
//メールヘッダの宛先情報       
writer.Headers.Add("To" , "to@mail.example.jp");

//件名
writer.Headers.Add("Subject" , "画像添付テスト");


//本文のパートを作成
TKMP.Writer.TextPart part1 = new TKMP.Writer.TextPart("画像ファイルを添付したメールのテストです。");

//画像ファイルを持つ添付ファイルのパートを作成します。
//引数としてMIMETypeに「image/jpeg」を指定しヘッダ情報にファイルが画像データであることを追加します。
string filename = "test.jpg";
TKMP.Writer.FilePart part2 = new TKMP.Writer.FilePart(filename , "image/jpeg");

//本文と添付ファイルを持つ、マルチパートクラスを作成
TKMP.Writer.MultiPart mainpart = new TKMP.Writer.MultiPart(part1 , part2); 


//送信メール作成クラスに本文としてマルチパートを登録
writer.MainPart = mainpart;
VB.NET
'送信メールの作成クラスを定義
Dim writer As New TKMP.Writer.MailWriter

'メールの実際の差出人
writer.FromAddress = "from@mail.example.jp"
'メールヘッダの差出人情報
writer.Headers.Add("From", "from@mail.example.jp")

'メールの実際の宛先
writer.ToAddressList.Add("to@mail.example.jp")
'メールヘッダの宛先情報       
writer.Headers.Add("To", "to@mail.example.jp")

'件名
writer.Headers.Add("Subject", "画像添付テスト")


'本文のパートを作成
Dim part1 As New TKMP.Writer.TextPart("画像ファイルを添付したメールのテストです。")

'画像ファイルを持つ添付ファイルのパートを作成します。
'引数としてMIMETypeに「image/jpeg」を指定しヘッダ情報にファイルが画像データであることを追加します。
Dim filename As String = "test.jpg"
Dim part2 As New TKMP.Writer.FilePart(filename, "image/jpeg")

'本文と添付ファイルを持つ、マルチパートクラスを作成
Dim mainpart As New TKMP.Writer.MultiPart(part1, part2)


'送信メール作成クラスに本文としてマルチパートを登録
writer.MainPart = mainpart

 では、適切なMIMETypeはどのように求めればいいでしょうか? ファイルの種類ごとに対応付けした一覧を作成する方法もありますし、 定期的にファイルを送信する場合なら使用するデータの形式ついて調べておくだけでいいかもしれません。 しかし、ユーザーが好きなように添付ファイルを設定できるメーラーなどを作成したい場合、 なんとか自立的に情報を取得したいものです。
 次のサンプルは、直接TKMP.DLLとは関係しませんが、 .NET FrameworkからMIMEType情報の取得メソッドです。 このメソッドを実行するにはSystem.Drawingの名前空間を使用しているため、 コンソールアプリケーションなどを作成する場合は注意してください。
C#.NET
//画像ファイルからMIMETypeを求めるメソッド
//このメソッドはSystem.Drawingを使用しています
public static string GetMime(string filename)
{
    //ファイルの拡張子部分を取り出します
    string fe = System.IO.Path.GetExtension(filename).ToLower();
    
    //GDI+のイメージでコード情報を検索します
    foreach(System.Drawing.Imaging.ImageCodecInfo ic in System.Drawing.Imaging.ImageCodecInfo.GetImageDecoders())
    {
        //拡張子情報を検索します
        foreach(string s in ic.FilenameExtension.Split(';'))
        {
            if(s.ToLower().EndsWith(fe))
            {
                //拡張子が一致した場合にコーデックMIME情報を返します
                return ic.MimeType;
            }
        }           
    }
    //一致する情報がない場合
    return "application/octet-stream";

}
VB.NET
'画像ファイルからMIMETypeを求めるメソッド
'このメソッドはSystem.Drawingを使用しています
Public Shared Function GetMime(ByVal filename As String) As String
    'ファイルの拡張子部分を取り出します
    Dim fe As String = System.IO.Path.GetExtension(filename).ToLower()

    'GDI+のイメージでコード情報を検索します
    Dim ic As System.Drawing.Imaging.ImageCodecInfo
    For Each ic In System.Drawing.Imaging.ImageCodecInfo.GetImageDecoders()
        '拡張子情報を検索します
        Dim s As String
        For Each s In ic.FilenameExtension.Split(";"c)
            If s.ToLower().EndsWith(fe) Then
                '拡張子が一致した場合にコーデックMIME情報を返します
                Return ic.MimeType
            End If
        Next s
    Next ic
    '一致する情報がない場合
    Return "application/octet-stream"
End Function
VB.NETのコードはC#.NETを元に「C#.NET to VB.NET Translator」によって作成したものです

トップページへ移動
The project of U-WA-
http://uwa.potetihouse.com/