質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

3616閲覧

CDO.Messageを使用したC#のソースにContent-Typeを設定したい。

pleades

総合スコア15

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2021/06/30 01:23

編集2021/06/30 06:01

下記サイト内【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" });

textBodyPart生成直後の中身
イメージ説明

エラー内容
System.Runtime.InteropServices.COMException (0x80020006): 名前が不明です。 (HRESULT からの例外:0x80020006 (DISP_E_UNKNOWNNAME))で

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

juner

2021/06/30 01:33

そもそもMember に `.` は含められないのでは……? むしろ `Fields` と同じパターンでやればいいだけでは?
pleades

2021/06/30 02:58

t.InvokeMember("Item", System.Reflection.BindingFlags.SetProperty, null, fields, new object[] { "urn:schemas:mailheader:content-type", "ISO-2022-JP" }); こんな感じで実装してみてエラーは出なくなったんですが、 Content-Typeがtext/plainのままで変更しません。 設定方法に間違いがありますでしょうか
juner

2021/06/30 03:05

いや、実装ソースにある `Field` の取得方法と同じ方法で `TextBodyPart` を取得して、それに対して `Charset` を設定してみてはという意味合いです。
pleades

2021/06/30 03:22

何度もすいません object textBodyPart = t.InvokeMember("TextBodyPart", System.Reflection.BindingFlags.GetProperty, null, conf, null); まずTextBodyPartを取得しようと上記の形で1行ソースを書いてみたのですが エラーが発生します。 System.Runtime.InteropServices.COMException (0x80020006): 名前が不明です。 (HRESULT からの例外:0x80020006 (DISP_E_UNKNOWNNAME) 認識等間違いがありますでしょうか
pleades

2021/06/30 03:26

すいません下記内容で取得はできました。 object textBodyPart = t.InvokeMember("TextBodyPart", System.Reflection.BindingFlags.GetProperty, null, cdo, null);
pleades

2021/06/30 03:46

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の指定の方法がまちがっていますでしょうか
juner

2021/06/30 04:02

間違って `Fields` で取得していませんか?
juner

2021/06/30 04:03

むしろ、その進捗を 本文に反映した方がいいのでは……?すらある。
pleades

2021/06/30 05:02

すいません間違えていました。 現在本文の試しているソースが最新の物です。 失礼しました。 本文に現在の状況を反映しました。
juner

2021/06/30 05:11

デバッグして TextBodyPart の型を確認してはどうでしょうか?(Item は Dictionary の暗黙的プロパティの筈なので
pleades

2021/06/30 06:00

Console.WriteLine(textBodyPart.GetType());で取得したところ System.__ComObjectと帰ってきました。 現在のtextBodyPartの内容も更新しておきます。
guest

回答1

0

自己解決

下記ソースで実現できました。
juner様ご助言ありがとうございました。

C#

1//TextBodyPart取得 2object textBodyPart = t.InvokeMember("TextBodyPart", System.Reflection.BindingFlags.GetProperty, null, cdo, null); 3//文字コード変更 4t.InvokeMember("Charset", System.Reflection.BindingFlags.SetProperty, null, textBodyPart, new object[] { "ISO-2022-JP" });

投稿2021/07/01 00:49

pleades

総合スコア15

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問