Flutter使用mailer插件发送Gmail邮件报凭据错误如何解决
报错核心原因
Gmail 自2022年起正式下线了「低安全性应用访问」功能,直接使用账号日常登录密码通过第三方客户端/插件走SMTP发信的请求会被官方直接拦截,无论你输入的登录密码是否正确,都会返回「用户名/密码/凭证错误」的提示,和你代码里的邮件构造逻辑没有关系。
修复步骤
- 开启Gmail账号的两步验证
进入对应Gmail账号的Google安全设置页,找到「两步验证」选项,按照指引完成身份校验、开启两步验证功能,未开启两步验证的账号无法生成后续需要的应用专用密码。 - 生成应用专用密码
两步验证开启成功后,回到Google安全设置页,找到「应用专用密码」入口:应用类型选择「邮件」,设备类型可自定义选择(比如选「其他」填Flutter测试应用),点击生成后会得到一串16位长度的随机密码,这串密码才是mailer插件配置时需要填写的密码值,不要填写你日常登录Gmail用的账号密码。 - 替换代码中的凭证配置
将代码里password字段的值替换为刚才生成的16位应用专用密码,username字段保留完整的Gmail邮箱地址即可,其余邮件构造、发送逻辑不需要改动,修正后的核心配置参考如下:
sendEmail() async { String username = '你的Gmail全地址@gmail.com'; // 注意:此处填写16位应用专用密码,而非日常登录密码 String password ='生成的16位应用专用密码'; final smtpServer = gmail(username, password); // 原有邮件构造逻辑无需修改 final message = Message() ..from = Address(username) ..recipients.add('收件人邮箱@gmail.com') ..subject = 'Test Dart Mailer library :: 😀 :: ${DateTime.now()}' ..text = 'This is the plain text.\nThis is line 2 of the text part.'; try { final sendReport = await send(message, smtpServer); print('Message sent: ' + sendReport.toString()); } on MailerException catch (e) { print('Message not sent. \n'+ e.toString()); } }
- 额外排查项
如果替换凭证后仍然报错,先确认运行代码的设备可以正常连通Gmail服务,网络限制导致无法连接SMTP服务器时,也可能偶发凭证错误类的误报。
内容的提问来源于stack exchange,提问作者Abeer
相关产品推荐
相关产品推荐

