phaggi
@phaggi
лужу, паяю, ЭВМы починяю

Как получить (резолвить) группу контактов из Outlook при отправке сообщений через MAPI?

Пытаюсь отправлять группе контактов Outlook 2016 под именем "test1" сообщение email из скрипта python3:
from win32com.client.gencache import EnsureDispatch
from win32com.client import constants

outlook = EnsureDispatch("Outlook.Application")
newMail = outlook.CreateItem(constants.olMailItem)
newMail.Subject = "This is subject"
samplegrp = newMail.Recipients.Add("test1")
samplegrp.Type = constants.olTo
newMail.Recipients.ResolveAll()
newMail.Send()

резолвер возвращает "False" ну и метод Send() ругается на отсутствие адресов.

Если в newMail.To положить существующий в адресном списке адрес, он "резолвится" (newMail.Recipients.ResolveAll() возвращает "True") и сообщение успешно отправляется.

Мои попытки добраться до этого объекта группы контактов типа AddressEntry "test1" через API вроде успешны:
from win32com.client.gencache import EnsureDispatch
from win32com.client import constants

outlook = EnsureDispatch("Outlook.Application")
newMail = outlook.CreateItem(constants.olMailItem)
namespace = outlook.GetNamespace("MAPI")
addresslist = namespace.AddressLists

addressentries = addresslist.Item(1).AddressEntries
samplegrp = [item for item in addressentries if item.Name == 'test1'][0]
print(samplegrp.Name)

возвращает "test1", но ни "резолвить" его, ни тупо "положить" его в newMail.To и отправить на него мне не удалось. Среди методов и атрибутов этого объекта я не нашел ничего, что мне бы помогло содержимое группы "test1" как-то выковырять из outlook.

Вдогонку...
Я понимаю, что можно просто поместить в атрибут .To нужные адреса множеством разных способов (передать строку с адресами через ";" или разными другими методами), но мне хотелось бы задействовать именно группу контактов из Outlook.
  • Вопрос задан
  • 144 просмотра
Решения вопроса 1
phaggi
@phaggi Автор вопроса, куратор тега Python
лужу, паяю, ЭВМы починяю
Благодаря подсказке Viktor T2 доковырялся-таки до списков рассылки (тип DistListItem) и нашел в документации MS методы и поля этого класса. Ура!
код
import win32com.client as win32
from win32com.client.gencache import EnsureDispatch
 
 
 
 
def get_maillist(maillistname: str):
    """
 
    :param maillistname: str name of Group contacts at Outlook
    :return: string of addresses (del = ;) of Group contacts
    (empty if Group 'maillistname' not found)
    """
    outlook = EnsureDispatch("Outlook.Application")
    olNamespace = outlook.GetNamespace("MAPI")
    olFolder = olNamespace.GetDefaultFolder(10)
    olConItems = olFolder.Items
    mail_list = []
    for olItem in olConItems:
        if "_DistListItem" in str(type(olItem)) and olItem.DLName == maillistname:
            counter = olItem.MemberCount
            while bool(counter):
                mail_list.append(olItem.GetMember(counter).Address)
                counter -= 1
    if bool(mail_list):
        result = ';'.join(mail_list)
    else:
        result = ''
    return result
 
if __name__ == '__main__':
    outlook = win32.Dispatch('outlook.application')
    mail = outlook.CreateItem(0)
    mail.To = get_maillist('test1')
    mail.Subject = 'testmail'
    print(mail.Recipients.ResolveAll())
    print(mail.To)
    mail.Send()
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
26 апр. 2024, в 09:18
500 руб./в час
26 апр. 2024, в 06:46
1500 руб./в час
26 апр. 2024, в 05:31
1000 руб./за проект