下記サイト内【CDOを使う方法】を参照してメール送信を行うプログラムを作成しました。
サイト
現在実装しているソースでメール送信ができることは確認できたのですが、
Content-Typeがtext/plainになっており、一部文字列が文字化けする可能性があるのでISO-2022-JPに変更しようと思いました。
しかしContent-Typeのパラメータの設定ができずに変更できません。
なにか対処方はありますでしょうか
開発環境
visual studio community 2019
実装ソース
C#
1//メール送信処理 2Type t = Type.GetTypeFromProgID("CDO.Message"); 3object cdo = Activator.CreateInstance(t); 4//送り元 5t.InvokeMember("From", System.Reflection.BindingFlags.SetProperty, null, cdo, new object[] { "***@gmail.com" }); 6//送り先 7t.InvokeMember("To", System.Reflection.BindingFlags.SetProperty, null, cdo, new object[] { "***@gmail.com" }); 8//メールタイトル 9t.InvokeMember("Subject", System.Reflection.BindingFlags.SetProperty, null, cdo, new object[] { "testtitle" }); 10//メール本文 11t.InvokeMember("Textbody", System.Reflection.BindingFlags.SetProperty, null, cdo, new object[] { "test" }); 12object conf = t.InvokeMember("Configuration", System.Reflection.BindingFlags.GetProperty, null, cdo, null); 13object fields = t.InvokeMember("Fields", System.Reflection.BindingFlags.GetProperty, null, conf, null); 14 15//smtpauthenticateを使用する場合は2を指定 16t.InvokeMember("Item", System.Reflection.BindingFlags.SetProperty, null, fields, new object[] { "http://schemas.microsoft.com/cdo/configuration/sendusing", 2 }); 17//SMTPサーバーを指定する 18t.InvokeMember("Item", System.Reflection.BindingFlags.SetProperty, null, fields, new object[] { "http://schemas.microsoft.com/cdo/configuration/smtpserver", "testserver" }); 19//ユーザー名指定 20t.InvokeMember("Item", System.Reflection.BindingFlags.SetProperty, null, fields, new object[] { "http://schemas.microsoft.com/cdo/configuration/sendusername", "test" }); 21//パスワード設定 22t.InvokeMember("Item", System.Reflection.BindingFlags.SetProperty, null, fields, new object[] { "http://schemas.microsoft.com/cdo/configuration/sendpassword", "test" }); 23//SSL設定 24t.InvokeMember("Item", System.Reflection.BindingFlags.SetProperty, null, fields, new object[] { "http://schemas.microsoft.com/cdo/configuration/smtpusessl", "true" }); 25//認証設定(1はbasic認証、2はNTLM認証) 26t.InvokeMember("Item", System.Reflection.BindingFlags.SetProperty, null, fields, new object[] { "http://schemas.microsoft.com/cdo/configuration/smtpauthenticate", 1 }); 27//タイムアウト時間設定 28//t.InvokeMember("Item", System.Reflection.BindingFlags.SetProperty, null, fields, new object[] { "http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout", 60 }); 29//ポート番号を指定する 30t.InvokeMember("Item", System.Reflection.BindingFlags.SetProperty, null, fields, new object[] { "http://schemas.microsoft.com/cdo/configuration/smtpserverport", 25 }); 31t.InvokeMember("Update", System.Reflection.BindingFlags.InvokeMethod, null, fields, new object[] { }); 32 33//送信する 34t.InvokeMember("Send", System.Reflection.BindingFlags.InvokeMethod, null, cdo, new object[] { });
下記リンクを参照して実装しています。
参照リンク
リンク
試しているソース
C#
1object textBodyPart = t.InvokeMember("TextBodyPart", System.Reflection.BindingFlags.GetProperty, null, cdo, null); 2 3//下記ソースでエラー発生 4t.InvokeMember("Item", System.Reflection.BindingFlags.SetProperty, null, textBodyPart, new object[] { "Charset", "ISO-2022-JP" });
エラー内容
System.Runtime.InteropServices.COMException (0x80020006): 名前が不明です。 (HRESULT からの例外:0x80020006 (DISP_E_UNKNOWNNAME))で
そもそもMember に `.` は含められないのでは……? むしろ `Fields` と同じパターンでやればいいだけでは?
ありがとうございます。
下記サイトにそれらしい情報があったので、試してみようと思います。
https://excel-ubara.com/excelvba4/EXCEL233.html
- urn:schemas:mailheader:content-type
t.InvokeMember("Item", System.Reflection.BindingFlags.SetProperty, null, fields, new object[] { "urn:schemas:mailheader:content-type", "ISO-2022-JP" });
こんな感じで実装してみてエラーは出なくなったんですが、
Content-Typeがtext/plainのままで変更しません。
設定方法に間違いがありますでしょうか
いや、実装ソースにある `Field` の取得方法と同じ方法で `TextBodyPart` を取得して、それに対して `Charset` を設定してみてはという意味合いです。
何度もすいません
object textBodyPart = t.InvokeMember("TextBodyPart", System.Reflection.BindingFlags.GetProperty, null, conf, null);
まずTextBodyPartを取得しようと上記の形で1行ソースを書いてみたのですが
エラーが発生します。
System.Runtime.InteropServices.COMException (0x80020006): 名前が不明です。 (HRESULT からの例外:0x80020006 (DISP_E_UNKNOWNNAME)
認識等間違いがありますでしょうか
すいません下記内容で取得はできました。
object textBodyPart = t.InvokeMember("TextBodyPart", System.Reflection.BindingFlags.GetProperty, null, cdo, null);
object textBodyPart = t.InvokeMember("Fields", System.Reflection.BindingFlags.GetProperty, null, cdo, null);
t.InvokeMember("Item", System.Reflection.BindingFlags.SetProperty, null, textBodyPart, new object[] { "Charset", "ISO-2022-JP" });
上記の形で記載してみてエラーは起きず送信は出来るのですが、
Content-Typeがtext/plainのままで変更されません。
Charsetの指定の方法がまちがっていますでしょうか
間違って `Fields` で取得していませんか?
むしろ、その進捗を 本文に反映した方がいいのでは……?すらある。
すいません間違えていました。
現在本文の試しているソースが最新の物です。
失礼しました。
本文に現在の状況を反映しました。
デバッグして TextBodyPart の型を確認してはどうでしょうか?(Item は Dictionary の暗黙的プロパティの筈なので
Console.WriteLine(textBodyPart.GetType());で取得したところ
System.__ComObjectと帰ってきました。
現在のtextBodyPartの内容も更新しておきます。
回答1件
あなたの回答
tips
プレビュー