Flutter邮件发送插件simple_email_sender的使用

Flutter邮件发送插件simple_email_sender的使用

本项目是一个新的Flutter插件包,用于在Android和iOS平台上实现邮件发送功能。通过使用simple_email_sender插件,你可以在Flutter应用中轻松地发送电子邮件。

开始使用

要开始使用simple_email_sender插件,首先需要将它添加到你的pubspec.yaml文件中:

dependencies:
  simple_email_sender: ^版本号

然后运行flutter pub get来安装依赖。

完整示例代码

以下是一个完整的示例代码,展示了如何在Flutter应用中使用simple_email_sender插件来发送邮件。

示例代码

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'dart:io';
import 'dart:async';

import 'package:simple_email_sender/simple_email_sender.dart';
import 'package:image_picker/image_picker.dart';
import 'package:path_provider/path_provider.dart';

void main() => runApp(const MyApp());

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(primaryColor: Colors.red),
      home: const EmailSender(),
    );
  }
}

class EmailSender extends StatefulWidget {
  const EmailSender({Key? key}) : super(key: key);

  [@override](/user/override)
  State<EmailSender> createState() => _EmailSenderState();
}

class _EmailSenderState extends State<EmailSender> {
  List<String> attachments = [];
  bool isHTML = false;

  final _recipientController = TextEditingController(
    text: 'example@example.com',
  );

  final _subjectController = TextEditingController(text: 'The subject');

  final _bodyController = TextEditingController(
    text: 'Mail body.',
  );

  Future<void> send() async {
    final Email email = Email(
      body: _bodyController.text,
      subject: _subjectController.text,
      recipients: [_recipientController.text],
      attachmentPaths: attachments,
      isHTML: isHTML,
    );

    String platformResponse;

    try {
      await SimpleEmailSender.send(email);
      platformResponse = 'success';
    } catch (error) {
      if (kDebugMode) {
        print(error);
      }
      platformResponse = error.toString();
    }

    if (!mounted) return;

    ScaffoldMessenger.of(context).showSnackBar(
      SnackBar(
        content: Text(platformResponse),
      ),
    );
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('插件示例应用'),
        actions: [
          IconButton(
            onPressed: send,
            icon: const Icon(Icons.send),
          )
        ],
      ),
      body: Padding(
        padding: const EdgeInsets.all(8.0),
        child: Column(
          mainAxisSize: MainAxisSize.max,
          crossAxisAlignment: CrossAxisAlignment.center,
          children: [
            Padding(
              padding: const EdgeInsets.all(8.0),
              child: TextField(
                controller: _recipientController,
                decoration: const InputDecoration(
                  border: OutlineInputBorder(),
                  labelText: '收件人',
                ),
              ),
            ),
            Padding(
              padding: const EdgeInsets.all(8.0),
              child: TextField(
                controller: _subjectController,
                decoration: const InputDecoration(
                  border: OutlineInputBorder(),
                  labelText: '主题',
                ),
              ),
            ),
            Expanded(
              child: Padding(
                padding: const EdgeInsets.all(8.0),
                child: TextField(
                  controller: _bodyController,
                  maxLines: null,
                  expands: true,
                  textAlignVertical: TextAlignVertical.top,
                  decoration: const InputDecoration(
                      labelText: '正文', border: OutlineInputBorder()),
                ),
              ),
            ),
            CheckboxListTile(
              contentPadding: const EdgeInsets.symmetric(vertical: 0.0, horizontal: 8.0),
              title: const Text('HTML'),
              onChanged: (bool? value) {
                if (value != null) {
                  setState(() {
                    isHTML = value;
                  });
                }
              },
              value: isHTML,
            ),
            Padding(
              padding: const EdgeInsets.all(8.0),
              child: Column(
                children: [
                  for (var i = 0; i < attachments.length; i++)
                    Row(
                      children: [
                        Expanded(
                          child: Text(
                            attachments[i],
                            softWrap: false,
                            overflow: TextOverflow.fade,
                          ),
                        ),
                        IconButton(
                          icon: const Icon(Icons.remove_circle),
                          onPressed: () => {_removeAttachment(i)},
                        )
                      ],
                    ),
                  Align(
                    alignment: Alignment.centerRight,
                    child: IconButton(
                      icon: const Icon(Icons.attach_file),
                      onPressed: _openImagePicker,
                    ),
                  ),
                  TextButton(
                    child: const Text('附加应用程序文档目录中的文件'),
                    onPressed: () => _attachFileFromAppDocumentsDirectory(),
                  ),
                ],
              ),
            ),
          ],
        ),
      ),
    );
  }

  void _openImagePicker() async {
    final picker = ImagePicker();
    PickedFile? pick = await picker.getImage(source: ImageSource.gallery);
    if (pick != null) {
      setState(() {
        attachments.add(pick.path);
      });
    }
  }

  void _removeAttachment(int index) {
    setState(() {
      attachments.removeAt(index);
    });
  }

  Future<void> _attachFileFromAppDocumentsDirectory() async {
    try {
      final appDocumentDir = await getApplicationDocumentsDirectory();
      final filePath = '${appDocumentDir.path}/file.txt';
      final file = File(filePath);
      await file.writeAsString('Text file in app directory');

      setState(() {
        attachments.add(filePath);
      });
    } catch (e) {
      ScaffoldMessenger.of(context).showSnackBar(
        const SnackBar(
          content: Text('Failed to create file in application directory'),
        ),
      );
    }
  }
}

