Mailer 6.0.1无法发送邮件问题求助
问题背景
尝试使用Mailer库给注册用户发送申请结果邮件(接受/拒绝),点击按钮后邮件既未发出也无任何反馈。相关代码如下:
发送邮件方法代码
Future sendMail(String s, String em) async { SmtpServer gmail(String username, String password) => SmtpServer('smtp.gmail.com', username: 'lassenapp@gmail.com', password: 'kfaniqjzupiuvgtj'); final email = 'XXXXx'; //my correct email final smtpServer = gmail(email, 'XXX'); // password I get it from google setting using app password 2 auth. String t = ''; String reply = ''; if (s == 'accepted') { t = ' نسعد بقبولك في تطبيق لسن كمعلم/معلمة لطلابنا المبدعين، مرحبًا بك بيننا'; reply = 'القبول'; } else { t = 'نأسف لعدم قبولك في تطبيق لسن كمعلم/معلمة لطلابنا نعتذر منك، دمت بخير'; reply = 'الرفض'; } final msg = Message() ..from = Address(email, 'تطبيق لسن') ..recipients.add(em) ..subject = 'حالة حسابك في تطبيق لسن' ..text = t; try { await send(msg, smtpServer); showSnackBar('بنجاح' + reply + 'تم'); } on MailerException catch (e) { print(e); } } void showSnackBar(String text) { final snackBar = SnackBar( content: Text( text, style: TextStyle(fontSize: 20), ), backgroundColor: Colors.green, ); ScaffoldMessenger.of(context) ..removeCurrentSnackBar() ..showSnackBar(snackBar); } }
按钮调用代码
ElevatedButton( style: ButtonStyle( shape: MaterialStateProperty.all< RoundedRectangleBorder>( RoundedRectangleBorder(borderRadius:BorderRadius.circular(50))), backgroundColor:MaterialStateProperty.all<Color>(Colors.green)), onPressed: () {update(row['userId'], "mentor");sendMail("accept", row['email']);}, child: Text("قبول")),
排查与解决步骤
参数匹配错误:调用
sendMail("accept", row['email'])时传入的第一个参数是"accept",但方法内判断条件是s == 'accepted',两者不匹配,导致邮件内容走else分支,且SnackBar提示文本拼接顺序逻辑错误。
解决:将调用参数改为sendMail("accepted", row['email']),同时调整SnackBar文本为'تم ' + reply + ' بنجاح'。SMTP配置不一致:方法内自定义的
gmail函数固定使用username: 'lassenapp@gmail.com',但后续又传入final email = 'XXXXx'作为参数,导致实际SMTP用户名可能不匹配。
解决:删除自定义的gmail函数,直接使用正确的SMTP配置:final smtpServer = SmtpServer('smtp.gmail.com', username: 'lassenapp@gmail.com', // 必须是启用2步验证的目标邮箱 password: 'kfaniqjzupiuvgtj' // 已生成的应用专用密码 );异常捕获范围不全:当前仅捕获
MailerException,网络错误、权限问题等其他异常会被忽略,导致无任何反馈。
解决:添加通用异常捕获,同时在异常分支显示错误提示:try { await send(msg, smtpServer); showSnackBar('تم ' + reply + ' بنجاح'); } on MailerException catch (e) { print('邮件发送异常: ${e.message}'); showSnackBar('خطأ في إرسال البريد: ${e.message}'); } catch (e) { print('未知错误: $e'); showSnackBar('حدث خطأ غير متوقع'); }异步调用未处理:按钮
onPressed中直接调用sendMail但未使用await,如果update方法也是异步操作,可能导致上下文丢失或未等待发送完成。
解决:将onPressed改为异步函数:onPressed: () async { await update(row['userId'], "mentor"); await sendMail("accepted", row['email']); },阿拉伯文本编码问题:邮件内容使用阿拉伯语,建议同时设置
html内容,避免文本显示异常:final msg = Message() ..from = Address(email, 'تطبيق لسن') ..recipients.add(em) ..subject = 'حالة حسابك في تطبيق لسن' ..text = t ..html = '<p>$t</p>';应用专用密码有效性:确认生成的应用专用密码是针对启用2步验证的
lassenapp@gmail.com邮箱,且密码未被修改或撤销。
内容的提问来源于stack exchange,提问作者leenah Al-Mashari

