enough_mail
IMAP, POP3 and SMTP for email developers. Choose between a low level and a high level API for mailing. Parse and generate MIME messages. Discover email settings.
2.1.7
18K downloads/mo
#2285 most downloaded on pub.dev
Enough-Software/enough_mail
What this package is like to depend on
Last release 1 years ago
19 Aug 2025
Ships unpredictably
gaps range from 8 days to 1.7 years
Most releases are documented
notes for 51 of 63 stable releases
Nothing withdrawn
no release was ever pulled
7 years old
63 releases · first in 2020
0 releases in the last 12 months
see the full history below
Release timeline
63 releases · Jan 2020 to Aug 2025Releases
latest 60 of 63-
2.1.719 Aug 2025Release notes
Open source →- chore: Update plugin and dependencies versions - thanks to Dr-Usman!
- chore: pub upgrade to bring in intl 0.20.2 - thanks to jpohhhh!
- Fix: FetchImapResult.replaceMatchingMessages - thanks to scribetw!
- Fix: trim lines read after decoding - thanks to vware!
- Fix: Remove extra double quotes for search query dates - thanks to ig-garcia!
-
2.1.608 Dec 2023Release notes
Open source →- Fix: Fix serialization of ServerConfig - thanks to RobinJespersen!
- Feat: allow to specify connection timeout in high level API and increase default timeout
-
2.1.519 Nov 2023 -
2.1.411 Nov 2023Release notes
Open source →- Fix: use refreshed OAUTH tokens when using the high level MailClient API.
- Fix: handle edge cases in IMAP
FETCHresponses. - Feat: Add details for low level IMAP errors when using the high level MailCLient API.
- Feat: Refresh OAUTH tokens 15 minutes in advance before they expire to reduce the risk of a token expiring during a long running operation.
- Feat: show error details when SMTP XOAuth2 authentication fails.
- Feat: synchronize access to low level clients when using the high level MailClient API.
-
2.1.316 Oct 2023Release notes
Open source →- Fix: Apply correct mailbox path separator - thanks nruzzu!
- Feat: add firstWhereOrNull search method for a Tree
- Feat: add identityFlag getter to Mailbox
-
2.1.205 Oct 2023Release notes
Open source →- Fix: RangeError when a Mailbox name contains a parentheses - thanks nruzzu
- Fix: base64 decoding of headers with a lowercase b
- Feat: support more name variations for ISO codecs
- Feat: update dependencies - thanks hatch01
- Feat: use standard serialization based on json_serializable
- Feat: Improve high level API fetch message support
-
2.1.112 Jun 2022Release notes
Open source →- Loosened dependency restrictions a bit upon suggestion from hpoul
- Added support for Big5, KOI8-r and KOI8-u character encodings
- Load encodings only when required
-
2.1.027 May 2022Release notes
Open source →- The
MailClient.deleteMessages()/undoDeleteMessages()as well as themoveMessages()andundoMoveMessages()calls
will now update the givenmessagesUIDs automatically, when they have been specified. - Simplify building a
multipart/alternativemessage or message part by adding the optionplainTextandhtmlTextparameters
inMessageBuilder.prepareMultipartAlternativeMessage()andaddMultipartAlternative(). - Fixed documentation for generating a mime message with an attachment (thanks lqmminh!).
- The
-
2.0.122 May 2022Release notes
Open source →- Thanks to yarsort resolved various POP3 bugs.
- Interpret mime messages with an (invalid) 2-digit year as coming from the current millennium.
-
2.0.009 May 2022Release notes
Open source →Improvements and fixes:
- Thanks to matthiasn the date parsing/generation on west of greenwich timezones now works properly.
- Improve automatic re-connecting when using the high-level MailClient API.
- Support timeouts for IMAP, SMTP and POP calls.
MimeMessage:- Get an alternative mime part easier with
MimePart? getAlternativePart(MediaSubtype subtype). - Retrieve all recipients via the
List<MailAddress> get recipientsgetter. - Support decoding
binarytransfer-encoding for text message parts. - Introduce
guid/ global unique IDs which are set automatically when using the high-levelMailClient. - Correctly unwrap header values before decoding them.
- Accept headers that have no space after the colon-separator.
- Get an alternative mime part easier with
- Improve high level API support for OAUTH:
- You can now define
refreshandonConfigChangedcallback methods when connecting to a mail service usingMailClient.
- You can now define
- Support expunging messages when deleting them in
MailClientwithFuture<DeleteResult> deleteMessages( MessageSequence sequence, {bool expunge = false}).
OauthAuthentication now contains a complete OauthToken.
main MessageBuilder: Access also text-attachments in theattachmentsgetter.- Only use
STARTTLSwhen the IMAP service supports it. - Simplify search API.
Breaking changes:
- Package structure is simplified, so that imports of specific classes are not possible anymore. Instead either
import 'package:enough_mail/enough_mail.dart';or one of the specializes sub-packagescodecs.dart,discover.dart,highlevel.dart,imap.dart,mime.dart,pop.dartorsmtp.dart. Authentication.passwordCleartextis renamed toAuthentication.passwordClearTextMailboxAPI has changed specifically when creating mailboxes yourself.
Other:
- Improved code style, enforcing linting rules.
- Improve API documentation.
- Improve package structure
- Many further small-scale improvements.
-
1.3.613 Jul 2021Nothing published for this version
-
1.3.513 Jul 2021Nothing published for this version
-
1.3.416 Jun 2021Nothing published for this version
-
1.3.313 Jun 2021Nothing published for this version
-
1.3.208 Jun 2021Nothing published for this version
-
1.3.103 Jun 2021Nothing published for this version
-
1.3.024 May 2021Nothing published for this version
-
1.2.215 Apr 2021Nothing published for this version
-
1.2.110 Apr 2021Nothing published for this version
-
1.2.009 Apr 2021Nothing published for this version
-
1.1.007 Apr 2021Nothing published for this version
-
1.0.021 Mar 2021Nothing published for this version
-
0.3.110 Mar 2021Release notes
Open source →- Fix for handling
PARTIALIMAP responses - thanks to A.Zulli - Fix for handling
FETCHIMAP responses that are spread across several response lines for a single message - #131
- Fix for handling
-
0.3.007 Mar 2021Release notes
Open source →- KevinBLT contributed the following improvements and features:
- Check out the experimental DKIM signing of messages.
- Enjoy the improved the performance of
QuotedPrintableencoding. - BCC header is now stripped from messages before sending them via SMTP
- A.Zulli contributed major IMAP features in this release:
- Sort messages with
ImapClient.sortMessages(...)SORT - and also use the extended sort mechanism with specifyingreturnOptionson servers with ESORT. ImapClient.searchMessages(...)now acceptsList<ReturnOption>parameter for extending the search according to the ESEARCH standard.- Support
PARTIALresponses according to the CONTEXT IMAP extension. - Use the LIST extensions:
- Sort messages with
- Alexander Sotnikov fixed
POP3so that you can now use thePopClientas intended. - SMTP improvements:
- You can now send messages via the SMTP
BDATcommand usingSmtpClient.sendChunkedMessage()/sendChunkedMessageData()/sendChunkedMessageText(). - You don't require a
MimeMessageto send any more when you send messages either viaSmtpClient.sendMessageData()orSmtpClient.sendMessageText().
- You can now send messages via the SMTP
- MessageBuilder / MIME generation improvements:
- Attachments are now also added when forrwarding a message without quoting in
MessageBuilder.prepareForwardMessage(). - You can now also prepend parts by setting
inserttotruewhen callingaddPart().
- Attachments are now also added when forrwarding a message without quoting in
- Other improvements and bugfixes:
- Remove some dependencies and relax constraints on some so that we all get quicker through the
null-safetychallenge. - Fixed decoding of 8bit messages that use a different charset than UTF8
- Fixed header decoding in some edge cases
- Some fixes in parsing personal names in email addresses
- Support Chinese encodings
GBKandGB-2312 - Improve reconnecting when using the high level API
- Only download the
ENVELOPEinformation when a new mail is detected in high level API
- Remove some dependencies and relax constraints on some so that we all get quicker through the
- Breaking changes:
MessageBuilder.replyToMessageis renamed toMessageBuilder.originalMessage
- KevinBLT contributed the following improvements and features:
-
0.2.104 Feb 2021Release notes
Open source →- Allow to specify
connectionTimeoutfor all low level clients - Support non-ASCII IMAP searches when supported by server
- Fix reconnection issue for
ImapClient - Fix decoding of sequentiell encoded words in edge cases
- Do a
noopwhen resumingMailClientwhen server does not supportIDLE
- Allow to specify
-
0.2.002 Feb 2021Release notes
Open source →- ImapClient now processes tasks sequentially, removing the dreaded
StreamSink is bound to a streamexception when accessing ImapClient from several threads. - Highlevel API for adding mail messages with
MailClient.appendMessage(...)/.appendMessageToFlag(...)andMailClient.saveDraftMessage(...) - Searching for messages is now easier than ever with
MailClient.search(MailSearch)andSearchQueryBuilder- #109 - Sent messages are now appended automatically when using the high level
MailClient.sentMessage(...)call unless setting theappendToSentparameter tofalse. - Create IMAP search criteria with
SearchQueryBuilderand conduct common searches withMailClient.search(MailSearch) - Fixed detection of audio media types
- Added
CRAM-MD5authentication support for SMTP - #108 - Added
XOAUTH2authentication support for SMTP - #107 - Create MessageSequence from list of mime messages with
MessageSequence.fromMessages(List<MimeMessage>) - You can now check with the highlevel API if you can send 8bit messages with
MailClient.supports8BitEncoding()and set the preferred encoding withMailClient.buildMimeMessageWithRecommendedTextEncoding(MessageBuilder). MessageBuildernow can recommend text encodings withMessageBuilder.setRecommendedTextEncoding(bool supports8Bit)and sets content types automatically depending on attachments.- Access attachment information easier using the
MessageBuilder.attachmentsfield and theAttachmentInfoclass. - You can send a
MessageBuilderinstance instead of aMimeMessagewithMailClient.sendMessageBuilder(...). - Breaking API changes:
SmtpClient.login()is deprecated, please use the better namedSmtpClient.authenticate()instead, e.g.:await smtpClient.authenticate(userName, password, AuthMechanism.login)BodyPart.idis renamed toBodyPart.cidto make the meaning clearer.
- ImapClient now processes tasks sequentially, removing the dreaded
-
0.1.011 Jan 2021Release notes
Open source →- Moving from response based to exceptions, compare the migration guide for details compare the migration guide in Readme.md and #101 for details - specicial thanks to Tienisto
- Improved performance when downloading large data significantly
- High Level API now checks for SMTP START TLS support before switching to a secure connection when connected via plan sockets
- Low level SMTP API now exposes all found server capabilities
- Fix decoding bug for UTF8 8 bit encoded text
ImapClient.search(...)now returns aMessageSequenceinstead just a list of integers- High level API now supports moving messages with
MailClient.moveMessages(...)andMailClient.undoMoveMessages()methods - High level API now supports deleting messages with
MailClient.deleteMessages(...)andMailClient.undoDeleteMessages()methods
-
0.0.3620 Dec 2020Release notes
Open source →- Remove spaces between two encoded words in headers
- High level API support for deleting messages and undoing it:
Future<MailResponse<DeleteResult>> deleteMessages(MessageSequence sequence, Mailbox trashMailbox)Future<MailResponse<DeleteResult>> deleteAllMessages(Mailbox mailbox,{bool expunge})
- Deleted messages are now preferably moved to
\Trashfolder, when possible. - Optionally mark a message as seen by setting
markAsSeenparameter totruewhen fetching messages or message contents using the high level API, e.g.MailClient.fetchMessageContents(message, markAsSeen: true);
-
0.0.3509 Dec 2020Release notes
Open source →- Ignoring malformed UT8 when logging thanks to Tienisto.
- Use
enough_convertpackage for previously missing character encodings. - Add
MimeMessage.parseFromText(String text)helper method. - Add Open PGP mime types like
MediaSubtype.applicationPgpSignatureto known media types.
-
0.0.3403 Dec 2020Release notes
Open source →- Fix handling of
VANISHED (EARLIER)responses in edge cases thanks to Andrea. - Find a mime message part by its content-ID with the
MimeMessage.getPartWithContentId(String cid)helper method. - List all parts of a mime message sequentially using the
MimeMessage.allPartsFlatgetter. - Fix problems with
UTF88-bit decoded answers. - Use the enough_serialization for JSON (de)serialization support.
- Improve discovery of mail settings.
- Allow to limit the download size of messages:
MailClient.fetchMessageContents(MimeMessage message, {int maxSize})fetches all parts apart from attachments when the message size is bigger than the one specified in bytes inmaxSize. - Improve documentation, also thanks to TheOneWithTheBraid.
- Fix handling of
-
0.0.3320 Sep 2020Release notes
Open source →- Support IMAP QUOTA Extension thanks to azulli.
- Throw exceptions that might occur while sending a message thanks to hpoul.
- Retrieve currently selected mailbox in highlevel API with
MailClient.selectedMailbox. - Specify
fetchPreferencein highlevel API when fetching messages, for example to only fetchENVELOPEs first. - Create a message builder based on a mailto link with
MessageBuilder.prepareMailtoBasedMessage(). - Mail events now contain the originating ImapClient, SmtpClient or MailClient instance to match the event when having several active accounts at the same time.
- Support the SMTP
AUTH LOGINauthentication by specying theauthMechanismparameter inSmtpClient.login(). - Ease flagging of messages with
MailClient.flagMessage(). - Highlevel API now udates flags of a message correctly when they have changed remotely.
-
0.0.3211 Aug 2020Release notes
Open source →- easier to retrieve and set common message flags such as
\Seen,\Answeredand$Forwarded - use
MimeMessage.isSeen,.isAnswered,.isForwardedto query the corresponding flags - use
MimeMessage.hasAttachments()orMimeMessage.hasAttachmentsOrInlineNonTextualParts()to determine if the message contains attachment parts. - Q-Encoding is used for encoding/decoding corresponding MIME message headers now, compare #77 for details
- easier to retrieve and set common message flags such as
-
0.0.3109 Aug 2020Release notes
Open source →- Mime: List all message parts with a specfic Content-Disposition with
MimeMessage.findContentInfo(ContenDisposition disposition). - Mime: Retrieve an individual message part with
MimeMessage.getPart(String fetchId) - Bugfix: fetch individual message parts via IMAP with
BODY[1.2]now works. - MailClient: Download individual message parts with
MailClient.fetchMessagePart(MimeMessage message, String fetchId). - MailClient: events now provide reference to used
MailClientinstance, so that apps can differentiate between accounts. - MessageBuilder: allow to specify user aliases and to handle + aliases and to differentiate between reply and reply-all in
MessageBuilder.prepareReplyToMessage() - ImapClient: Ensure that every Inbox has a
MailboxFlag.inbox.
- Mime: List all message parts with a specfic Content-Disposition with
-
0.0.3002 Aug 2020Release notes
Open source →- Thanks to hpoul the XML library now works with both beta and stable flutter channels.
- Thanks to hydeparkk encoded mailbox paths are now used in copy, move, status and append/
- Fix decoding bug for UTF8 8 bit encoded text
- Fix handling mailboxes with a space in their path
- Allow to easly serialize and deserialize MailAccount to/from JSON.
- Extended high level MailClient API:
- Allow to select mailbox by path
- Disconnect to close connections
- Include fetching message flags when fetching messages
- Allow to store message flags, e.g. mark as read
- Provide access to low level API from within the high level API
-
0.0.2904 Jul 2020Release notes
Open source →- Add
discconect()method to high levelMailClientAPI - Encode and decode mailbox names using Modified UTF7 encoding
- Add IMAP support for UTF-8
- Add
-
0.0.2821 Jun 2020 -
0.0.2718 Jun 2020Release notes
Open source →- Downgraded crypto dependency to be compatible with flutter_test ons stable flutter channel again
-
0.0.2616 Jun 2020Release notes
Open source →- Added high level
MailClientAPI - Downgraded XML dependency to be compatible with flutter_test again
- Fixed
ImapClient'seventBusregistration when this is specified outside of ImapClient.
- Added high level
-
0.0.2510 Jun 2020 -
0.0.2407 Jun 2020Release notes
Open source →- Improve parsing of IMAP
BODYSTRUCTUREresponses to FETCH commands. - Add message media types.
- Improve parsing of IMAP
-
0.0.2302 Jun 2020 -
0.0.2231 May 2020Release notes
Open source →- Breaking API change: use FETCH IMAP methods now return
FetchImapResultinstead ofList<MimeMessage> - Breaking API change:
ImapFetchEventnow contains a fullMimeMessageinstead of just the sequence ID and flags - Added
ImapVanishedEventthat is called instead ofImapExpungeEventwhen QRESYNC has been enabled - Added support for QRESYNC extension
- Added support for ENABLE extension
- Fix handling STATUS responses (issue #56)
- Breaking API change: use FETCH IMAP methods now return
-
0.0.2121 May 2020 -
0.0.2021 May 2020Release notes
Open source →- Breaking change: use
MessageSequencefor defining message ID or UID ranges instead of integer-based IDs
- Breaking change: use
-
0.0.1914 May 2020Release notes
Open source →- Fix for fetching recent messages when the chunksize is larger than the existing messages - thanks to studiozocaro!
-
0.0.1812 May 2020Release notes
Open source →- Breaking API changes:
MimeMessage.bodyAPI, get and set text/plain and text/html parts in MimeMessage - Support nested BODY and BODYSTRUCTURE responeses when fetching message data
- Support CONDSTORE IMAP extension
- Support MOVE IMAP extension
- Support UIDPLUS IMAP extension
- Breaking API changes:
-
0.0.1707 May 2020Release notes
Open source →- Supports parsing BODYSTRUCTURE responses when fetching message data
- Also eased API for accessing BODY and BODYSTRUCTURE response data
-
0.0.1604 May 2020Release notes
Open source →- Adding 'name' parameter with quotes to 'Content-Type' header when adding a file
-
0.0.1504 May 2020 -
0.0.1403 May 2020Release notes
Open source →- Save messages to the server with
ImapClient.appendMessage(). - Store message flags using the
ImapClient.store()method or use one of the mark-methods likemarkFlagged()ormarkSeen(). - Copy message(s) using
ImapClient.copy(). - Copy, fetch, store or search message with UIDs using
ImapClient.uidCopy(),uidStore(), etc. - Remove messages marked with the \Deleted flag using
ImapClient.expunge() - Authenticate via OAUTH 2.0 using
ImapClient.authenticateWithOAuth2()(AUTH=XOAUTH2) orauthenticateWithOAuthBearer()(AUTH=OAUTHBEARER). - You can now switch to TLS using
ImapClient.startTls(). - Query the capabilities using the
ImapClient.capability()call. - Let the server do some housekeeping using the
ImapClient.check()method.
- Save messages to the server with
-
0.0.1329 Apr 2020Release notes
Open source →- Forward complex messages with
MessageBuilder.prepareForwardMessage(), too (issue #24)
- Forward complex messages with
-
0.0.1226 Apr 2020 -
0.0.1123 Apr 2020Release notes
Open source →- Adding simple reply generation with
MessageBuilder.prepareReplyToMessage()(issue #25) - Improvement for adding larger files (issue #28)
- Adding simple reply generation with
-
0.0.1015 Apr 2020 -
0.0.912 Apr 2020Release notes
Open source →- Introducing MessageBuilder for easy mime message creation
- Adapted example
-
0.0.828 Mar 2020 -
0.0.728 Mar 2020Release notes
Open source →- Parse MIME messages using MimeMessage.parse()
- Handle content encodings more reliably
-
0.0.603 Mar 2020Release notes
Open source →- Supporting ASCII character character encodings and padding BASE64 headers if required
-
0.0.510 Feb 2020 -
0.0.409 Feb 2020