Python: как сохранить черновик электронной почты с получателями BCC для Exchange Server через IMAP?

Я пытаюсь сохранить черновик электронной почты через IMAP в папку, работающую на MS Exchange. Все в порядке, за исключением того, что получатели Bcc не отображаются в черновике сообщения, хранящегося на сервере. Получатели Bcc также не получают электронное письмо, если я отправляю его с MS Outlook. Если я прочитаю сообщение с Python после того, как я сохранил его на сервере, я могу увидеть Bcc в черновике.

следующий код Python воспроизводит это поведение:

import imaplib 
import time 
from email.MIMEMultipart import MIMEMultipart 
from email.MIMEText import MIMEText 

message = MIMEMultipart() 
message['Subject'] = 'Test Draft' 
message['From'] = 'test@test.net' 
message['to'] = 'test@test.com' 
message['cc'] = 'testcc@test.com' 
message['bcc'] = 'testbcc@test.com' 
message.attach(MIMEText('This is a test.n')) 

server= imaplib.IMAP4('the.ser.ver.ip') 
server.login('test', 'test') 
server.append("Drafts" 
              ,'Draft' 
              ,imaplib.Time2Internaldate(time.time()) 
              ,str(message)) 
server.logout() 

если я запускаю этот код, проект хранится в Draft папка на сервере Exchange. Но если я посмотрю проект С MS Outlook, он не включает bcc получатель (message['bcc'] = 'testbcc@test.com'). Message, to, from, cc ok, без ошибок.

если я загружаю черновики, которые уже включают bcc из папки Exchange, я также могу увидеть bcc. Только загрузка не работает для меня.

любая помощь очень высоко ценится. Спасибо. Кстати, MAPI не является вариантом.

обновление: Спасибо. X-Receiver не работает для меня. Что касается игры с IMAP-папкой в Outlook, я получил интересный результат. Если я получаю доступ к черновику через IMAP-папку в Outlook, я вижу bcc. Но если я обращаюсь к нему через MAPI-папку, я его не вижу. Немного поиграем с этим.

вывод: спасибо за вход. На самом деле, код работает просто отлично. Ниже Ответ, который я нашел.

3 ответов


на самом деле, этот код работает просто отлично. Он создает правильную почту со всеми правильными заголовками, включая bcc.

как почтовый клиент отображает bcc?

на почтового клиента (например, Python или MS Outlook через IMAP или MAPI в моем случае) решает, следует ли и как отображать BCC-заголовки. Например, Outlook не отображает заголовки bcc из папки IMAP. Это функция, чтобы скрыть получателей bcc друг от друга, где они не были удалено из почты раньше (из стандарта не ясно, разрешено ли одному получателю bcc видеть всех других получателей bcc или нет, см. Википедия).

кто обрабатывает bcc при отправке электронной почты?

предположим теперь, что мы разработали сообщение в почтовом клиенте и сохранили его в папке IMAP или MAPI. Сервер, предоставляющий папки IMAP / MAPI, оставляет черновик сообщения без изменений. Что происходит с ОЦК-заголовки при отправке почта зависит от реализации и может зависеть как от почтового клиента, так и от почтовый агент (например, MS Exchange Server в моем случае). В двух словах, люди не согласны ли почтовый клиент или агент передачи почты-лицо, ответственное за удаление заголовков КБК. Однако, по-видимому, большинство разработчиков придерживается мнения, что это дело почтового клиента с агентом передачи почты, не касаясь почты (например, MS Exchange, MS SMTP, Exim, OpenWave). В этом случае агент передачи почты отправляет письмо получателю, как это определено в RCPT TO: на SMTP связь, и оставляет электронную почту без изменений в противном случае. Однако некоторые другие агенты передачи почты удаляют заголовки bcc из писем (например, sendmail, Lotus Notes). Очень подробное обсуждение можно найти в списке рассылки Exim, начиная с здесь.

в случае MS Outlook и MS Exchange MS Outlook никогда не отправляет bcc (но отправляет отдельные письма для каждого получателя bcc), и MS Exchange не касается заголовков электронной почты, но отправляет полную электронную почту( возможно, включая получателей bcc) получателям, определенным в RCPT TO:.

вывод

Я не понял, что для bcc нет гарантированного поведения, и что обычно клиент обрабатывает bcc. Я перепишу свой код Python для цикла над получателями bcc и сгенерирую одно письмо для каждого получателя bcc.


Это может быть так задумано. В конце концов, весь смысл bcc заключается в том, что получатели скрыты друг от друга.

Я понимаю, что вы не отправляете электронное письмо, просто храните его. Но я предполагаю, что внутренние правила Exchange срабатывают, когда сообщение IMAP.добавлено в папку, в результате чего поле bcc будет удалено.

очевидно, что при сохранении сообщений в папку с помощью Outlook поле bcc является не ободрана. но я угадайте, outlook взаимодействует с Exchange, используя какой-то внутренний механизм (MAPI?).

все это просто догадки.

что-то весело вы могли бы попробовать:

  • в пустом профиле Outlook/MAPI создайте учетную запись IMAP. Настройте его для хранения черновиков и отправленных элементов на сервере Exchange.
  • посмотрите, может ли outlook с помощью IMAP правильно сохранить bcc черновиков.

Я пробовал выше, используя почтовый клиент Evolution, подключенный к Обмен через IMAP. Используя outlook (подключен обычным способом), я затем просмотрел черновики и отправленные элементы. Поле bcc отсутствовало в обоих местах.

Я верю, что это поддерживает мою теорию.


попробуйте установить эту альтернативную версию заголовка BCC:

X-Receiver: someguy@gmail.com

Exchange, в частности, будет рассматривать это как BCC при его отправке. Но я уверен, что он не будет раздевать его, когда вы пишете через IMAP. Вы можете включить более одного получателя BCC, дублируя эту строку.

Это полный взлом, очевидно.