C# Office 365使用OutlookServicesClient发送带有附件的电子邮件

C# Office 365使用OutlookServicesClient发送带有附件的电子邮件,c#,api,office365,C#,Api,Office365,我正试图代表我的LOB应用程序的用户发送一些电子邮件。我正在使用Office 365连接服务API,以便使用OAuth进行身份验证。我的代码将发送电子邮件,但不会显示任何附件。下面是我的代码的一个单独示例: static async void SendUsingOutlookClient(CommunicationRow me, OutlookServicesClient outlook) { var m = new Message(); m.Fr

我正试图代表我的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在此处找到

我自己刚刚尝试过,问题似乎是在发送时,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();

我自己也试过了,但问题似乎是在发送时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();

我发现了这一点,似乎在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();
    }

我发现了这一点,似乎在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();
    }

你有没有通过密码?在foreach循环的这一行上,
me.Attachments
的值是多少。。?也许这个链接也会有帮助。这可以通过C#.net
System.Mail.net
@MethodMan轻松完成。发送电子邮件并不是问题,通过代码也不会告诉我太多。我的电子邮件到达目的地时没有任何附件。根据我对问题的描述,我正在尝试使用OAuth对发送者进行身份验证。我不知道如何在System.Mail.Net.SmtpClient上使用它。该类中的凭据需要输入密码。单步执行代码将告诉您很多。。正如我早些时候问的。。在发送电子邮件之前,附件的价值是多少。。例如,您可能没有获取附件的完整文件路径/名称。这也必须是异步发送。。帮助我们帮助你。。thanks@MethodMan是的,当我一步一步地附上一份pdf时,mattach的属性似乎是合理的,我可以访问完整路径中的文件。我在这里添加了一个指向正在使用的库的链接,并且我只能访问异步方法。您是否已逐步阅读了代码?在foreach循环的这一行上,
me.Attachments
的值是多少。。?也许这个链接也会有帮助。这可以通过C#.net
System.Mail.net
@MethodMan轻松完成。发送电子邮件并不是问题,通过代码也不会告诉我太多。我的电子邮件到达目的地时没有任何附件。根据我对问题的描述,我正在尝试使用OAuth对发送者进行身份验证。我不知道如何在System.Mail.Net.SmtpClient上使用它。该类中的凭据需要输入密码。单步执行代码将告诉您很多。。正如我早些时候问的。。在发送电子邮件之前,附件的价值是多少。。例如,您可能没有获取附件的完整文件路径/名称。这也必须是异步发送。。帮助我们帮助你。。thanks@MethodMan是的,当我一步一步地附上一份pdf时,mattach的属性似乎是合理的,我可以访问完整路径中的文件。我在这里添加了一个指向正在使用的库的链接,并且我只能访问异步方法。感谢您发布这篇文章。我已经猜出来了,但是你应该得到分数。谢谢你发这个帖子。我已经猜出来了,但你应该得到分数。