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

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

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

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

message = MIMEMultipart() 
message['Subject'] = 'Test Draft' 
message['From'] = '[email protected]' 
message['to'] = '[email protected]' 
message['cc'] = '[email protected]' 
message['bcc'] = '[email protected]' 
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'] = '[email protected]'). Message, to, from, cc нормально, ошибок нет.

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

Любая помощь очень ценится. Спасибо. Кстати, MAPI - это не вариант.

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

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


person stephan    schedule 21.04.2009    source источник


Ответы (3)


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

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

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

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

Предположим теперь, что мы составили черновик сообщения в почтовом клиенте и сохранили его в папке 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:.

Заключение

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

person stephan    schedule 28.05.2009

Это могло быть так по замыслу. Ведь весь смысл скрытой копии в том, что получатели скрыты друг от друга.

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

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

Все вышесказанное - лишь догадки.

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

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

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

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

person codeape    schedule 21.04.2009

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

X-Receiver: [email protected]

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

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

person Chase Seibert    schedule 21.04.2009