如何用.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
相关产品推荐
相关产品推荐

