- Fix: Fix serialization of ServerConfig - thanks to RobinJespersen!
- Feat: allow to specify connection timeout in high level API and increase default timeout
- Fix: Ensure compatibility with Flutter 3.16 - thanks to Tzanou123!
- Fix: use refreshed OAUTH tokens when using the high level MailClient API.
- Fix: handle edge cases in IMAP
FETCH
responses. - 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.
- Fix: Apply correct mailbox path separator - thanks nruzzu!
- Feat: add firstWhereOrNull search method for a Tree
- Feat: add identityFlag getter to Mailbox
- 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
- 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
- The
MailClient.deleteMessages()
/undoDeleteMessages()
as well as themoveMessages()
andundoMoveMessages()
calls will now update the givenmessages
UIDs automatically, when they have been specified. - Simplify building a
multipart/alternative
message or message part by adding the optionplainText
andhtmlText
parameters inMessageBuilder.prepareMultipartAlternativeMessage()
andaddMultipartAlternative()
. - Fixed documentation for generating a mime message with an attachment (thanks lqmminh!).
- Thanks to yarsort resolved various POP3 bugs.
- Interpret mime messages with an (invalid) 2-digit year as coming from the current millennium.
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 recipients
getter. - Support decoding
binary
transfer-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
refresh
andonConfigChanged
callback methods when connecting to a mail service usingMailClient
.
- You can now define
- Support expunging messages when deleting them in
MailClient
withFuture<DeleteResult> deleteMessages( MessageSequence sequence, {bool expunge = false})
. OauthAuthentication now contains a complete OauthToken. main MessageBuilder
: Access also text-attachments in theattachments
getter.- Only use
STARTTLS
when 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.dart
orsmtp.dart
. Authentication.passwordCleartext
is renamed toAuthentication.passwordClearText
Mailbox
API 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.
- Fix generating messages with several recipients in
MessageBuilder
. Previously semicolons were used that were not accepted by all mail providers.
- Add
bool Function(X509Certificate)? onBadCertificate
callback to handle invalid certificates #167 - Stop polling when disconnecting high level
MailClient
- Ignore subsequent
IDLE
requests when already in idle mode inImapClient
- Improve documentation
- Fix some IMAP mailbox commands when there is no mailbox selected: #160 #164 #165
- Add easier method to setup a
MailAccount
with manual settings by callingMailAccount.fromManualSettings()
orMailAccount.fromManualSettingsWithAuth()
. This is useful when settings cannot or should not be auto-discovered, for example.
- Fix login for IMAP servers that do not define capabilities in their
AUTH
/LOGIN
response #159
- Always quote user name and password in IMAP login, #158
- Thanks to fttx2020 we have these great improvements:
- Fix for POP3 UID LIST command
- Fix parsing of POP3 responses
- Handle more Chinese character encodings
- Handle some base64 text variations better
SmtpException
s now contain the full error description
- Support read receipts #149
- Check if a message contains a read receipt request with
MimeMessage.isReadReceiptRequested
- Generate a read request response with
MessageBuilder.buildReadReceipt()
- Check if a message contains a read receipt request with
- Support Windows-1256 encoding
- Add another message as an attachment with
MessageBuilder.addMessagePart()
#153 - Easily retrieve all leaf parts after loading
BODYSTRUCTURE
withMimeMessage.body.allLeafParts
- Fix for responses with a line break spread around 2 chunks #140
- Improve identification of message parts with their
fetchId
#141 #143 - Thanks to A.Zulli again! - Messages are now send with
utf-8
rather thanutf8
to reduce problems #144 - Thanks to gmalakov - Fix for responses with a literal
{0}
response #145 - Better detection of plain text messages thanks to castaway
- Assume
8bit
encoding when nocontent-transfer-encoding
is specified in a MIME message. - Exclude empty address-lists when building a message with
MessageBuilder
. - Retrieve a MIME part wit the fetchId
1
correctly. ImapClient.idleStart()
throws an error when no mailbox is selected.MailClient.fetchMessageContents()
allows you to specify which media types you want to include with theincludedInlineTypes
parameter, e.g.final mime = await mailClient.fetchMessageContents(envelopeMime, includedInlineTypes: [MediaToptype.image]);
.- Convenience improvements:
- Select a mailbox just by it's flag like
MailboxFlag.sent
withMailClient.selectMailboxByFlag(MailboxFlag)
method. - Check if an email address contains a personal name with
MailAddress.hasPersonalName
getter.
- Select a mailbox just by it's flag like
- Handle raw data in parameter values of IMAP
FETCH
responses.
- Thanks to KevinBLT mime messages will now always have a valid date header.
- The high level search API has been extended and access simplified
- The high level thread API has been simplified
- Thanks to A.Zulli the
UNSELECT
IMAP command of rfc3691 is now supported withImapClient.unselectMailbox()
. - Support THREAD IMAP Extension with
ImapClient.threadMessages()
anduidThreadMessage()
as well as the high level APIMailClient.fetchThreads()
andfetchThreadData()
, the latter can set theMimeMessage.threadSequence
automatically. #44 - Access embedded
message/rfc822
messages usingmimePart.decodeContentMessage()
. #138 - Added
SearchQueryType.toOrFrom
to easily search for recipients or senders of a message. - All Mailbox commands now return the mailbox in question, not the currently selected mailbox.
- Improve automatic reconnects in high level
MailClient
API. - Added high level OAuth login option and
MailAccount.fromDiscoveredSettingsWithAuth()
for easy setup. #137 - Appending a message will now return the new UID of that message.
- Continue editing a draft easily by calling
MessageBuilder prepareFromDraft(MimeMessage draft)
. - You now easier load the next page of of search using
MailClient.searchMessagesNextPage(MailSearchResult)
. - Improve null-safety.
- Breaking API changes:
- To align with Dart APIs,
MessageSequence.isEmpty
andisNotEmpty
are now getters and not methods anymore. So instead ofif (sequence.isEmpty())
please now useif (sequence.isEmpty)
, etc. - Date headers are always decoded to local time. Instead of
mimeMessage.decodeDate().toLocal()
now just callmimeMessage.decodeDate()
. - High level API
MailSearchResult
has been refactored to usePagedMessageSequence
.
- To align with Dart APIs,
enough_mail
is now null safe #127- Support
zulu
timezone in date decoding #132 - When the
MailClient
loses a connection or reconnects, it will now fire correspondingMailConnectionLost
andMailConnectionReEstablished
events. - When the
MailClient
reconnects, it will fetch new messages automatically and notify about them usingMailLoadEvent
. - Breaking changes to
v0.3
:MessageBuilder.encoding
is renamed toMessageBuilder.transferEncoding
and theenum
previously calledMessageEncoding
is now calledTransferEncoding
. All optional parameters previously calledencoding
are now also namedtransferEncoding
.MetaDataEntry.entry
has been renamed toMetaDataEntry.name
.ImapClient.setQuota()
andgetQuota()
methods use named parameters.- Due to null safety, a lots of functions that previously (wrongly) accepted
null
parameters do not acceptnull
as input anymore. - Some fields changed to
final
to ensure consistency.
- Fix for handling
PARTIAL
IMAP responses - thanks to A.Zulli - Fix for handling
FETCH
IMAP responses that are spread across several response lines for a single message - #131
- KevinBLT contributed the following improvements and features:
- Check out the experimental DKIM signing of messages.
- Enjoy the improved the performance of
QuotedPrintable
encoding. - 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 specifyingreturnOptions
on servers with ESORT. ImapClient.searchMessages(...)
now acceptsList<ReturnOption>
parameter for extending the search according to the ESEARCH standard.- Support
PARTIAL
responses according to the CONTEXT IMAP extension. - Use the LIST extensions:
- Sort messages with
- Alexander Sotnikov fixed
POP3
so that you can now use thePopClient
as intended. - SMTP improvements:
- You can now send messages via the SMTP
BDAT
command usingSmtpClient.sendChunkedMessage()
/sendChunkedMessageData()
/sendChunkedMessageText()
. - You don't require a
MimeMessage
to 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
insert
totrue
when 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-safety
challenge. - 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
GBK
andGB-2312
- Improve reconnecting when using the high level API
- Only download the
ENVELOPE
information 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.replyToMessage
is renamed toMessageBuilder.originalMessage
- Allow to specify
connectionTimeout
for 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
noop
when resumingMailClient
when server does not supportIDLE
- ImapClient now processes tasks sequentially, removing the dreaded
StreamSink is bound to a stream
exception 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 theappendToSent
parameter tofalse
. - Create IMAP search criteria with
SearchQueryBuilder
and conduct common searches withMailClient.search(MailSearch)
- Fixed detection of audio media types
- Added
CRAM-MD5
authentication support for SMTP - #108 - Added
XOAUTH2
authentication 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)
. MessageBuilder
now can recommend text encodings withMessageBuilder.setRecommendedTextEncoding(bool supports8Bit)
and sets content types automatically depending on attachments.- Access attachment information easier using the
MessageBuilder.attachments
field and theAttachmentInfo
class. - You can send a
MessageBuilder
instance instead of aMimeMessage
withMailClient.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.id
is renamed toBodyPart.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 - 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 aMessageSequence
instead 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
- 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
\Trash
folder, when possible. - Optionally mark a message as seen by setting
markAsSeen
parameter totrue
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.
- Use
enough_convert
package for previously missing character encodings. - Add
MimeMessage.parseFromText(String text)
helper method. - Add Open PGP mime types like
MediaSubtype.applicationPgpSignature
to known media types.
- 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.allPartsFlat
getter. - Fix problems with
UTF8
8-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.
- 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
fetchPreference
in highlevel API when fetching messages, for example to only fetchENVELOPE
s 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 LOGIN
authentication by specying theauthMechanism
parameter inSmtpClient.login()
. - Ease flagging of messages with
MailClient.flagMessage()
. - Highlevel API now udates flags of a message correctly when they have changed remotely.
- easier to retrieve and set common message flags such as
\Seen
,\Answered
and$Forwarded
- use
MimeMessage.isSeen
,.isAnswered
,.isForwarded
to 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
- 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
MailClient
instance, 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
.
- 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 message date headers
- 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
- Add
discconect()
method to high levelMailClient
API - Encode and decode mailbox names using Modified UTF7 encoding
- Add IMAP support for UTF-8
- High level
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 - Downgraded XML dependency to be compatible with flutter_test again
- Fixed
ImapClient
'seventBus
registration when this is specified outside of ImapClient.
- Add support to discover email settings using the
Discover
class.
- Improve parsing of IMAP
BODYSTRUCTURE
responses to FETCH commands. - Add message media types.
- Provide POP3 support
- Breaking API change: use FETCH IMAP methods now return
FetchImapResult
instead ofList<MimeMessage>
- Breaking API change:
ImapFetchEvent
now contains a fullMimeMessage
instead of just the sequence ID and flags - Added
ImapVanishedEvent
that is called instead ofImapExpungeEvent
when QRESYNC has been enabled - Added support for QRESYNC extension
- Added support for ENABLE extension
- Fix handling STATUS responses (issue #56)
- Added 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
- Fix 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 - Support nested BODY and BODYSTRUCTURE responeses when fetching message data
- Support CONDSTORE IMAP extension
- Support MOVE IMAP extension
- Support UIDPLUS IMAP extension
- Supports parsing BODYSTRUCTURE responses when fetching message data
- Also eased API for accessing BODY and BODYSTRUCTURE response 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()
. - 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.
- Forward complex messages with
MessageBuilder.prepareForwardMessage()
, too (issue #24)
- Forward messages with
MessageBuilder.prepareForwardMessage()
- Adding simple reply generation with
MessageBuilder.prepareReplyToMessage()
(issue #25) - Improvement for adding larger files (issue #28)
- Fix for message sending via SMTP (issue #27)
- Introducing MessageBuilder for easy mime message creation
- Adapted example
- Ease access to text contents of a mime message
- Adapted example
- Parse MIME messages using MimeMessage.parse()
- Handle content encodings more reliably
- Supporting ASCII character character encodings and padding BASE64 headers if required
- Addressed health and syntax recommendations
- Support IMAP METADATA Extension
- Always end lines with
\r\n
when communicating either with SMTP or IMAP server, parse iso-8859-1 encoded headers
- Cleaning architecture, adding support for
BODY[HEADER.FIELDS]
messages
- Initial alpha version