Я работаю в среде Exchange 2010 и мне интересно следующее:

  • Наличие серверного правила, которое принимает все электронные письма, отправленные на определенный адрес, и перенаправляет их на новый адрес.
  • Однако, прежде чем электронное письмо будет переадресовано, его необходимо перекодировать с определенной кодировкой. В моем случае электронное письмо принимается в кодировке UTF-8 , и мне нужно, чтобы оно было перекодировано как US-ASCII, а затем переадресовано.

Таким образом, «блок-схема» будет:

  1. UTF-8 Письмо отправлено на Mailbox-A
  2. Почтовый ящик-A получает электронную почту UTF-8.
  3. Правило на стороне сервера в Mailbox-A перекодирует кодировку в электронную почту в US-ASCII
  4. Недавно зашифрованная электронная почта US-ASCII пересылается в Mailbox-B

Я сталкивался с несколькими возможными решениями: правило почтового ящика, правила транспорта, учетные записи журнала ... но, похоже, ни одно из них не решило мою проблему немедленно. Может быть, я недостаточно расследую это.

Любая помощь по этому вопросу будет принята с благодарностью. Спасибо!

1 ответ1

0

Exchange не может автоматически перекодировать сообщение электронной почты.

К счастью, с транспортными агентами вы можете чертовски разменять сценарий. К сожалению, вам придется написать логику самостоятельно. Давайте пройдем через это.

Вы можете в основном следовать инструкциям на http://msdn.microsoft.com/en-us/library/office/aa579185%28v=exchg.140%29.aspx

В вашей блок-схеме:

  1. Вы уже покрыли это (правильно?)
  2. ПЕРЕРЫВ. Мы никогда этого не сделаем. Напишите транспортного агента, который меняет все, что нам нужно изменить. Событие OnEndOfData принимает делегата в качестве аргумента, который содержит MailItem который имеет все необходимое. Сначала проверьте, если MailItem.Message.To содержит ваш почтовый ящик-A. Если это так, измените все, что вам нужно изменить:
    • MailItem.Message.To добавить Maibox-B (опционально удалите MailBox-A)
    • Получить старый 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.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .