C#使用FluentEmail对接Gmail SMTP发信无响应、点击崩溃求助
C# FluentEmail 对接Gmail SMTP发送无响应、点击崩溃问题修复
核心问题原因
- 端口与SSL模式不匹配:你配置的465端口是Gmail的隐式SSL端口,.NET原生
SmtpClient仅支持显式STARTTLS模式,对应端口是587,隐式SSL连接会直接挂起无响应,这是点击后无反馈的核心原因。 - 异步调用死锁:从你用
Acr.UserDialogs判断这是MAUI/Xamarin类移动端UI项目,如果你在按钮点击事件里直接调用SendEmail()没有加await,会导致UI线程和异步任务上下文死锁,第一次点击卡住,第二次点击重入访问挂死的SMTP连接就会触发应用崩溃。 - 无异常捕获逻辑:当前代码没有捕获SMTP连接、认证阶段的异常,出错后没有抛出也没有日志,断点打在方法入口如果静态构造函数先出异常,会触发类型加载失败,后续调用直接崩溃。
- Gmail账号认证限制:2022年之后Gmail已经关闭了“低安全性应用访问”入口,直接用账号密码登录SMTP会被拒绝,需要给账号开启两步验证后生成应用专用密码作为SMTP登录密码,普通账号密码无法通过认证。
- 静态SmtpClient复用隐患:静态构造函数里初始化的SmtpClient长期复用会出现连接泄漏,多次发送后连接占满会触发超时或崩溃。
修正后可运行代码
public static class EmailSender { // 替换为你的临时Gmail账号,开启两步验证后生成的应用专用密码 private static readonly string username = "你的临时Gmail地址@gmail.com"; private static readonly string password = "你的Gmail应用专用密码"; // 每次发送创建新的SmtpClient,避免连接复用问题 private static SmtpClient BuildSmtpClient() { return new SmtpClient { Host = "smtp.gmail.com", DeliveryMethod = SmtpDeliveryMethod.Network, Credentials = new NetworkCredential(username, password), Port = 587, // 替换为587端口,配合EnableSsl走显式TLS EnableSsl = true, Timeout = 10000 // 加10秒超时,避免无限挂起 }; } public static async Task SendEmail(string body) { try { // 每次发送新建SmtpSender实例 var sender = new SmtpSender(BuildSmtpClient); var email = await Email .From(username) .To("你的个人Gmail地址@gmail.com") // 替换为收件人邮箱 .Subject("NEW BUG") .Body(body) .SendAsync(); if (email.Successful) { await Acr.UserDialogs.UserDialogs.Instance.AlertAsync("Your message was sent!", "Succesful", "Ok"); } else { // 打印发送错误信息方便排查 var errorMsg = string.Join("\n", email.ErrorMessages); await Acr.UserDialogs.UserDialogs.Instance.AlertAsync($"Send failed: {errorMsg}", "Error", "Ok"); } } catch (Exception ex) { await Acr.UserDialogs.UserDialogs.Instance.AlertAsync($"Exception: {ex.Message}", "Error", "Ok"); } } }
额外注意事项
- 按钮点击事件必须加
async修饰,调用SendEmail时必须加await,不要用.Wait()或者.Result同步等待,否则依然会触发UI线程死锁,正确写法示例:private async void SendButton_Clicked(object sender, EventArgs e) { await EmailSender.SendEmail("测试邮件内容"); } - 临时Gmail账号不要用异地IP登录,否则会触发Gmail的安全风控,直接拦截SMTP登录请求,首次登录建议先在网页端登录一次,确认没有安全验证提示后再用SMTP。
- 如果依然出现连接问题,可以把
Timeout时间适当调长,测试阶段可以先在本地控制台项目跑通SMTP认证逻辑,再集成到移动端项目里。
内容的提问来源于stack exchange,提问作者youngcoder126
相关产品推荐
相关产品推荐

