Изменить учетную запись отправителя с помощью exchangelib - PullRequest
1 голос
/ 05 февраля 2020

У меня есть два аккаунта на перспективу 'user1@example.com' и 'user2@example.com'. У меня есть несколько черновиков в папке черновиков user1, и я хочу обновить каждое электронное письмо до адреса user2, прежде чем отправлять их, чтобы user2 был отправителем писем и появлялся в поле from для почтовых отправлений.

с использованием exchangelib Мне удалось изменить адрес «отправителя» и «учетной записи» с user1 на user2 (и даже print(item.sender, item.account), чтобы проверить изменение), но обновление не отражается на электронные письма 'из поля в папке черновика Outlook, когда это будет сделано.

import getpass
from exchangelib import Configuration
from exchangelib import Credentials, Account
from exchangelib import FileAttachment, HTMLBody
from exchangelib.properties import DistinguishedFolderId


def authenticate():
    """
    Authenticate into mail.example.com
    """
    email = "user1@example.com"
    passwd = getpass.getpass(prompt="Enter your password: ")
    user_credentials = Credentials(email, passwd)
    config = Configuration(server="mail.example.com",
                           credentials=user_credentials)
    account = Account(primary_smtp_address=email, config=config,
                           credentials=user_credentials, autodiscover=False)
    return account

def main():
    """
     Change sender account to user2@example.com
    """
    user_account = authenticate()
    drafts = DistinguishedFolderId('drafts')
    for item in user_account.drafts.all().order_by('subject'):
        item.sender = 'user2@example.com'
        item.account = 'user2@example.com'
        user_account.drafts.save(update_fields=['sender', 'account'])
        exit("Done")

if __name__ == "__main__":
    main()

Ответы [ 2 ]

0 голосов
/ 06 февраля 2020

Вам нужно позвонить .save() на предмет, а не на папку. Folder.save() предназначен для изменения свойств самой папки, например, имени папки.

Печать элемента, как предлагается в другом ответе, только скажет вам, что ваша локальная копия элемента была изменена, а не фактический элемент на сервере. Вам нужно вызвать item.refresh(), чтобы увидеть, что на самом деле было обновлено (хотя это должно всегда совпадать, когда вы вызываете item.save()).

Наконец, item.account является ссылкой на объект Account. Не меняй это. Два поля, которые содержат информацию об отправителе: item.sender и item.author, но item.sender устанавливается сервером автоматически и не может быть изменен. item.author можно изменить, но только тогда, когда сообщение все еще является черновиком. Вот ссылка на определение полей Message-Speci c в exchangelib: https://github.com/ecederstrand/exchangelib/blob/3158c076a1e30a18e0b68e99a54fb14b3a6f7cd4/exchangelib/items/message.py#L18.

Вот пример:

    for item in user_account.drafts.all().order_by('subject'):
        item.author = 'user2@example.com'
        item.save()
        item.refresh()  # This gets a fresh copy of the item on the server
        print(item)  # Now you see whatever the server has
0 голосов
/ 05 февраля 2020

Не настоящее решение, но то, что вы можете искать:

Вы можете сделать:

for item in user_account.drafts.all().order_by('subject'):
    print(item) #Copy Text into Notepad++ and search for user1/ user1@example.com
    item.sender = 'user2@example.com'
    item.account = 'user2@example.com'
    user_account.drafts.save(update_fields=['sender', 'account'])
    print(item) #Copy Text in another Notepad++ tab to see if every user1 entry has been replaced
    exit("Done")

Вы должны быть в состоянии сравнить .txts и найти недостающий элемент (если есть это одно) ВНИМАНИЕ: в зависимости от того, сколько писем, будет огромная стена текста

...