【问题标题】:Office 365 send email with attachment using OutlookServicesClientOffice 365 使用 OutlookServicesClient 发送带附件的电子邮件
【发布时间】:2015-01-19 18:39:29
【问题描述】:

我正在尝试代表我的 LOB 应用程序的用户发送一些电子邮件。我正在使用 Office 365 连接服务 API,以便我可以使用 OAuth 进行身份验证。我的代码将发送电子邮件,但不显示任何附件。这是我的代码的一个孤立示例:

    static async void SendUsingOutlookClient(CommunicationRow me, OutlookServicesClient outlook)
    {
        var m = new Message();
        m.From = ToRecipient(me.From);
        m.Body = new ItemBody { Content = me.Body };
        if (me.IsBodyHtml)
            m.Body.ContentType = BodyType.HTML;
        else
            m.Body.ContentType = BodyType.Text;
        m.Subject = me.Subject;
        m.CcRecipients.Add(me.Cc);
        m.BccRecipients.Add(me.Bcc);
        m.ToRecipients.Add(me.To);
        foreach (var attach in me.Attachments)
        {
            var file = attach.File;
            var fileversion = file.GetVersion(attach.Version);
            string fullpath = LibraryServiceImpl.GetFullNameInArchive(fileversion);
            var mattach = new FileAttachment { Name = file.Name, ContentId = attach.ContentId, ContentLocation = fullpath, ContentType = GraphicUtils.DetermineMime(Path.GetExtension(fullpath)) };
            if (file.Name.MissingText())
                mattach.Name = attach.ContentId + fileversion.FileExtension;
            m.Attachments.Add(mattach);
        }
        await outlook.Me.SendMailAsync(m, true);
    }

我使用的 OutlookServicesClient 在这里找到 https://visualstudiogallery.msdn.microsoft.com/a15b85e6-69a7-4fdf-adda-a38066bb5155

【问题讨论】:

  • 你有没有通过代码..?在 foreach 循环的这一行上,me.Attachments 的值是什么,您在哪里声明附件对象..?也许这个链接可能会帮助stackoverflow.com/questions/1195111/… 这也可以使用 C# .net System.Mail.net 轻松完成
  • @MethodMan 发送电子邮件不是问题,单步执行代码也不会告诉我太多信息。我的电子邮件到达预定目的地时没有任何附件。根据我对问题的描述,我正在尝试使用 OAuth 对发件人进行身份验证。我知道无法将它与 System.Mail.Net.SmtpClient 一起使用。该类中的凭据需要输入密码。
  • 单步执行代码会告诉你很多..正如我之前问过的..在发送电子邮件之前附件的价值是什么..也许你没有得到完整的文件路径/名称例如附件的..这也必须是异步发送..帮助我们帮助你..谢谢
  • @MethodMan 是的,当我逐步附加 pdf 时,mattach 的属性似乎是合理的,我可以访问完整路径中的文件。我添加了一个指向此处使用的库的链接,我只能访问 Async 方法。

标签: c# api office365


【解决方案1】:

我自己尝试过,看起来问题是 OutlookServicesClient 只是在您发送时不包含附件数据。如果你使用 Fiddler,你可以自己看到。

我会让负责这个图书馆的人知道这件事。同时,您可以先将邮件保存为草稿,然后使用附件进行更新,然后发送。比如:

// Save to Drafts folder
await outlook.Me.AddMessageAsync(m);

foreach (var attach in me.Attachments)
{
    var file = attach.File;
    var fileversion = file.GetVersion(attach.Version);
    string fullpath = LibraryServiceImpl.GetFullNameInArchive(fileversion);
    var mattach = new FileAttachment { Name = file.Name, ContentId = attach.ContentId, ContentLocation = fullpath, ContentType = GraphicUtils.DetermineMime(Path.GetExtension(fullpath)) };
    if (file.Name.MissingText())
        mattach.Name = attach.ContentId + fileversion.FileExtension;
    m.Attachments.Add(mattach);
}

// Update with attachments
await m.UpdateAsync();
// Send the message
await m.SendAsync();

【讨论】:

  • 感谢您发布此信息。我是通过一些猜测弄明白的,但你应该得到分数。
【解决方案2】:

我能够弄清楚这一点,似乎在 Office 365 API 中通过电子邮件发送附件的唯一方法是首先将电子邮件另存为草稿,添加附件,然后发送它。这是我修改后的 SendUsingOutlookClient 方法

    static async void SendUsingOutlookClient(CommunicationRow me, OutlookServicesClient outlook)
    {
        var m = new Message();
        m.From = ToRecipient(me.From);
        m.Body = new ItemBody { Content = me.Body };
        if (me.IsBodyHtml)
            m.Body.ContentType = BodyType.HTML;
        else
            m.Body.ContentType = BodyType.Text;
        m.Subject = me.Subject;
        m.CcRecipients.Add(me.Cc);
        m.BccRecipients.Add(me.Bcc);
        m.ToRecipients.Add(me.To);
        outlook.Me.Messages.AddMessageAsync(m).Wait();
        foreach (var attach in me.Attachments)
        {
            var file = attach.File;
            var fileversion = file.GetVersion(attach.Version);
            string fullpath = LibraryServiceImpl.GetFullNameInArchive(fileversion);
            var mattach = new FileAttachment { Name = file.Name, ContentId = attach.ContentId, ContentLocation = fullpath, ContentType = GraphicUtils.DetermineMime(Path.GetExtension(fullpath)) };
            if (file.Name.MissingText())
                mattach.Name = attach.ContentId + fileversion.FileExtension;
            m.Attachments.Add(mattach);
            await m.UpdateAsync();
        }
        await m.SendAsync();
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-24
    • 1970-01-01
    • 2022-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-11
    相关资源
    最近更新 更多