質問編集履歴

3

業務内容漏洩リスクへの対応。

2023/09/29 06:42

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -1,208 +1,7 @@
1
- ### 実現したいこと
1
+ ### 2023年9月29日 修正
2
+ 業務内容漏洩リスクを指摘されたため、質問の内容を伏せさせていただきます。
3
+ 協力していただいた方々、大変申し訳ありません。
2
4
 
3
- VB6からDLLを呼び出してメール送信を実行していました。
4
- すが、そDLL内動作仕様を変える必要が出てきまし
5
+ 動作はきたもののまだテストはていない状況です
6
+ テストが通り世に出回りましたら、ブログなど何らかの方法で公開させていただきます。
5
7
 
6
- VB6はソースコードは残っているもののサードパーティモジュールが既に存在せず、開発環境を作成することができないため、VB6側は変更できません。
7
-
8
- DLL入れ替えのみによって実現したく、前回質問のお助けにより、
9
- C#.NETにてDLLを作成し、VB6側からの呼び出しまでは成功しました。
10
- https://teratail.com/questions/n25uag7iu7y5t4
11
-
12
-
13
- しかし、VB6から実行すると
14
- ```
15
- エラーが発生しました: ファイルまたはアセンブリ 'System.Runtime.CompilerServices.Unsafe, Version=4.0.4.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'、またはその依存関係の 1 つが読み込めませんでした。見つかったアセンブリのマニフェスト定義はアセンブリ参照に一致しません。 (HRESULT からの例外:0x80131040)
16
- ```
17
- となります。
18
-
19
- MailKitなど別DLLもVB6の実行フォルダに置いてはいるのですが、参照ができないようです。
20
-
21
- ### 追記
22
- ログを埋め込んでみると、
23
- ```
24
- var message = new MimeMessage();
25
- ```
26
- のところで落ちているようです。
27
- C#で作成したdllからは参照できていないようです。
28
-
29
- ### VB6
30
- VB6側の定義は、このようにして、smtpmail.dllを呼び出しています。
31
- ```
32
- 'メール送信関数定義
33
- Private Declare Function SendMail Lib "smtpmail" _
34
- (sServer As String, sTo As String, sFrom As String, _
35
- sSubject As String, sBody As String, sFile As String) As String
36
- ```
37
-
38
- ### C#
39
- 下記のように実装し、DllExport.bat を使う方法でsmtpmail.dllを作成しました。
40
- 「C++からC# DLL を直接利用する方法」
41
- https://qiita.com/Midoliy/items/58d56e202f104ebf867a
42
-
43
- ```
44
- using System;
45
- using System.IO;
46
- using System.Threading.Tasks;
47
- using MimeKit;
48
- using MimeKit.Text;
49
- using MailKit.Net.Smtp;
50
- using MailKit.Security;
51
- using System.Runtime.InteropServices;
52
- using System.Security.Cryptography.X509Certificates;
53
- using System.Net.Security;
54
- using System.Text;
55
- using System.Linq;
56
- using System.Text.RegularExpressions;
57
-
58
- namespace smtpmail
59
- {
60
- public class smtpmail
61
- {
62
-
63
- // VB6から呼び出す関数の宣言
64
- [DllExport(CallingConvention.StdCall)]
65
- public static IntPtr SendMail(
66
- ref IntPtr szServer, ref IntPtr szTo, ref IntPtr szFrom,
67
- ref IntPtr szSubject, ref IntPtr szBody, ref IntPtr szFile)
68
- {
69
- ```
70
-
71
- ファイル構成
72
- 同一フォルダ内
73
- ```
74
- mailsys.exe(VB6アプリケーション)
75
- smtpmail.dll(C#で作成したレガシーDLL。メール送信を担う)
76
- BouncyCastle.Cryptography.dll(ビルドフォルダに出力されたdll。以下同様)
77
- MailKit.dll
78
- MimeKit.dll
79
- System.Buffers.dll
80
- System.Formats.Asn1.dll
81
- System.Memory.dll
82
- System.Numerics.Vectors.dll
83
- System.Runtime.CompilerServices.Unsafe.dll
84
- System.Threading.Tasks.Extensions.dll
85
- System.ValueTuple.dll
86
- ```
87
-
88
- ### 2023年9月24日の状況
89
-
90
- smtpmail.dll内でログを仕込みましたが、VB6からのパラメータは受け取ることが出来ています。
91
- そのあとのメール送信処理で落ちている模様です。
92
-
93
-
94
- ### 2023年9月26日時点 VB6→C#で作成したレガシーDLL→C#で作成したMailkit送信DLLの3つに分けてみました。
95
- C#で作成したレガシーDLLはVB6とMailkit送信DLLの橋渡しを担います。
96
-
97
- ### VB6(開発環境作成できないため変更不可)
98
- ```
99
- 'メール送信関数定義
100
- Private Declare Function SendMail Lib "smtpmail" _
101
- (sServer As String, sTo As String, sFrom As String, _
102
- sSubject As String, sBody As String, sFile As String) As String
103
- ```
104
-
105
- ### C#で作成したレガシーDLL
106
- DllExport.batでVB6から呼び出せるようにしています。
107
- このやり方だとMailkit使用時に例外になるため、Mailkit送信処理はDLLに分けました。
108
- ```
109
- namespace smtpmail
110
- {
111
- public class smtpmail
112
- {
113
- // VB6のメール送信関数定義 これでdllのメール送信関数を呼んでいる。
114
- //Private Declare Function SendMail Lib "smtpmail" _
115
- // (szServer As String, szTo As String, szFrom As String, _
116
- // szSubject As String, szBody As String, szFile As String) As String
117
-
118
- // VB6から呼び出す関数の宣言
119
- [DllExport(CallingConvention.StdCall)]
120
- public static IntPtr SendMail(
121
- ref IntPtr szServer, ref IntPtr szTo, ref IntPtr szFrom,
122
- ref IntPtr szSubject, ref IntPtr szBody, ref IntPtr szFile)
123
- {
124
-
125
- try
126
- {
127
- ==== 中略(文字コードをutf8にするなど) ====
128
-
129
- // 正常なら1、異常なら2を返す
130
- return ResultString(SendMail(utf8sSubject, utf8sBody, sendName, sendAddress, "", utf8sTo, smtpSrv, portNo, mailAccount, mailPassword));
131
- }
132
- catch (Exception ex)
133
- {
134
- return ResultString("2");
135
- }
136
- }
137
-
138
- // Mailkit送信DLLを呼び出す
139
- [DllImport("mailkitsendmail.dll",CharSet = CharSet.Unicode)]
140
- private static extern string SendMail(
141
- string Subject,
142
- string BodyText,
143
- string From_Name,
144
- string From_Address,
145
- string To_Name,
146
- string To_Address,
147
- string SMTPServer,
148
- int Port,
149
- string Auth_Username,
150
- string Auth_Password);
151
- }
152
- }
153
- ```
154
-
155
- ### C#で作成したMailkit送信DLL
156
- ```
157
- namespace mailkitsendmail
158
- {
159
- [Guid("XXXXXX-XXXXX-XXXXX-XXXX-XXXXXXX")]
160
- [InterfaceType(ComInterfaceType.InterfaceIsDual)]
161
- public interface Imailkitsendmail
162
- {
163
- [ComVisible(true)] // COM相互運用を有効にする
164
- string SendMail(
165
- string Subject,
166
- string BodyText,
167
- string From_Name,
168
- string From_Address,
169
- string To_Name,
170
- string To_Address,
171
- string SMTPServer,
172
- int Port,
173
- string Auth_Username,
174
- string Auth_Password);
175
- }
176
-
177
- [Guid("XXXXXX-XXXXX-XXXXX-XXXX-XXXXXXX")]
178
- [ComVisible(true)] // COM相互運用を有効にする
179
- [ClassInterface(ClassInterfaceType.None)]
180
- [ComDefaultInterface(typeof(Imailkitsendmail))]
181
- public class mailkitsendmail:Imailkitsendmail
182
- {
183
- [ComVisible(true)] // COM相互運用を有効にする
184
- public string SendMail(
185
- string Subject,
186
- string BodyText,
187
- string From_Name,
188
- string From_Address,
189
- string To_Name,
190
- string To_Address,
191
- string SMTPServer,
192
- int Port,
193
- string Auth_Username,
194
- string Auth_Password)
195
- {
196
- === 以下送信処理実装===
197
- ```
198
- COMアセンブリ登録x86指定でビルドし
199
- dll作成後に、COMオブジェクトを登録しました。
200
- ```
201
- regasm /codebase mailkitsendmail.dll
202
- ```
203
- ### 2023年9月26日時点 現在の状況
204
- 橋渡し用のDLLのログからは下記エラーが出力されていました。
205
- メール送信用の関数が見つからないようです。
206
- ```
207
- エラーが発生しました: DLL 'mailkitsendmail.dll' の 'SendMail' というエントリ ポイントが見つかりません。
208
- ```

