bugfix> c# > 投稿

マシン上でスケジュールされたジョブとして実行されているサービスがあります。独自のメールボックスを持たないサービスアカウントで実行されています。チームの共有受信ボックスからメールを送信したいと考えています。
ここで偽装を使用してみました。

var service = new ExchangeService
{
    TraceEnabled = true,
    ImpersonatedUserId = new ImpersonatedUserId(ConnectingIdType.SmtpAddress, Resources.EmailUsername)
};
service.AutodiscoverUrl(Resources.EmailUsername, RedirectionUrlValidationCallback);
var email = new EmailMessage(service);
if (!string.IsNullOrWhiteSpace(recipients))
{
    foreach (var recipient in recipients.Split(','))
    {
        email.ToRecipients.Add(recipient.Trim());
    }
}
email.Subject = subject;
email.Body = new MessageBody(BodyType.HTML, body);
if (attachmentName != null && attachment != null)
{
    email.Attachments.AddFileAttachment(attachmentName, attachment);                        
}
email.Send();

失敗し、次のような例外が表示されます。

When making a request as an account that does not have a mailbox, you must specify the mailbox primary smtp address for any distinguished folder Ids.

回答 1 件
  • ザ・ TraceEnabled  一部は MessageDisposition=SaveOnly に気づくように私を導いた  xmlで設定されました。 MessageDispositionを検索し、SendOnlyが必要だと考えました。

    多くの検索の後、私はここに行きました:https://github.com/OfficeDev/ews-managed-api/blob/master/Core/ServiceObjects/Items/EmailMessage.cs
    どれを示しています:

    public void Send()
    {
        this.InternalSend(null, MessageDisposition.SendOnly);
    }
    
    

    まあそれは私が最初に望んでいたように見えます...しかし、その後:

    private void InternalSend(FolderId parentFolderId, MessageDisposition messageDisposition)
    {
        this.ThrowIfThisIsAttachment();
        if (this.IsNew)
        {
            if ((this.Attachments.Count == 0) || (messageDisposition == MessageDisposition.SaveOnly))
            {
                this.InternalCreate(
                    parentFolderId,
                    messageDisposition,
                    null);
            }
            else
            {
                // If the message has attachments, save as a draft (and add attachments) before sending.
                this.InternalCreate(
                    null,                           // null means use the Drafts folder in the mailbox of the authenticated user.
                    MessageDisposition.SaveOnly,
                    null);
                this.Service.SendItem(this, parentFolderId);
            }
        }
        ...
    
    

    2つのコメントは最も啓発的な部分です。添付ファイルは、プロセスを実行しているユーザーの下書きフォルダーに保存されています。
    これを回避するには、Sendを呼び出すときにメッセージが既に保存されている必要があります。存在することがわかっているメールボックスに保存されていることを確認しましょう。そのため、偽装を削除し、ステップを追加して保存し、[差出人]フィールドを変更します。その後、メッセージを安全に送信でき、ドラフトフォルダーから自身を削除します。

    var service = new ExchangeService
    {
        TraceEnabled = true
    };
    service.AutodiscoverUrl(Resources.EmailUsername, RedirectionUrlValidationCallback);
    var email = new EmailMessage(service);
    if (!string.IsNullOrWhiteSpace(recipients))
    {
        foreach (var recipient in recipients.Split(','))
        {
            email.ToRecipients.Add(recipient.Trim());
        }
    }
    email.Subject = subject;
    email.Body = new MessageBody(BodyType.HTML, body);
    if (attachmentName != null && attachment != null)
    {
        email.Attachments.AddFileAttachment(attachmentName, attachment);                        
    }
    var folderId = new FolderId(WellKnownFolderName.SentItems, Resources.EmailUsername);
    email.Save(folderId);
    email.From = Resources.EmailUsername;
    email.Send();
    
    

あなたの答え