代码说明

  1. 导入必要的库

    import 'package:flutter/foundation.dart';
    import 'package:flutter/material.dart';
    import 'dart:io';
    import 'dart:async';
    
    import 'package:simple_email_sender/simple_email_sender.dart';
    import 'package:image_picker/image_picker.dart';
    import 'package:path_provider/path_provider.dart';
    
  2. 定义主应用类

    void main() => runApp(const MyApp());
    
  3. 定义应用主体

    class MyApp extends StatelessWidget {
      const MyApp({super.key});
    
      [@override](/user/override)
      Widget build(BuildContext context) {
        return MaterialApp(
          theme: ThemeData(primaryColor: Colors.red),
          home: const EmailSender(),
        );
      }
    }
    
  4. 定义发送邮件的状态类

    class EmailSender extends StatefulWidget {
      const EmailSender({Key? key}) : super(key: key);
    
      [@override](/user/override)
      State<EmailSender> createState() => _EmailSenderState();
    }
    
  5. 实现发送邮件的具体逻辑

    class _EmailSenderState extends State<EmailSender> {
      List<String> attachments = [];
      bool isHTML = false;
    
      final _recipientController = TextEditingController(
        text: 'example@example.com',
      );
    
      final _subjectController = TextEditingController(text: 'The subject');
    
      final _bodyController = TextEditingController(
        text: 'Mail body.',
      );
    
      Future<void> send() async {
        final Email email = Email(
          body: _bodyController.text,
          subject: _subjectController.text,
          recipients: [_recipientController.text],
          attachmentPaths: attachments,
          isHTML: isHTML,
        );
    
        String platformResponse;
    
        try {
          await SimpleEmailSender.send(email);
          platformResponse = 'success';
        } catch (error) {
          if (kDebugMode) {
            print(error);
          }
          platformResponse = error.toString();
        }
    
        if (!mounted) return;
    
        ScaffoldMessenger.of(context).showSnackBar(
          SnackBar(
            content: Text(platformResponse),
          ),
        );
      }
    
  6. 构建UI

    [@override](/user/override)
    Widget build(BuildContext context) {
      return Scaffold(
        appBar: AppBar(
          title: const Text('插件示例应用'),
          actions: [
            IconButton(
              onPressed: send,
              icon: const Icon(Icons.send),
            )
          ],
        ),
        body: Padding(
          padding: const EdgeInsets.all(8.0),
          child: Column(
            mainAxisSize: MainAxisSize.max,
            crossAxisAlignment: CrossAxisAlignment.center,
            children: [
              Padding(
                padding: const EdgeInsets.all(8.0),
                child: TextField(
                  controller: _recipientController,
                  decoration: const InputDecoration(
                    border: OutlineInputBorder(),
                    labelText: '收件人',
                  ),
                ),
              ),
              Padding(
                padding: const EdgeInsets.all(8.0),
                child: TextField(
                  controller: _subjectController,
                  decoration: const InputDecoration(
                    border: OutlineInputBorder(),
                    labelText: '主题',
                  ),
                ),
              ),
              Expanded(
                child: Padding(
                  padding: const EdgeInsets.all(8.0),
                  child: TextField(
                    controller: _bodyController,
                    maxLines: null,
                    expands: true,
                    textAlignVertical: TextAlignVertical.top,
                    decoration: const InputDecoration(
                        labelText: '正文', border: OutlineInputBorder()),
                  ),
                ),
              ),
              CheckboxListTile(
                contentPadding: const EdgeInsets.symmetric(vertical: 0.0, horizontal: 8.0),
                title: const Text('HTML'),
                onChanged: (bool? value) {
                  if (value != null) {
                    setState(() {
                      isHTML = value;
                    });
                  }
                },
                value: isHTML,
              ),
              Padding(
                padding: const EdgeInsets.all(8.0),
                child: Column(
                  children: [
                    for (var i = 0; i < attachments.length; i++)
                      Row(
                        children: [
                          Expanded(
                            child: Text(
                              attachments[i],
                              softWrap: false,
                              overflow: TextOverflow.fade,
                            ),
                          ),
                          IconButton(
                            icon: const Icon(Icons.remove_circle),
                            onPressed: () => {_removeAttachment(i)},
                          )
                        ],
                      ),
                    Align(
                      alignment: Alignment.centerRight,
                      child: IconButton(
                        icon: const Icon(Icons.attach_file),
                        onPressed: _openImagePicker,
                      ),
                    ),
                    TextButton(
                      child: const Text('附加应用程序文档目录中的文件'),
                      onPressed: () => _attachFileFromAppDocumentsDirectory(),
                    ),
                  ],
                ),
              ),
            ],
          ),
        ),
      );
    }
    
  7. 选择附件并移除附件的方法

    void _openImagePicker() async {
      final picker = ImagePicker();
      PickedFile? pick = await picker.getImage(source: ImageSource.gallery);
      if (pick != null) {
        setState(() {
          attachments.add(pick.path);
        });
      }
    }
    
    void _removeAttachment(int index) {
      setState(() {
        attachments.removeAt(index);
      });
    }
    
    Future<void> _attachFileFromAppDocumentsDirectory() async {
      try {
        final appDocumentDir = await getApplicationDocumentsDirectory();
        final filePath = '${appDocumentDir.path}/file.txt';
        final file = File(filePath);
        await file.writeAsString('Text file in app directory');
    
        setState(() {
          attachments.add(filePath);
        });
      } catch (e) {
        ScaffoldMessenger.of(context).showSnackBar(
          const SnackBar(
            content: Text('Failed to create file in application directory'),
          ),
        );
      }
    }
    

更多关于Flutter邮件发送插件simple_email_sender的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter邮件发送插件simple_email_sender的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


simple_email_sender 是一个用于在 Flutter 应用中发送电子邮件的插件。它提供了一个简单的 API,允许开发者轻松地发送电子邮件。以下是如何使用 simple_email_sender 插件的步骤:

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 simple_email_sender 依赖:

dependencies:
  flutter:
    sdk: flutter
  simple_email_sender: ^1.0.0  # 请检查最新版本

然后运行 flutter pub get 来安装依赖。

2. 导入包

在需要使用 simple_email_sender 的文件中导入包:

import 'package:simple_email_sender/simple_email_sender.dart';

3. 发送邮件

使用 SimpleEmailSender 类来发送邮件。你可以通过 send 方法来发送邮件。以下是一个简单的示例:

void sendEmail() async {
  final email = Email(
    recipients: ['recipient@example.com'],
    subject: 'Test Email Subject',
    body: 'This is a test email body.',
    isHTML: false, // 设置为 true 如果你的邮件内容是 HTML
  );

  try {
    await SimpleEmailSender.send(email);
    print('Email sent successfully');
  } catch (e) {
    print('Failed to send email: $e');
  }
}

4. 处理权限 (Android)

在 Android 上,发送邮件需要 INTERNET 权限。确保在 AndroidManifest.xml 文件中添加以下权限:

<uses-permission android:name="android.permission.INTERNET" />

5. 处理附件 (可选)

你还可以在邮件中添加附件。以下是如何添加附件的示例:

void sendEmailWithAttachment() async {
  final email = Email(
    recipients: ['recipient@example.com'],
    subject: 'Test Email with Attachment',
    body: 'This is a test email with an attachment.',
    isHTML: false,
    attachmentPaths: ['/path/to/attachment/file.txt'], // 添加附件路径
  );

  try {
    await SimpleEmailSender.send(email);
    print('Email with attachment sent successfully');
  } catch (e) {
    print('Failed to send email with attachment: $e');
  }
}
回到顶部