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

如何在Flutter桌面端应用中实现带PDF附件的邮件发送功能

Flutter桌面端邮件发送(带PDF附件)可行方案

以下是经过验证的3种适配桌面端的实现方案,可结合你的业务场景选择:


方案1:使用纯Dart SMTP库mailer直连发送(最推荐,全平台适配)

该方案不依赖系统邮件客户端,支持任意大小附件,发送过程完全可控,适配Windows/macOS/Linux所有桌面端系统。

  • 第一步:添加依赖到pubspec.yaml
dependencies:
  mailer: ^6.1.0
  • 第二步:核心实现代码示例
import 'package:mailer/mailer.dart';
import 'package:mailer/smtp_server.dart';
import 'dart:io';

sendReceiptEmail(String pdfPath, String targetEmail) async {
  // 可替换为你使用的邮箱SMTP配置,示例为QQ邮箱配置
  final smtpServer = SmtpServer('smtp.qq.com',
      username: '你的发件邮箱@qq.com',
      password: '你的SMTP授权码',
      port: 465,
      ssl: true);

  // 构造邮件内容
  final message = Message()
    ..from = const Address('你的发件邮箱@qq.com', '发件人展示名称')
    ..recipients.add(targetEmail)
    ..subject = '消费收据通知'
    ..text = '您好,附件是您本次消费的收据PDF文件,请查收。'
    // 绑定生成好的PDF文件作为附件
    ..attachments.add(FileAttachment(File(pdfPath)));

  try {
    await send(message, smtpServer);
    // 这里添加发送成功的业务逻辑
  } on MailerException catch (e) {
    // 这里添加发送失败的异常处理逻辑
  }
}

注意事项:

  • SMTP授权码需要在对应邮箱的设置页面开启SMTP服务后获取,不要直接使用邮箱登录密码
  • 生产环境不建议硬编码发件邮箱的SMTP授权码到客户端代码中,可改为让用户自行配置个人发件邮箱,或通过后端服务中转邮件发送请求

方案2:调用本地桌面邮件客户端发送

如果不需要静默发送,允许用户通过本地已安装的邮件客户端确认后发送,可使用url_launcher拼接mailto链接实现:

  • 优点:无需配置SMTP服务,所有发送操作走用户本地已授权的邮件客户端,不会泄露密钥
  • 缺点:附件支持依赖本地邮件客户端的兼容性,大体积PDF可能无法正常识别,未安装邮件客户端的设备无法使用
  • 示例代码:
import 'package:url_launcher/url_launcher.dart';

launchLocalEmailClient(String targetEmail, String pdfPath) async {
  final Uri emailUri = Uri(
    scheme: 'mailto',
    path: targetEmail,
    query: 'subject=收据文件&body=您好,请查收附件收据&attach=$pdfPath',
  );
  if (await canLaunchUrl(emailUri)) {
    await launchUrl(emailUri);
  } else {
    // 提示用户未检测到可用的邮件客户端
  }
}

方案3:后端中转发送

如果你的应用有配套后端服务,可将生成的PDF文件上传到后端接口,由后端服务调用邮件服务完成发送,该方案安全性最高,避免SMTP密钥泄露风险,也不需要客户端处理邮件发送逻辑。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 01:48:03