2

2023年9月26日にレガシーDLLは送信DLLの橋渡しとすることを試してみました。

2023/09/26 06:05

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -85,7 +85,124 @@
85
85
  System.ValueTuple.dll
86
86
  ```
87
87
 
88
- ### 現在の状況
88
+ ### 2023年9月24日の状況
89
89
 
90
90
  smtpmail.dll内でログを仕込みましたが、VB6からのパラメータは受け取ることが出来ています。
91
91
  そのあとのメール送信処理で落ちている模様です。
92
+
93
+
94
+ ### 2023年9月26日時点 VB6→C#で作成したレガシーDLL→C#で作成したMailkit送信DLLの3つに分けてみました。
95
+ C#で作成したレガシーDLLはVB6とMailkit送信DLLの橋渡しを担います。
96
+
97
+ ### VB6(開発環境作成できないため変更不可)
98
+ ```
99
+ 'メール送信関数定義
100
+ Private Declare Function SendMail Lib "smtpmail" _
101
+ (sServer As String, sTo As String, sFrom As String, _
102
+ sSubject As String, sBody As String, sFile As String) As String
103
+ ```
104
+
105
+ ### C#で作成したレガシーDLL
106
+ DllExport.batでVB6から呼び出せるようにしています。
107
+ このやり方だとMailkit使用時に例外になるため、Mailkit送信処理はDLLに分けました。
108
+ ```
109
+ namespace smtpmail
110
+ {
111
+ public class smtpmail
112
+ {
113
+ // VB6のメール送信関数定義 これでdllのメール送信関数を呼んでいる。
114
+ //Private Declare Function SendMail Lib "smtpmail" _
115
+ // (szServer As String, szTo As String, szFrom As String, _
116
+ // szSubject As String, szBody As String, szFile As String) As String
117
+
118
+ // VB6から呼び出す関数の宣言
119
+ [DllExport(CallingConvention.StdCall)]
120
+ public static IntPtr SendMail(
121
+ ref IntPtr szServer, ref IntPtr szTo, ref IntPtr szFrom,
122
+ ref IntPtr szSubject, ref IntPtr szBody, ref IntPtr szFile)
123
+ {
124
+
125
+ try
126
+ {
127
+ ==== 中略(文字コードをutf8にするなど) ====
128
+
129
+ // 正常なら1、異常なら2を返す
130
+ return ResultString(SendMail(utf8sSubject, utf8sBody, sendName, sendAddress, "", utf8sTo, smtpSrv, portNo, mailAccount, mailPassword));
131
+ }
132
+ catch (Exception ex)
133
+ {
134
+ return ResultString("2");
135
+ }
136
+ }
137
+
138
+ // Mailkit送信DLLを呼び出す
139
+ [DllImport("mailkitsendmail.dll",CharSet = CharSet.Unicode)]
140
+ private static extern string SendMail(
141
+ string Subject,
142
+ string BodyText,
143
+ string From_Name,
144
+ string From_Address,
145
+ string To_Name,
146
+ string To_Address,
147
+ string SMTPServer,
148
+ int Port,
149
+ string Auth_Username,
150
+ string Auth_Password);
151
+ }
152
+ }
153
+ ```
154
+
155
+ ### C#で作成したMailkit送信DLL
156
+ ```
157
+ namespace mailkitsendmail
158
+ {
159
+ [Guid("XXXXXX-XXXXX-XXXXX-XXXX-XXXXXXX")]
160
+ [InterfaceType(ComInterfaceType.InterfaceIsDual)]
161
+ public interface Imailkitsendmail
162
+ {
163
+ [ComVisible(true)] // COM相互運用を有効にする
164
+ string SendMail(
165
+ string Subject,
166
+ string BodyText,
167
+ string From_Name,
168
+ string From_Address,
169
+ string To_Name,
170
+ string To_Address,
171
+ string SMTPServer,
172
+ int Port,
173
+ string Auth_Username,
174
+ string Auth_Password);
175
+ }
176
+
177
+ [Guid("XXXXXX-XXXXX-XXXXX-XXXX-XXXXXXX")]
178
+ [ComVisible(true)] // COM相互運用を有効にする
179
+ [ClassInterface(ClassInterfaceType.None)]
180
+ [ComDefaultInterface(typeof(Imailkitsendmail))]
181
+ public class mailkitsendmail:Imailkitsendmail
182
+ {
183
+ [ComVisible(true)] // COM相互運用を有効にする
184
+ public string SendMail(
185
+ string Subject,
186
+ string BodyText,
187
+ string From_Name,
188
+ string From_Address,
189
+ string To_Name,
190
+ string To_Address,
191
+ string SMTPServer,
192
+ int Port,
193
+ string Auth_Username,
194
+ string Auth_Password)
195
+ {
196
+ === 以下送信処理実装===
197
+ ```
198
+ COMアセンブリ登録x86指定でビルドし
199
+ dll作成後に、COMオブジェクトを登録しました。
200
+ ```
201
+ regasm /codebase mailkitsendmail.dll
202
+ ```
203
+ ### 2023年9月26日時点 現在の状況
204
+ 橋渡し用のDLLのログからは下記エラーが出力されていました。
205
+ メール送信用の関数が見つからないようです。
206
+ ```
207
+ エラーが発生しました: DLL 'mailkitsendmail.dll' の 'SendMail' というエントリ ポイントが見つかりません。
208
+ ```

1

エラー発生箇所を追記しました。

2023/09/22 09:06

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -18,7 +18,13 @@
18
18
 
19
19
  MailKitなど別DLLもVB6の実行フォルダに置いてはいるのですが、参照ができないようです。
20
20
 
21
-
21
+ ### 追記
22
+ ログを埋め込んでみると、
23
+ ```
24
+ var message = new MimeMessage();
25
+ ```
26
+ のところで落ちているようです。
27
+ C#で作成したdllからは参照できていないようです。
22
28
 
23
29
  ### VB6
24
30
  VB6側の定義は、このようにして、smtpmail.dllを呼び出しています。