はじめに
仕事でDBのデータからグラフを作ってそれをインライン画像で毎日メール送信するプログラムをコンソールで作ったので、知見として記す
環境
- OS:WIndows10
- 開発環境:Visual Studio 2010(.Net Framework 4.0)
コードと解説
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | '.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) '以後、送信処理 '調べれば出るのでここでは省略 |
- メールオブジェクト作成
- 各プロパティにメールのデータを入れる
- 本文を作成するクラスなり関数なりで画像タグを平文で挿入する
- メール本文はHTML形式で作成のこと。
- HTMLメールオブジェクトを作成して、そこに画像を追加する
- メールオブジェクトに先程のHTMLメールオブジェクトを追加する
- 送信
- 空メールを送信するプログラムを作成
- HTMLメールを送信するプログラムに拡張
- 今回の画像を添付するプログラムに拡張
0 件のコメント :
コメントを投稿