NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
pub.dev · #2266 most downloaded on pub.dev
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.
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 48 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
7 years old
63 releases · first in 2020
chore: Update plugin and dependencies versions - thanks to Dr-Usman !
Fix: Fix serialization of ServerConfig - thanks to RobinJespersen !
One column per quarter.
Fix: Ensure compatibility with Flutter 3.16 - thanks to Tzanou123 !
Fix: use refreshed OAUTH tokens when using the high level MailClient API.
FETCH responses.Fix: Apply correct mailbox path separator - thanks nruzzu !
Fix: RangeError when a Mailbox name contains a parentheses - thanks nruzzu
Loosened dependency restrictions a bit upon suggestion from hpoul
The MailClient.deleteMessages() / undoDeleteMessages() as well as the moveMessages() and undoMoveMessages() calls will now update the given messages U
MailClient.deleteMessages() / undoDeleteMessages() as well as the moveMessages() and undoMoveMessages() callsmessages UIDs automatically, when they have been specified.multipart/alternative message or message part by adding the option plainText and htmlText parametersMessageBuilder.prepareMultipartAlternativeMessage() and addMultipartAlternative().Thanks to yarsort resolved various POP3 bugs.
Thanks to matthiasn the date parsing/generation on west of greenwich timezones now works properly.
Improvements and fixes:
MimeMessage:
MimePart? getAlternativePart(MediaSubtype subtype).List<MailAddress> get recipients getter.binary transfer-encoding for text message parts.guid / global unique IDs which are set automatically when using the high-level MailClient.refresh and onConfigChanged callback methods when connecting to a mail service using MailClient.MailClient with Future<DeleteResult> deleteMessages( MessageSequence sequence, {bool expunge = false}).MessageBuilder: Access also text-attachments in the attachments getter.STARTTLS when the IMAP service supports it.Breaking changes:
import 'package:enough_mail/enough_mail.dart'; or one of the specializes sub-packages codecs.dart,discover.dart, highlevel.dart, imap.dart, mime.dart, pop.dart or smtp.dart.Authentication.passwordCleartext is renamed to Authentication.passwordClearTextMailbox API has changed specifically when creating mailboxes yourself.Other:
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Fix for handling PARTIAL IMAP responses - thanks to A.Zulli
PARTIAL IMAP responses - thanks to A.ZulliFETCH IMAP responses that are spread across several response lines for a single message - #131KevinBLT contributed the following improvements and features:
QuotedPrintable encoding.ImapClient.sortMessages(...) SORT - and also use the extended sort mechanism with specifying returnOptions on servers with ESORT.ImapClient.searchMessages(...) now accepts List<ReturnOption> parameter for extending the search according to the ESEARCH standard.PARTIAL responses according to the CONTEXT IMAP extension.POP3 so that you can now use the PopClient as intended.BDAT command using SmtpClient.sendChunkedMessage() / sendChunkedMessageData() / sendChunkedMessageText().MimeMessage to send any more when you send messages either via SmtpClient.sendMessageData() or SmtpClient.sendMessageText().MessageBuilder.prepareForwardMessage().insert to true when calling addPart().null-safety challenge.GBK and GB-2312ENVELOPE information when a new mail is detected in high level APIMessageBuilder.replyToMessage is renamed to MessageBuilder.originalMessageAllow to specify connectionTimeout for all low level clients
connectionTimeout for all low level clientsImapClientnoop when resuming MailClient when server does not support IDLESmtpClient.login() is deprecated, please use the better named SmtpClient.authenticate() instead, e.g.: await smtpClient.authenticate(userName, passwor…
StreamSink is bound to a stream exception when accessing ImapClient from several threads.MailClient.appendMessage(...) / .appendMessageToFlag(...) and MailClient.saveDraftMessage(...)MailClient.search(MailSearch) and SearchQueryBuilder- #109MailClient.sentMessage(...) call unless setting the appendToSent parameter to false.SearchQueryBuilder and conduct common searches with MailClient.search(MailSearch)CRAM-MD5 authentication support for SMTP - #108XOAUTH2 authentication support for SMTP - #107MessageSequence.fromMessages(List<MimeMessage>)MailClient.supports8BitEncoding() and set the preferred encoding with MailClient.buildMimeMessageWithRecommendedTextEncoding(MessageBuilder).MessageBuilder now can recommend text encodings with MessageBuilder.setRecommendedTextEncoding(bool supports8Bit) and sets content types automatically depending on attachments.MessageBuilder.attachments field and the AttachmentInfo class.MessageBuilder instance instead of a MimeMessage with MailClient.sendMessageBuilder(...).SmtpClient.login() is deprecated, please use the better named SmtpClient.authenticate() instead, e.g.:
await smtpClient.authenticate(userName, password, AuthMechanism.login)BodyPart.id is renamed to BodyPart.cid to make the meaning clearer.Moving from response based to exceptions, compare the migration guide for details compare the migration guide in Readme.md and #101 for details - spec
ImapClient.search(...) now returns a MessageSequence instead just a list of integersMailClient.moveMessages(...) and MailClient.undoMoveMessages() methodsMailClient.deleteMessages(...) and MailClient.undoDeleteMessages() methodsRemove spaces between two encoded words in headers
Future<MailResponse<DeleteResult>> deleteMessages(
MessageSequence sequence, Mailbox trashMailbox)Future<MailResponse<DeleteResult>> deleteAllMessages(Mailbox mailbox,
{bool expunge})\Trash folder, when possible.markAsSeen parameter to true when fetching messages or message contents
using the high level API, e.g. MailClient.fetchMessageContents(message, markAsSeen: true);Ignoring malformed UT8 when logging thanks to Tienisto.
enough_convert package for previously missing character encodings. MimeMessage.parseFromText(String text) helper method.MediaSubtype.applicationPgpSignature to known media types.Fix handling of VANISHED (EARLIER) responses in edge cases thanks to Andrea.
VANISHED (EARLIER) responses in edge cases thanks to Andrea.MimeMessage.getPartWithContentId(String cid) helper method.MimeMessage.allPartsFlat getter.UTF8 8-bit decoded answers.MailClient.fetchMessageContents(MimeMessage message, {int maxSize}) fetches all parts apart from attachments when the message size is bigger than the one specified in bytes in maxSize.Support IMAP QUOTA Extension thanks to azulli.
MailClient.selectedMailbox.fetchPreference in highlevel API when fetching messages, for example to only fetch ENVELOPEs first.MessageBuilder.prepareMailtoBasedMessage().AUTH LOGIN authentication by specying the authMechanism parameter in SmtpClient.login().MailClient.flagMessage().easier to retrieve and set common message flags such as \Seen, \Answered and $Forwarded
\Seen, \Answered and $ForwardedMimeMessage.isSeen, .isAnswered, .isForwarded to query the corresponding flagsMimeMessage.hasAttachments() or MimeMessage.hasAttachmentsOrInlineNonTextualParts() to determine if the message contains attachment parts.Mime: List all message parts with a specfic Content-Disposition with MimeMessage.findContentInfo(ContenDisposition disposition).
MimeMessage.findContentInfo(ContenDisposition disposition).MimeMessage.getPart(String fetchId)BODY[1.2] now works.MailClient.fetchMessagePart(MimeMessage message, String fetchId).MailClient instance, so that apps can differentiate between accounts.MessageBuilder.prepareReplyToMessage()MailboxFlag.inbox.Thanks to hpoul the XML library now works with both beta and stable flutter channels.
Add discconect() method to high level MailClient API
discconect() method to high level MailClient APIHigh level MailClient API supports IMAP IDLE, POP and SMTP.
MailClient API supports IMAP IDLE, POP and SMTP.Downgraded crypto dependency to be compatible with flutter_test ons stable flutter channel again
Added high level MailClient API
MailClient APIImapClient's eventBus registration when this is specified outside of ImapClient.Add support to discover email settings using the Discover class.
Discover class.Improve parsing of IMAP BODYSTRUCTURE responses to FETCH commands.
BODYSTRUCTURE responses to FETCH commands.- Provide POP3 support
Breaking API change: use FETCH IMAP methods now return FetchImapResult instead of List
FetchImapResult instead of List<MimeMessage>ImapFetchEvent now contains a full MimeMessage instead of just the sequence ID and flagsImapVanishedEvent that is called instead of ImapExpungeEvent when QRESYNC has been enabledAdded support for ISO 8859-15 / latin9 encoding - based on UTF-8
Breaking change: use MessageSequence for defining message ID or UID ranges instead of integer-based IDs
MessageSequence for defining message ID or UID ranges instead of integer-based IDsFix for fetching recent messages when the chunksize is larger than the existing messages - thanks to studiozocaro!
Breaking API changes: MimeMessage.body API, get and set text/plain and text/html parts in MimeMessage
MimeMessage.body API, get and set text/plain and text/html parts in MimeMessageSupports parsing BODYSTRUCTURE responses when fetching message data
Adding 'name' parameter with quotes to 'Content-Type' header when adding a file
Adding 'name' parameter to 'Content-Type' header when adding a file
Save messages to the server with ImapClient.appendMessage().
ImapClient.appendMessage().ImapClient.store() method or use one of the mark-methods like markFlagged() or markSeen().ImapClient.copy().ImapClient.uidCopy(), uidStore(), etc.ImapClient.expunge()ImapClient.authenticateWithOAuth2() (AUTH=XOAUTH2) or authenticateWithOAuthBearer() (AUTH=OAUTHBEARER).ImapClient.startTls().ImapClient.capability() call.ImapClient.check() method.Forward complex messages with MessageBuilder.prepareForwardMessage(), too (issue #24)
MessageBuilder.prepareForwardMessage(), too (issue #24)Forward messages with MessageBuilder.prepareForwardMessage()
MessageBuilder.prepareForwardMessage()Adding simple reply generation with MessageBuilder.prepareReplyToMessage() (issue #25)
MessageBuilder.prepareReplyToMessage() (issue #25)Fix for message sending via SMTP (issue #27)
Introducing MessageBuilder for easy mime message creation
Ease access to text contents of a mime message
Parse MIME messages using MimeMessage.parse()
Supporting ASCII character character encodings and padding BASE64 headers if required
Addressed health and syntax recommendations
Support IMAP METADATA Extension
Your coding agent can read these notes before it upgrades. Set up the MCP server →