質問するログイン新規登録

回答編集履歴

3

utf-8文字列ならそのままでいける旨を追記

2018/03/03 23:32

投稿

HARQ
HARQ

スコア181

answer CHANGED
@@ -49,4 +49,7 @@
49
49
 
50
50
  Hello World
51
51
  ```
52
- あとは受信側のメーラー次第かなと。
52
+ あとは受信側のメーラー次第かなと。
53
+
54
+ ---
55
+ 上では自前のencodeを実現するために細々とやりましたが、utf-8のBASE64ならsubjectへutf-8文字列を代入するだけで、あとは上手くやってくれたはず……。

2

コード例追加など

2018/03/03 23:31

投稿

HARQ
HARQ

スコア181

answer CHANGED
@@ -1,12 +1,52 @@
1
1
  先日[別の質問](https://teratail.com/questions/115221)で提示させて頂いた、[MimeKit/Rfc2047.cs](https://github.com/jstedfast/MimeKit/blob/cde045500be487a3002bae522cf93338cc1ef861/MimeKit/Utils/Rfc2047.cs)を一読されるようお勧めします。
2
-
3
2
  EncodePhrase() または EncodeText()
4
3
  -> Encode()
5
4
  -> AppendEncodedWord()
6
5
  あたりの流れが参考になると思います。
7
6
 
8
7
  AppendEncodedWord()では、942行目の
8
+ ```
9
- ```if (CharsetRequiresBase64(charset) || GetBestContentEncoding(word, 0, len) ```
9
+ if (CharsetRequiresBase64 (charset) || GetBestContentEncoding (word, 0, len) == ContentEncoding.Base64) {
10
+ ```
10
11
  でBase64/Quoted-printableを切り替えています。
11
12
 
12
- これらの情報を参考に、必要な部分を抜き出せばやりたいことは実現出来ると思います。
13
+ これらの情報を参考に、必要な部分を抜き出せばやりたいことは実現出来ると思います。
14
+ (GetBestContentEncoding()の戻り値相当を、変更or指定出来れば良いのですが……)
15
+
16
+ ---
17
+ 検証に使えるsmtpサーバが無かったので、[smtp4dev](https://archive.codeplex.com/?p=smtp4dev)を使って確認してみました。
18
+
19
+ ```C#
20
+ var subject = "吾輩は猫である。1.2.3.名前はまだ無い。";
21
+ var encoded = Rfc2047.EncodePhrase(Encoding.UTF8, subject);
22
+
23
+ var message = new MimeMessage();
24
+ message.From.Add(new MailboxAddress("harq@foo"));
25
+ message.To.Add(new MailboxAddress("harq@bar"));
26
+ message.Subject = Encoding.ASCII.GetString(encoded);
27
+ message.Body = new TextPart("plain") { Text = @"Hello World" };
28
+
29
+ using (var smtp = new SmtpClient())
30
+ {
31
+ smtp.Connect("localhost", 25);
32
+ smtp.Send(message);
33
+ smtp.Disconnect(true);
34
+ }
35
+ ```
36
+ smtp4dev画面
37
+ ![smtp4dev画面](244caaabced7487023d4108d0aef662a.png)
38
+ Viewの結果
39
+ ```
40
+ From: harq@foo
41
+ Date: Sun, 04 Mar 2018 01:31:41 +0900
42
+ Subject:
43
+ =?utf-8?b?5ZC+6Lyp44Gv54yr44Gn44GC44KL44CCMS4yLjMu5ZCN5YmN44Gv44G+44Gg54Sh?=
44
+ =?utf-8?b?44GE44CC?=
45
+ Message-Id: <NFBL3KIPS3U4.QV9M8QV27FCR3@xxxxxxxxx>
46
+ To: harq@bar
47
+ MIME-Version: 1.0
48
+ Content-Type: text/plain; charset=utf-8
49
+
50
+ Hello World
51
+ ```
52
+ あとは受信側のメーラー次第かなと。

1

訂正。getのみでした。

2018/03/03 16:41

投稿

HARQ
HARQ

スコア181

answer CHANGED
@@ -9,6 +9,4 @@
9
9
  ```if (CharsetRequiresBase64(charset) || GetBestContentEncoding(word, 0, len) ```
10
10
  でBase64/Quoted-printableを切り替えています。
11
11
 
12
- 一行の長さについては、EncodePhrase()/Text()の引数である、FormatOptionsで指定できたと思います。
13
-
14
12
  これらの情報を参考に、必要な部分を抜き出せばやりたいことは実現出来ると思います。