Я разработал приложение Python для автоматизации отправки электронных писем и запросов на встречи для внутренних офисных мероприятий.Чтобы отделить их от моих обычных сообщений, мы создали альтернативный адрес электронной почты, который я могу использовать для отправки официальных объявлений. Я изменил свое приложение, чтобы обрабатывать это для электронных писем, используя SentOnBehalfOfName
для альтернативного отправителя, однако мне не удалось продублировать это для запросов на собрания. Далее следует моя попытка, основанная на серии поисковых запросов. Однако при запуске я получаю сообщение об ошибке:
Traceback (most recent call last):
File "mailer_test.py", line 49, in test_sender)
File "mailer_test.py", line 38, in send_meeting_request
mtg.Send()
File "", line 2, in Send
pywintypes.com_error: (-2147024809, 'The parameter is incorrect.', None, None)
Это происходит, когда я добавляю параметр для альтернативного отправителя - удаление этого приводит к успешному отправлению сообщения из моей учетной записи. Ниже приведен тестовый код, воспроизводящий ошибку. Я удалил свой фактический адрес электронной почты, но все остальное осталось прежним.
import win32com.client
OUTLOOK_APPOINTMENT_ITEM = 1
OUTLOOK_MEETING = 1
OUTLOOK_ORGANIZER = 0
OUTLOOK_OPTIONAL_ATTENDEE = 2
ONE_HOUR = 60
THIRTY_MINUTES = 30
OUTLOOK_FORMAT = '%m/%d/%Y %H:%M'
outlook_date = lambda dt: dt.strftime(OUTLOOK_FORMAT)
class OutlookClient(object):
def __init__(self):
self.outlook = win32com.client.Dispatch('Outlook.Application')
def send_meeting_request(self, subject, time, location, recipients, body,
sender=None):
mtg = self.outlook.CreateItem(OUTLOOK_APPOINTMENT_ITEM)
mtg.MeetingStatus = OUTLOOK_MEETING
mtg.Location = location
if sender:
# Want to set the sender to an address specified in the call
# This is the portion of the code that does not work
organizer = mtg.Recipients.Add(sender)
organizer.Type = OUTLOOK_ORGANIZER
for recipient in recipients:
invitee = mtg.Recipients.Add(recipient)
invitee.Type = OUTLOOK_OPTIONAL_ATTENDEE
mtg.Subject = subject
mtg.Start = outlook_date(time)
mtg.Duration = ONE_HOUR
mtg.ReminderMinutesBeforeStart = THIRTY_MINUTES
mtg.ResponseRequested = False
mtg.Body = body
mtg.Send()
if __name__ == "__main__":
import datetime
ol = OutlookClient()
meeting_time = datetime.datetime.now() + datetime.timedelta(hours=3)
test_recipients = ['me@example.com']
test_sender = 'alternate@example.com'
ol.send_meeting_request('Test Meeting', meeting_time, 'Nowhere',
test_recipients, 'This is a test meeting.',
test_sender)
Примечание. Это не та же проблема, что и этот вопрос , поскольку я не использую C # и не пытаюсь редактировать запрос на собрание постфактум.
Обновление:
Как предположил Марникс Клоостер, я просматривал пользовательский интерфейс, чтобы увидеть, как я могу это сделать, и это оказалось непросто (если даже возможно). Единственный способ, которым я это сделал, - это зайти в календарь другого пользователя, создать там новую встречу и добавить приглашенных. Этот почтовый ящик добавляется путем перехода на вкладку Дополнительно
с помощью кнопки Дополнительные настройки ...
в диалоговом окне «Настройки сервера», отображаемом при изменении настроек учетной записи
. Альтернативный ответ на этот вопрос - как использовать этот почтовый ящик в качестве отправителя по умолчанию при доступе к Outlook через COM.