如何使用MimeKit / MailKit设置自定义内容传输编码?

时间:2019-03-07 23:22:34

标签: c# .net smtp mailkit mimekit

这个问题是关于我认为是“违反标准”的问题,并且我了解MimeKit可能已设置为明确不允许我执行我要问的事情。这些自定义消息将仅在内部使用,而不用于常规电子邮件发送。

以下是我可以使用基本功能创建的附件:

Content-Type: application/octet-stream; name=example.txt
Content-Disposition: attachment; filename=example.txt
Content-Transfer-Encoding: base64

**BASE64 ENCODED ATTACHMENT**

我想知道的是是否有可能创建以下内容:

Content-Type: application/octet-stream; name=example.txt; type=****
Content-Disposition: attachment; filename=example.txt
Content-Transfer-Encoding: *****

**CUSTOM ENCODED ATTACHMENT**

在这里,我有一个自定义字符串来设置“ Content-Transfer-Encoding”,可能是“ Content-Type”下的一个自定义“ type”,并且还使用我自己的自定义代码对消息进行编码。

我假设对消息进行自定义编码的最简单方法是在MimeKit之外执行此操作,然后将MimeKit设置为不进行编码。无论如何,我可以创建仅包含所需字符串的自定义标头吗?

其他问题:

我该如何改变:

Content-Type: application/octet-stream; name=example.txt
Content-Disposition: attachment; filename=example.txt

收件人:

Content-Type: application/octet-stream; name="example.txt"
Content-Disposition: attachment; filename="example.txt"

2 个答案:

答案 0 :(得分:1)

正如您在自己的答案中所发现的那样,如果未设置ContentTransferEncoding属性,则可以使用Headers.Replace()甚至Headers.Add()覆盖Content-Transfer-Encoding标头

我想您的另一个主要问题是如何获取自定义编码内容?

代替:

Content = new MimeContent(File.OpenRead(file), ContentEncoding.Default),

您需要做的就是将预编码的流传递到MimeContent .ctor中(并继续使用ContentEncoding.Default作为第二个参数)。

如果您需要在Content-Type标头中设置type参数,则可以执行以下操作:

attachment.ContentType.Parameters.Add("type", "value");

var parameter = new Parameter ("name", "value");
attachment.ContentType.Parameters.Add (parameter);

attachment.ContentType.Parameters["type"] = "value";

剩下的唯一问题是如何强制引用的参数值。为此,您不走运。 MimeKit仅在由于值中的字符而需要对其进行引用时才引用该值。

答案 1 :(得分:0)

我发现我的答案之一是替换标题:

var attachment = new MimePart("application", "octet-stream")
{
    Content = new MimeContent(File.OpenRead(file), ContentEncoding.Default),
    ContentDisposition = new ContentDisposition(ContentDisposition.Attachment),
    ContentTransferEncoding = ContentEncoding.Base64,
    FileName = Path.GetFileName(file),
};

attachment.Headers.Replace("Content-Transfer-Encoding", "******");