如何使用Microsoft Graph从任何一个电子邮件地址发送电子邮件

5

我正在使用微软图形来发送电子邮件。我想要从Active Directory中存在的任何电子邮件地址发送此电子邮件。 我已经获得了Mail.Send的权限,并在Azure上获得了管理员同意。因此,在Azure层面上,已经设置好了访问和权限。

现在当涉及到代码时,我已经搜索过了,但是我无法弄清楚如何调用Microsoft Graph API来发送电子邮件。以下是我执行搜索时找到的代码。我如何替换下面的代码以向Azure AD中的任何人从Azure AD中的任何人发送电子邮件。同时,关于“发送AS”的代码。

  await graphClient.Me.Messages
              .Request()
                .AddAsync(message);

先生,关于这个案件是否有任何更新或进一步的问题需要解决吗? - Tiny Wang
3个回答

14
请注意,自从Graph API v.5.0(2023年3月)以来,微软引入了一个令人讨厌的破坏性变化,除了晦涩的这里之外,没有真正很好的文档记录。
现在,SendMail不能再作为用户的方法使用。如果您尝试这样做,您将会得到一个CS1955 非可调用成员不能像方法一样使用的编译器错误。
您需要做类似于以下的事情:
        // Your old Message object definition
        Microsoft.Graph.Models.Message msg = new()
        {
            From = ...,
            ToRecipients = ...,
            Subject = "...",

            Body = new ItemBody
            {
                ContentType = BodyType.Html,
                Content = "..."
            }
        };

        Microsoft.Graph.Users.Item.SendMail.SendMailPostRequestBody body = new()
        {
            Message = msg,
            SaveToSentItems = false  // or true, as you want
        };

        try
        {
            await graphClient.Users["your user GUID"]
            .SendMail
            .PostAsync(body);
        }
        catch (Exception ex)
        {
            // log your exception here
        }

1
WTF............ - RustyH
谢谢你提供的唯一有效的答案,再次发生了破坏性变化:“Graph API v. 5.0 (2023年3月),微软引入了一个令人讨厌的破坏性变化”。await graphClient.Users["你的用户GUID"] .SendMail .PostAsync(body);谢谢! - undefined

3
意图是已登录的用户将不会使用自己的电子邮件地址发送电子邮件,而是由其他人的名字自动发送电子邮件通知给他人。 然后,我认为您想要向您的用户提供发送电子邮件的功能,用户可以选择接收电子邮件的人,但所有电子邮件都应从特定帐户发送,例如admin@xxx.onmicrosoft.com,因此您需要了解一些有关发送电子邮件API的内容。 正如@user2250152所提到的,await graphClient.Users["userId"],这里的userId表示谁发送电子邮件,因为您的要求是从一个特定的电子邮件地址发送所有电子邮件,所以它应该以硬编码方式设置为admin@xxx.onmicrosoft.com。 接下来是如何发送电子邮件,调用ms graph api应该提供访问令牌,由于您的要求是通过应用程序而不是每个用户发送电子邮件,因此我恐怕客户端凭据流程是更好的选择,这样当情况涉及到从几个特定的电子邮件地址发送电子邮件时,您就不需要更改流程。现在,您需要要求租户管理员在Azure AD中添加Mail.Send Application API权限以使用这种类型的流程。

enter image description here

这里是代码:

using Azure.Identity;
using Microsoft.Graph;
var mesg = new Message
{
    Subject = "Meet for lunch?",
    Body = new ItemBody
    {
        ContentType = BodyType.Text,
        Content = "The new cafeteria is open."
    },
    ToRecipients = new List<Recipient>
    {
        new Recipient
        {
            EmailAddress = new EmailAddress
            {
                //who will receive the email
                Address = "xxx@gmail.com"
            }
        }
    },
    Attachments = new MessageAttachmentsCollectionPage()
};

var scopes = new[] { "https://graph.microsoft.com/.default" };
var tenantId = "your_tenant_name.onmicrosoft.com";
var clientId = "azure_ad_app_client_id";
var clientSecret = "client_secret_for_the_azuread_app";
var clientSecretCredential = new ClientSecretCredential(
    tenantId, clientId, clientSecret);
var graphClient = new GraphServiceClient(clientSecretCredential, scopes);
await graphClient.Users["user_id_which_you_wanna_used_for_sending_email"].SendMail(mesg, false).Request().PostAsync();

遵循相同的步骤,但却无法正常工作。只有在使用AD账户时才能发送邮件,但对于Gmail账户,无法发送邮件。出现了类型为'Microsoft.Graph.Models.ODataErrors.ODataError'的异常。 - undefined
只有使用AD帐户才能发送邮件,但对于Gmail帐户,邮件无法发送。我们使用的是MS Graph API来发送邮件,因此您应该在您的租户中使用Microsoft帐户,该帐户应该类似于xx@tenantname.onmicrosoft.com。Gmail帐户不是由Microsoft提供的。如果您将您的Gmail帐户注册到您的租户中,这样您就可以使用Gmail帐户登录Azure AD,那么您应该拥有一个相应的帐户,类似于xx_gmail.com#EXT#@tenantname.onmicrosoft.com,这是您应该使用的帐户。 - undefined
顺便说一句,你还需要确保已经为该账户分配了像Ms E5许可证这样的许可证,以便它具有发送电子邮件的能力。我知道我们可以使用Gmail账户发送电子邮件,但是Graph API没有联系Gmail服务器发送电子邮件的能力。总结:我们需要使用你租户中已经分配了正确许可证的账户来使用这个API发送电子邮件。如果我理解错了,请纠正我。 - undefined
1
小伙子,我明白你的回答了。谢谢,这帮了我大忙。 - undefined
很好:) - undefined

1
您可以通过以下方式从其他用户发送邮件。
var message = new Message
{
    Subject = "Subject",
    Body = new ItemBody
    {
        ContentType = BodyType.Text,
        Content = "Content"
    },
    ToRecipients = new List<Recipient>()
    {
        new Recipient
        {
            EmailAddress = new EmailAddress
            {
                Address = "john.doe@contoso.onmicrosoft.com"
            }
        }
    }
};

var saveToSentItems = false;

await graphClient.Users["userId"]
    .SendMail(message,saveToSentItems)
    .Request()
    .PostAsync();

userId是用户的唯一标识符。您可以使用userPrincipalName代替userId。UPN是基于Internet标准RFC 822的用户的Internet风格登录名。按照惯例,这应该映射到用户的电子邮件名称。

资源:

发送邮件

用户资源


那个 userId 是什么?等待 graphClient.Users["userId"] - Jashvita
@Salma userId是用户的唯一标识符。作为替代,您可以使用用户电子邮件而不是用户ID。我已更新答案。 - user2250152
嗨,实际上我正在寻找一种方法来判断登录用户是否在其他人的名义发送电子邮件。那么此时应该填写谁的用户ID呢?我的意图是登录用户不会使用自己的电子邮件地址发送电子邮件,而是由其他人的名字自动发送电子邮件通知给某人。或者我需要获取用户ID并进行硬编码,但这可能不正确。 - Jashvita

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接