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

如何用.NET标准库调用Xero EmailInvoiceAsync发送发票邮件

正确使用Xero .NET库发送发票邮件的解决方案

首先,咱们先解决你遇到的Cannot assign void to an implicitly-typed variable错误:这个问题很简单——EmailInvoiceAsync方法返回的是无返回值的异步任务(Task),而不是带返回结果的Task<T>,所以你不能把它的执行结果赋值给变量,直接await调用就好。

接下来,结合你创建发票的场景,咱们一步步实现正确的发票邮件发送流程:

1. 获取创建成功的发票ID

在你调用CreateInvoicesAsync创建发票后,从响应结果里就能拿到真实的发票ID,完全不需要用Guid.NewGuid()做测试占位。示例代码:

var response = await AccountingApi.CreateInvoicesAsync(accessToken, xeroTenantId, invoices);
// 提取刚创建的发票ID
Guid createdInvoiceId = response._Invoices[0].InvoiceID.Value;

2. 调用EmailInvoiceAsync发送邮件(无返回值场景)

如果不需要关注HTTP响应的细节,直接用这个方法即可,记得去掉多余的变量赋值:

// 直接await调用,不需要赋值给任何变量
await AccountingApi.EmailInvoiceAsync(accessToken, xeroTenantId, createdInvoiceId, null);

这里最后一个RequestEmpty参数是可选的,传null就会遵循Xero默认逻辑——把邮件发送到发票关联联系人的邮箱。如果需要自定义收件人、抄送人或邮件内容,你可以构造对应的请求对象传入(具体可参考Xero API文档里的邮件参数定义)。

3. 调用EmailInvoiceAsyncWithHttpInfo发送邮件(需要响应信息场景)

如果需要检查HTTP响应状态码、响应头等细节(比如确认邮件是否发送成功),就用这个方法,它会返回包含完整响应详情的对象:

var responseInfo = await AccountingApi.EmailInvoiceAsyncWithHttpInfo(accessToken, xeroTenantId, createdInvoiceId, null);
// 获取响应状态码
var statusCode = responseInfo.StatusCode;
// 获取响应头信息
var headers = responseInfo.Headers;

你可以根据这些信息做异常处理或日志记录。

整合到你的Create方法中

把发送邮件的逻辑加到创建发票成功之后,完整的代码片段如下:

public async Task<ActionResult> Create(string Name, string LineDescription, string LineQuantity, string LineUnitAmount, string LineAccountCode) { 
    // 省略前面的Token获取、配置初始化代码...

    var response = await AccountingApi.CreateInvoicesAsync(accessToken, xeroTenantId, invoices);
    
    // --- 新增发送发票邮件的逻辑 ---
    if (response._Invoices?.Any() == true)
    {
        Guid createdInvoiceId = response._Invoices[0].InvoiceID.Value;
        try
        {
            // 发送发票邮件
            await AccountingApi.EmailInvoiceAsync(accessToken, xeroTenantId, createdInvoiceId, null);
            // 如果需要响应信息,替换为下面的代码:
            // var emailResponse = await AccountingApi.EmailInvoiceAsyncWithHttpInfo(accessToken, xeroTenantId, createdInvoiceId, null);
            // 这里可以添加成功日志记录等逻辑
        }
        catch (ApiException ex)
        {
            // 处理发送失败的异常,比如记录错误日志
            Console.WriteLine($"发送发票邮件失败:{ex.Message}");
            // 根据业务需求返回错误提示或跳转页面
        }
    }
    // --- 发送邮件逻辑结束 ---

    var updatedUTC = response._Invoices[0].UpdatedDateUTC; 
    return RedirectToAction("Index", "InvoiceSync"); 
}

优化你的测试方法

你的EmailInvoiceTest方法是可行的,不过可以简化一下——因为RequestEmpty参数是可选的,直接传null即可:

public async Task EmailInvoiceTest(string accessToken, string xeroTenantId, Guid invoiceID) { 
    var AccountingApi = new AccountingApi(); 
    await AccountingApi.EmailInvoiceAsync(accessToken, xeroTenantId, invoiceID, null).ConfigureAwait(false); 
}

总结一下核心要点:

  • 不要给返回void的异步方法赋值变量
  • 用创建发票后的真实InvoiceID替换测试用的Guid.NewGuid()
  • 根据是否需要响应细节选择对应的发送方法

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 21:32:39