2012-02-22 33 views
6

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.

+1

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. –

+0

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. –

Trả lời

-1

Theo số this page, bạn có thể gửi yêu cầu họp thay mặt cho người khác, nhưng bạn cần có quyền truy cập vào lịch của người đó. Người kia phải chỉ định bạn làm đại biểu.

+0

Đúng vậy. Bước đầu tiên được đưa ra là "Mở lịch của người khác". Tôi có thể làm điều đó bằng tay, nhưng có cách nào để tự động hóa điều đó không? –

+0

Sử dụng API trao đổi: http://docs.activestate.com/activepython/2.4/pywin32/exchange.html? –