diff --git a/lib/utils/mailer.dart b/lib/utils/mailer.dart new file mode 100644 index 0000000..4422e3d --- /dev/null +++ b/lib/utils/mailer.dart @@ -0,0 +1,53 @@ +import 'package:desktopapp/utils/logger.dart'; +import 'package:desktopapp/utils/requests.dart'; +import 'package:enough_mail/enough_mail.dart'; + +class Mailer { + /// High level mail API example + static Future mailExample() async { + const email = 'trexricher1997@gmail.com'; + const password = 'rugnxbafhcwsykzt'; + Logger.log(LoggerType.info, Mailer, 'Discovering settings for $email'); + final config = await Discover.discover(email); + if (config == null) { + Logger.log(LoggerType.info, Mailer, + 'Unable to autodiscover settings for $email'); + return; + } + Logger.log(LoggerType.info, Mailer, 'Settings for $email : $config'); + final account = MailAccount.fromDiscoveredSettings( + 'my account', email, password, config); + final mailClient = MailClient(account, isLogEnabled: true); + try { + await mailClient.connect(); + Logger.log(LoggerType.info, Mailer, 'Connected to $email'); + await mailClient.selectInbox(); + mailClient.eventBus.on().listen((ImapEvent event) async { + if (event.eventType == ImapEventType.exists) { + final evt = event as ImapMessagesExistEvent; + if (evt.newMessagesExists <= evt.oldMessagesExists) return; + final sequence = MessageSequence(); + if (evt.newMessagesExists - evt.oldMessagesExists > 1) { + sequence.addRange(evt.oldMessagesExists, evt.newMessagesExists); + } else { + sequence.add(evt.newMessagesExists); + } + final messages = await mailClient.fetchMessageSequence(sequence, + fetchPreference: FetchPreference.full); + for (final message in messages) { + var mailEvt = MailLoadEvent(message, mailClient); + var content = mailEvt.message.decodeSubject(); + var mess = mailEvt.message.decodeTextPlainPart(); + Logger.log(LoggerType.info, Mailer, 'New message $content : $mess'); + Requests.sendAlert('*$content* $mess'); + } + } + }); + Logger.log(LoggerType.info, Mailer, 'Start polling mail for $email'); + await mailClient.startPolling(const Duration(seconds: 30)); + Logger.log(LoggerType.info, Mailer, 'Finish polling mail for $email'); + } on MailException catch (e) { + Logger.log(LoggerType.error, Mailer, 'High level API failed with $e'); + } + } +} diff --git a/lib/widgets/pages/home.dart b/lib/widgets/pages/home.dart index 719c9be..4b4ee8f 100644 --- a/lib/widgets/pages/home.dart +++ b/lib/widgets/pages/home.dart @@ -1,4 +1,5 @@ import 'package:desktopapp/classes/routes.dart'; +import 'package:desktopapp/utils/mailer.dart'; import 'package:desktopapp/utils/requests.dart'; import 'package:flutter/material.dart'; import 'package:shared_preferences/shared_preferences.dart'; @@ -44,6 +45,9 @@ class HomePage extends StatelessWidget { } }, child: const Text('Envoyer une alerte de test')), + TextButton( + onPressed: () => Mailer.mailExample(), + child: const Text('Test email')), ]); } diff --git a/pubspec.lock b/pubspec.lock index 4449ae5..4441071 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1,6 +1,20 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: + args: + dependency: transitive + description: + name: args + url: "https://pub.dartlang.org" + source: hosted + version: "2.3.0" + asn1lib: + dependency: transitive + description: + name: asn1lib + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.0" async: dependency: transitive description: @@ -8,6 +22,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.8.2" + basic_utils: + dependency: transitive + description: + name: basic_utils + url: "https://pub.dartlang.org" + source: hosted + version: "3.9.4" bloc: dependency: transitive description: @@ -50,6 +71,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.15.0" + convert: + dependency: transitive + description: + name: convert + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.1" + crypto: + dependency: transitive + description: + name: crypto + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.1" cupertino_icons: dependency: "direct main" description: @@ -64,6 +99,41 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "4.0.6" + encrypt: + dependency: transitive + description: + name: encrypt + url: "https://pub.dartlang.org" + source: hosted + version: "5.0.1" + enough_convert: + dependency: transitive + description: + name: enough_convert + url: "https://pub.dartlang.org" + source: hosted + version: "1.4.0" + enough_mail: + dependency: "direct main" + description: + name: enough_mail + url: "https://pub.dartlang.org" + source: hosted + version: "1.3.6" + enough_serialization: + dependency: transitive + description: + name: enough_serialization + url: "https://pub.dartlang.org" + source: hosted + version: "1.4.0" + event_bus: + dependency: transitive + description: + name: event_bus + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.0" fake_async: dependency: transitive description: @@ -121,6 +191,13 @@ packages: description: flutter source: sdk version: "0.0.0" + http: + dependency: transitive + description: + name: http + url: "https://pub.dartlang.org" + source: hosted + version: "0.13.4" http_parser: dependency: transitive description: @@ -128,6 +205,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "4.0.0" + intl: + dependency: transitive + description: + name: intl + url: "https://pub.dartlang.org" + source: hosted + version: "0.17.0" js: dependency: transitive description: @@ -135,6 +219,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.6.3" + json_annotation: + dependency: transitive + description: + name: json_annotation + url: "https://pub.dartlang.org" + source: hosted + version: "4.4.0" lints: dependency: transitive description: @@ -142,6 +233,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.1" + logging: + dependency: transitive + description: + name: logging + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.2" matcher: dependency: transitive description: @@ -198,6 +296,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.0.5" + pedantic: + dependency: transitive + description: + name: pedantic + url: "https://pub.dartlang.org" + source: hosted + version: "1.11.1" + petitparser: + dependency: transitive + description: + name: petitparser + url: "https://pub.dartlang.org" + source: hosted + version: "4.4.0" platform: dependency: transitive description: @@ -212,6 +324,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.1.2" + pointycastle: + dependency: transitive + description: + name: pointycastle + url: "https://pub.dartlang.org" + source: hosted + version: "3.5.2" process: dependency: transitive description: @@ -413,6 +532,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.2.0+1" + xml: + dependency: transitive + description: + name: xml + url: "https://pub.dartlang.org" + source: hosted + version: "5.3.1" sdks: dart: ">=2.16.2 <3.0.0" flutter: ">=2.10.0" diff --git a/pubspec.yaml b/pubspec.yaml index c0a4f9d..d8a4b82 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -39,6 +39,7 @@ dependencies: shared_preferences: ^2.0.13 flash: ^2.0.3+2 dio: ^4.0.6 + enough_mail: ^1.3.4 dev_dependencies: flutter_test: