[VB.net] 自動メール送信のプログラムでメールにインライン画像を添付する(複数添付対応)

はじめに

仕事でDBのデータからグラフを作ってそれをインライン画像で毎日メール送信するプログラムをコンソールで作ったので、知見として記す

環境

  • OS:WIndows10
  • 開発環境:Visual Studio 2010(.Net Framework 4.0)

コードと解説

'.NETでメールを使うときに必要なライブラリ
Imports System.Net.Mail
Imports System.Net.Mime
Imports System.IO

'メールオブジェクト作成
dim mailmsg = new MailMessage()
'メール本文を格納する変数
'インライン画像はHTMLメール専用なので、本文はHTML形式で作る
dim mailtext as string
'**************************************************************
'メールオブジェクトの送信に必要な各種プロパティは省略
'メールの本文を入れていく
'**************************************************************

'複数添付する場合は都度実施のこと
'メール本文のimgタグのsrcに必要な一意のIDを生成する
dim key as string = Guid.NewGuid.ToString
'メール本文に添付する画像のimgタグを追加
mailtext += mailtext + "<img src=""cid:" & key & """/>"

'memorystreamに画像を一旦入れる
dim imgms = new MemoryStream
'**************************************************************
'画像をimgmsに読み込む。ファイルからでもbyte列からでも可能
'やり方はここでは省略
'imgmsに画像データを入れたとする
'**************************************************************

'HTMLメールオブジェクト作成(正確には違うけど)
dim htmlView As AlternateView
'HTMLメールを生成する(これ以降メール本文を追加・変更することはできない)
htmlView = AlternateView.CreateAlternateViewFromString(mailtext, Nothing, MediaTypeNames.Text.Html)

'複数画像を追加する場合はここから[loop end]まで各画像に対してループさせる
'Thunderbirdだと画像非表示になる対策で一度バイナリ化してMemoryStreamに格納
Dim byteimg As Byte()
byteimg = imgms.ToArray
Dim ms As New MemoryStream(byteimg)
'HTMLメールの画像タグに対応する画像本体を格納するリンクリソースを作成
'画像形式は都度変更してください
Dim res As New LinkedResource(ms, System.Net.Mime.MediaTypeNames.Image.Jpeg)
'画像タグの追加で使用した一意のIDを付与
res.ContentId = key
'HTMLメールオブジェクトに先程のリンクリソースを追加
htmlView.LinkedResources.Add(res)
'[loop end]

'メールオブジェクトにHTMLメールオブジェクトを追加する
mailmsg.AlternateViews.Add(htmlView)

'以後、送信処理
'調べれば出るのでここでは省略

  1. メールオブジェクト作成
  2. 各プロパティにメールのデータを入れる
  3. 本文を作成するクラスなり関数なりで画像タグを平文で挿入する
    • メール本文はHTML形式で作成のこと。
  4. HTMLメールオブジェクトを作成して、そこに画像を追加する
  5. メールオブジェクトに先程のHTMLメールオブジェクトを追加する
  6. 送信
初めて作るなら
  1. 空メールを送信するプログラムを作成
  2. HTMLメールを送信するプログラムに拡張
  3. 今回の画像を添付するプログラムに拡張
の手順で作ったほうがいいです。

0 件のコメント :

コメントを投稿