调用SendGrid API发送邮件无返回结果,请求排查问题
问题分析与修正方案
核心代码错误
你的代码仅完成了创建邮件对象的步骤,完全没有调用SendGrid的发送API,这就是请求未离开本地、无返回结果的根本原因:
- 代码中创建了
SendGridClient和邮件对象,但缺少关键的发送操作:- 若保留
async,需添加await client.SendEmailAsync(output); - 按要求移除
async,则改用同步调用client.SendEmailAsync(output).GetAwaiter().GetResult();
- 若保留
发件地址验证问题
即便补上发送代码,noreply@noreply.biz这个未验证的发件地址也会导致SendGrid拒绝请求:
- SendGrid要求发件地址必须是已验证的域名或单个邮箱,未验证地址会被系统拦截,需先在SendGrid后台完成域名/邮箱验证。
其他优化点
- 异常处理仅设置
ret=false,未记录异常详情,建议添加日志输出(如Console.WriteLine(ex.ToString());),方便排查问题。 - 配置构建逻辑可抽离到方法外部,避免每次调用重复构建,提升性能。
修正后的示例代码(移除async版本)
public bool SendEmail(string To, string From, string Subject, string Body) { bool ret = true; try { var builder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json"); var configuration = builder.Build(); var apiKey = configuration.GetValue<string>("Communications:SendGridApiKey"); var client = new SendGridClient(apiKey); var message = MailHelper.CreateSingleEmail(new EmailAddress(From), new EmailAddress(To), Subject, Body, Body); // 新增发送调用(同步版本) var response = client.SendEmailAsync(message).GetAwaiter().GetResult(); // 检查响应状态,判断是否发送成功 if (!response.IsSuccessStatusCode) { ret = false; var errorMsg = response.Body.ReadAsStringAsync().GetAwaiter().GetResult(); Console.WriteLine(errorMsg); } } catch (Exception ex) { ret = false; // 记录异常信息 Console.WriteLine(ex.ToString()); } return ret; }
内容的提问来源于stack exchange,提问作者Wallace B. McClure
相关产品推荐
相关产品推荐

