You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Web API中使用Azure Communication Service发送邮件的问题排查

使用Azure Communication Service在Web API中发送邮件的问题

我正在使用Azure Communication Service发送邮件,需要在Web API中实现调用Post接口时,同时将用户记录存入数据库并发送邮件。以下是我的代码:

[HttpPost]
public async Task<ActionResult<UserTable>> Post([FromBody] UserTable userinfo)
{
    try
    {            
        var item = await _userTableRepository.AddUser(userinfo);          
        string recipientEmail = userinfo.Email;
        string subject = "Welcome to our platform";
        string body = $"Hello {userinfo.UserId}";
        await SendEmail(recipientEmail,subject, body);
        return Ok(item);
    }
    catch (Exception)
    {
        return StatusCode(StatusCodes.Status500InternalServerError, "Error sending email or saving data");
    }
}

private async Task SendEmail(string recipientEmail, string subject, string body)
{
    var client = new EmailClient(emailconnectionstring);
    var emailMessage = new EmailMessage()
    {
        From = new EmailAddress("sender@example.com"),
        To = new List<EmailAddress>()
        {
            new EmailAddress(recipientEmail)
        },
        Subject = subject,
        Body = new EmailBody()
        {
            ContentType = EmailBodyType.Text,
            Content = body
        }
    };
    await client.SendAsync(emailMessage);
}

单独测试邮件代码时可正常运行,但在Web API中出现以下编译错误:

  • Error CS1729 'EmailMessage' 不包含采用0个参数的构造函数
  • Error CS0117 'EmailMessage' 不包含 'From' 的定义
  • Error CS0117 'EmailMessage' 不包含 'To' 的定义
  • Error CS0117 'EmailMessage' 不包含 'Subject' 的定义
  • Error CS0117 'EmailMessage' 不包含 'Body' 的定义
  • Error CS0246 找不到类型或命名空间名称“EmailBody”(是否缺少 using 指令或程序集引用?)
  • Error CS0103 当前上下文中不存在名称“EmailBodyType”
  • Error CS1501 方法“SendAsync”没有采用1个参数的重载

请问代码中是否有遗漏项?是否有其他在Web API中使用Azure Communication Service发送邮件的方法?


问题原因及解决办法

这些编译错误的核心原因是Azure Communication Services Email SDK版本不匹配,或是项目缺少正确的命名空间引用。你单独测试的代码使用的SDK版本和Web API项目中的版本不一致,导致API结构存在差异。

1. 确认SDK版本并引入正确命名空间

确保Web API项目安装最新版的Azure.Communication.Email NuGet包,然后在代码顶部添加以下命名空间:

using Azure.Communication.Email;
using Azure.Communication.Email.Models;

2. 修正邮件发送代码(适配最新SDK)

最新版SDK的EmailMessage构造方式、属性和SendAsync方法签名均有变化,修正后的SendEmail方法如下:

private async Task SendEmail(string recipientEmail, string subject, string body)
{
    var client = new EmailClient(emailconnectionstring);
    
    // 使用EmailMessage的正确构造方式
    var emailMessage = new EmailMessage(
        senderAddress: "sender@example.com",
        recipientAddresses: new List<string> { recipientEmail },
        subject: subject,
        plainTextContent: body);

    // SendAsync需要传入WaitUntil参数
    await client.SendAsync(WaitUntil.Completed, emailMessage);
}

3. 额外注意事项

  • 确保emailconnectionstring是从Azure门户获取的正确通信服务连接字符串,格式为endpoint=https://<resource-name>.communication.azure.com/;accesskey=<access-key>
  • 发送邮箱地址必须是Azure Communication Service中已验证的发件人地址(需完成域名或单个邮箱验证)

替代实现方式

如果需要更灵活的配置,可通过依赖注入管理EmailClient实例,避免每次发送邮件都创建新客户端:

  1. 在Program.cs中注册服务:
builder.Services.AddSingleton<EmailClient>(sp => 
    new EmailClient(builder.Configuration["AzureCommunicationServices:ConnectionString"]));
  1. 在控制器中注入使用:
private readonly EmailClient _emailClient;
private readonly IUserTableRepository _userTableRepository;

public YourController(IUserTableRepository userTableRepository, EmailClient emailClient)
{
    _userTableRepository = userTableRepository;
    _emailClient = emailClient;
}

// 修正后的SendEmail方法
private async Task SendEmail(string recipientEmail, string subject, string body)
{
    var emailMessage = new EmailMessage(
        "sender@example.com",
        new List<string> { recipientEmail },
        subject,
        body);

    await _emailClient.SendAsync(WaitUntil.Completed, emailMessage);
}

内容的提问来源于stack exchange,提问作者ani H

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 10:53:11