web-dev-qa-db-ja.com

Python Outlook 2016を使用せずにメールを送信する

import win32com.client as win32
Outlook = win32.Dispatch('Outlook.application')
mail = Outlook.CreateItem(0)
mail.To = 'To address'
mail.Subject = 'Message subject'
mail.Body = 'Message body'
mail.HTMLBody = '<h2>HTML Message body</h2>' #this field is optional

# To attach a file to the email (optional):
attachment  = "Path to the attachment"
mail.Attachments.Add(attachment)

mail.Send()

上記のコードはまったく問題なく動作します。ただし、問題は、システムでOutlookを開いてログインする必要があることです。そうすると、メールだけが送信されます。

システムで実際にOutlookアプリケーションを実行せずにOutlookを使用してメールを送信する方法はありますか?

7
noswear

Outlookを自動化せずにOutlook REST APIを使用する必要があります。次のサンプルをご覧ください。

マイクロソフトは現在、Officeが不安定である可能性があるため、無人の非対話型クライアントアプリケーションまたはコンポーネント(ASP、ASP.NET、DCOM、およびNTサービスを含む)からのMicrosoft Officeアプリケーションの自動化を推奨しておらず、サポートもしていません。この環境でOfficeを実行したときの動作やデッドロック。

サーバー側のコンテキストで実行するソリューションを構築している場合は、無人で実行できるように安全にされたコンポーネントを使用する必要があります。または、コードの少なくとも一部をクライアント側で実行できる代替手段を見つけるようにしてください。サーバー側のソリューションからOfficeアプリケーションを使用すると、アプリケーションを正常に実行するために必要な機能の多くが不足します。さらに、ソリューション全体の安定性にリスクを負うことになります。詳しくは Officeのサーバー側の自動化に関する考慮事項 の記事を参照してください。

1
Eugene Astafiev

問題は、メッセージの送信が非同期であり、メッセージが送信される前にコードが終了することです。 Exchangeの場合は、キャッシュモードをオフにしてみてください。オンラインストアはメッセージをすぐに送信します。それ以外の場合(キャッシュされたExchangeまたはPSTストア)、メッセージが実際に送信されるまでOutlookオブジェクトを保持する必要があります。 SyncObject.SyncEndイベントが発生するのを待つ必要があります。 SyncObjectNamespace.SyncObjectsコレクションから取得できます(「すべてのアカウント」はそのコレクションの最初のアイテムです)。