我在 Exchange 2010 环境中工作,并且我有兴趣执行以下操作:
- 有一个服务器端规则将发送到特定地址的所有电子邮件转发到新地址。
- 然而,在转发电子邮件之前,需要使用特定的字符集重新编码。在我的例子中,电子邮件是以UTF-8编码,我需要将其重新编码为美国ASCII然后转发过去。
因此“流程图”将是:
- UTF-8 电子邮件发送至邮箱-A
- 邮箱-A 收到 UTF-8 电子邮件。
- Mailbox-A 上的服务器端规则将电子邮件上的字符集重新编码为 US-ASCII
- 新的 US-ASCII 编码电子邮件转发至 Mailbox-B
我遇到了几种可能的解决方案:邮箱规则、传输规则、日记帐帐户……但似乎没有一种能立即解决我的问题。可能是我对此调查得不够。
任何帮助都将不胜感激。谢谢!
答案1
Exchange 无法自动转码电子邮件。
幸运的是,有了传输代理,您可以编写脚本来完成交换。不幸的是,您必须自己编写逻辑。让我们来看看。
你可以基本上按照以下说明进行操作http://msdn.microsoft.com/en-us/library/office/aa579185%28v=exchg.140%29.aspx
在您的流程图中:
- 您已经掌握了这些知识(对吗?)
- BREAK。我们永远不会这样做。编写一个传输代理来更改我们需要更改的所有内容。在 OnEndOfData 事件中,接受一个委托,该委托作为参数,其中包含
MailItem
其中包含您需要的一切。首先检查它是否MailItem.Message.To
包含您的 MailBox-A。如果包含,请更改您需要更改的所有内容:MailItem.Message.To
添加 Mailbox-B(可选删除 MailBox-A)- 使用 获取旧的 body mimepart
MailItem.Message.Body.MimePart
。创建一个新的MimePart
使用构造函数
-
public MimePart(
string contentType,
ContentTransferEncoding transferEncoding,
Stream contentStream,
CachingMode cachingMode
)
您将需要旧的、新的内容流,contentType
"text/plain"
以及ContentTransferEncoding
ContentTransferEncoding
CachingMode
CachingMode.Copy
将旧 MimePart 流的内容不加改变地写入新部分的内容流(由于您已表明不会使用 7 位 ASCII 之外的任何字符,因此内容实际上是相同的。如果不是,则将流读取为 7 位 ASCII,将结果字符串使用 base64 解码为字节流,使用 UTF-8 编码将字节流解码为字符串,替换需要替换的内容,使用 7 位 ASCII 编码写入字节流,使用 base64 编码结果字节流,将结果字符串写入使用 7 位 ASCII 编码的目标流)(唷!)。
用新的 MimePart 替换旧的 MimePart。您可以使用old.Parent.ReplaceChild(old, new)
。
编译该事物并将包含已编译代理的 dll 附加到 Exchange。从文档中复制粘贴:Install-TransportAgent -Name "MyCustomAgent" -TransportAgentFactory "MyAgents.MyAgentFactory" -AssemblyPath "C:\myagents\MyAgent.dll"
在 Exchange 命令行管理程序中执行。
调整后的电子邮件现在将采用 7 位 ASCII 格式,并具有正确的收件人。
有可能吗?是的。这一切都值得吗?可能不值得。什么愚蠢的电子邮件客户端无论如何都无法读取 UTF-8?我个人不知道有任何这样的客户端,支持它们的成本可能很多比仅仅升级电子邮件客户端更高。
如果您要尝试这样做(我不建议您这样做)并在编码部分迷失,那么这些问题将属于 StackOverflow 的范围。