使用Android+C#发邮件时执行SmtpServer.Send无返回无报错问题
安卓+C#环境下SmtpClient发送邮件卡住的解决方案
你原有的代码是WPF桌面端实现,直接搬到安卓平台会存在多个适配问题,按以下步骤排查修复即可:
- 替换同步
Send方法为异步实现,避免主线程阻塞
安卓平台禁止在主线程执行耗时网络操作,同步调用SmtpServer.Send(mail)会直接触发主线程阻塞,系统会挂起调用逻辑甚至吞掉异常,不会有任何报错提示。你需要改用异步方法SendMailAsync,放在非UI线程执行,同时添加异常捕获逻辑:
try { await SmtpServer.SendMailAsync(mail); } catch (Exception ex) { // 此处可捕获到具体报错信息,方便定位问题 Console.WriteLine(ex.ToString()); }
- 检查安卓网络权限配置
打开AndroidManifest.xml文件,确认已经添加网络访问权限:
<uses-permission android:name="android.permission.INTERNET" />
未授予网络权限时所有网络请求会被系统静默拦截,不会抛出显式异常,只会停留在调用处无响应。
- 替换过时的SmtpClient实现
System.Net.Mail.SmtpClient已被官方标记为过时,跨平台兼容性极差,移动端场景下推荐使用适配全平台的开源邮件库MailKit实现发送逻辑:- 先安装对应的NuGet包:
MailKit、MimeKit - 参考示例代码实现:
- 先安装对应的NuGet包:
using MailKit.Net.Smtp; using MimeKit; var message = new MimeMessage(); message.From.Add(new MailboxAddress("发件人", "xxxxxxx@outlook.com")); message.To.Add(new MailboxAddress("收件人", etEmailUser.Text)); message.Subject = "Subject"; message.Body = new TextPart("html") { Text = "email body" }; using (var client = new SmtpClient()) { await client.ConnectAsync("smtp.live.com", 587, true); await client.AuthenticateAsync("xxxxxxx@outlook.com", "你的验证密码"); await client.SendAsync(message); await client.DisconnectAsync(true); }
- 调整Outlook账号安全配置
开启两步验证的Outlook账号必须使用专用应用密码,不能直接用原登录密码做SMTP验证,你需要到Outlook账号安全中心生成应用密码,替换代码中的密码字段。 - 相关问题截图:

内容的提问来源于stack exchange,提问作者Plc Worker
相关产品推荐
相关产品推荐

