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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 00:06:23