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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 02:26:22