Tôi đã phát triển một ứng dụng Python để tự động gửi email và yêu cầu gặp mặt cho các sự kiện nội bộ. Để giữ những thông tin này tách biệt với các liên lạc thông thường của tôi, chúng tôi đã thiết lập một địa chỉ email thay thế mà tôi có thể sử dụng để gửi thông báo chính thức. Tôi đã sửa đổi ứng dụng của mình để xử lý việc này cho các email bằng cách sử dụng SentOnBehalfOfName
cho người gửi thay thế - tuy nhiên, tôi không thể sao chép điều này cho các yêu cầu gặp mặt. Nỗ lực của tôi dựa trên một loạt các tìm kiếm trên web sau. Tuy nhiên, khi chạy điều này, tôi gặp lỗi:Làm cách nào để tạo yêu cầu gặp mặt Outlook với người gửi/người tổ chức thay thế?
Traceback (most recent call last):
File "mailer_test.py", line 49, in <module> test_sender)
File "mailer_test.py", line 38, in send_meeting_request
mtg.Send()
File "<COMObject CreateItem>", line 2, in Send
pywintypes.com_error: (-2147024809, 'The parameter is incorrect.', None, None)
Điều này xảy ra khi tôi thêm tùy chọn cho người gửi thay thế - xóa kết quả này trong thư được gửi thành công từ tài khoản của tôi. Mã thử nghiệm tái tạo lỗi dưới đây - Tôi đã xóa địa chỉ email thực của mình, nhưng mọi thứ khác đều giống nhau.
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 = ['[email protected]']
test_sender = '[email protected]'
ol.send_meeting_request('Test Meeting', meeting_time, 'Nowhere',
test_recipients, 'This is a test meeting.',
test_sender)
Lưu ý: Đây không phải là vấn đề tương tự như this question, vì tôi không sử dụng C# và tôi cũng không cố gắng để chỉnh sửa các yêu cầu họp sau khi thực tế.
Cập nhật: Như Marnix Klooster đã đề xuất, tôi đã xem qua giao diện người dùng để xem cách tôi có thể thực hiện việc này và dường như không dễ dàng (nếu có thể). Một cách tôi đã làm là chuyển sang lịch của người dùng khác và tạo cuộc hẹn mới ở đó và thêm người được mời. Hộp thư đó được thêm bằng cách chuyển đến tab Advanced
từ nút More Settings...
trong hộp thoại Cài đặt máy chủ được hiển thị khi thay đổi Account Settings
. Một câu trả lời thay thế cho câu hỏi này sẽ là cách sử dụng hộp thư này làm trình khởi tạo mặc định khi truy cập Outlook qua COM.
Chỉ cần hỏi một câu hỏi ngớ ngẩn: Chức năng này có sẵn thông qua giao diện người dùng không? Nếu không (và tôi chưa bao giờ tìm thấy nó), thì nó cũng có thể là không thể lập trình được. –
Không phải là một câu hỏi ngớ ngẩn chút nào - Tôi đã thử nó qua giao diện người dùng mà không có nhiều may mắn. Tuy nhiên, http://help.lockergnome.com/office/set-meeting-organizer--ftopict697177.html dường như nghĩ rằng nó có thể bằng cách gây rối với PR_RECIPIENT_FLAGS. –