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

StackOverflow https://stackoverflow.com/questions/771907

Вопрос

Я пытаюсь сохранить черновик электронного письма через 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 хорошо, ошибки нет.

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

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

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

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

Это было полезно?

Решение

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

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

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

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

Предположим теперь, что мы подготовили сообщение в почтовом клиенте и сохранили его в папке IMAP или MAPI.Сервер, предоставляющий папки IMAP / MAPI, оставляет черновик сообщения без изменений.То, что происходит с bcc-заголовками при отправке почты, зависит от реализации и может зависеть как от почтового клиента, так и от агент по передаче почты (например,MS Exchange Server в моем случае).В двух словах, люди не согласны с тем, несет ли почтовый клиент или агент передачи почты ответственность за удаление заголовков bcc.Однако, похоже, что большинство разработчиков придерживаются мнения, что это дело почтового клиента, а агент передачи почты не касается почты (например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, подключенный к Exchange через IMAP.Используя Outlook (подключенный обычным способом), я затем просмотрел Черновики и Отправленные элементы.Поле bcc отсутствовало в обоих местах.

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

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

X-Receiver: someguy@gmail.com

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top