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

Flutter使用mailer发送邮件附件为空、报文件不存在错误如何解决

问题原因

报错的核心原因有两个:

  1. 你代码里直接写hello1.txt用的是相对路径,Flutter App运行时的工作目录和你项目的lib目录不是同一个位置,系统按相对路径根本找不到目标文件。
  2. 存放在项目lib目录下的文件属于App打包内置资源,不会直接暴露在设备文件系统里,不能直接通过File(路径)的方式读取,必须先把资源提取到设备可访问的目录,才能作为文件附件加载。
解决步骤
  1. 先在项目根目录的pubspec.yaml里声明你要发送的lib下的文件为静态资源,示例配置如下:
flutter:
  assets:
    # 替换成你实际存放在lib下的文件路径
    - lib/hello1.txt
  1. 添加必要的依赖,用来获取设备临时目录、拼接合法文件路径,在pubspec.yaml的dependencies下新增:
dependencies:
  # 原有mailer等依赖保留
  path_provider: ^2.1.0
  path: ^1.8.3

配置完成后执行flutter pub get拉取依赖。
3. 修改发信逻辑,先提取内置资源到临时目录生成实体文件,再挂载为附件,修正后的代码如下:

import 'dart:io';
import 'package:flutter/services.dart';
import 'package:path/path.dart' as p;
import 'package:path_provider/path_provider.dart';
import 'package:mailer/mailer.dart';
import 'package:mailer/smtp_server/gmail.dart';

sendEmail() async {
  String username = '***********';
  // 注意Gmail需使用两步验证生成的应用专用密码,不能填账号原密码
  String password = '*********';

  final smtpServer = gmail(username, password);

  // 读取lib下声明的内置资源
  final byteData = await rootBundle.load('lib/hello1.txt');
  // 获取设备临时存储目录
  final tempDir = await getTemporaryDirectory();
  // 将资源写入临时目录生成可访问的实体文件
  final attachmentFile = File(p.join(tempDir.path, 'hello1.txt'));
  await attachmentFile.writeAsBytes(
    byteData.buffer.asUint8List(
      byteData.offsetInBytes,
      byteData.lengthInBytes
    )
  );

  final message = Message()
    ..from = Address(username)
    ..recipients.add('******@gmail.com')
    ..subject = 'SEND OF FILE WITH TEXT '
    ..text = 'Hello \n  :) this a file with text '
    ..attachments = [FileAttachment(attachmentFile)];

  try {
    final sendReport = await send(message, smtpServer);
    print('Message sent: ' + sendReport.toString());
  } on MailerException catch (e) {
    print('Message not sent. \n' + e.toString());
  }
}
注意事项
  • 修改完pubspec.yaml的资源配置后,必须完全关闭当前运行的App,重新执行flutter run启动,热重载不会加载新声明的静态资源,会触发资源找不到的错误。
  • 如果你要发送的文件不是项目内置资源,是设备本地存储里lib文件夹下的文件,必须先拿到该文件的完整绝对路径再生成File对象,不能使用相对路径。
  • 若后续出现SMTP认证错误,检查Gmail账号是否开启了两步验证,password字段是否填写的是16位应用专用密码,普通账号密码无法调用Gmail SMTP服务发信。

内容的提问来源于stack exchange,提问作者Abeer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 01:01:14