Python: как сохранить черновик письма с получателями BCC на Exchange Server через IMAP? - PullRequest
6 голосов
/ 21 апреля 2009

Я пытаюсь сохранить черновик электронной почты через IMAP в папку, работающую на MS Exchange. Все в порядке, за исключением того, что получатели скрытой копии не отображаются в черновике сообщения, хранящемся на сервере. Получатели скрытой копии также не получат письмо, если я отправлю его с 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 нормально, без ошибок.

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

Любая помощь очень ценится. Благодарю. Кстати, MAPI не вариант.

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

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

Ответы [ 3 ]

6 голосов
/ 28 мая 2009

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

Как почтовый клиент отображает скрытую копию?

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

Кто обрабатывает скрытую копию при отправке электронного письма?

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

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

Заключение

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

1 голос
/ 21 апреля 2009

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

X-Receiver: someguy@gmail.com

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

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

1 голос
/ 21 апреля 2009

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

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

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

Все вышесказанное - просто догадки.

Что-нибудь веселое, что вы можете попробовать:

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

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

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

...