- When initializing character encodings for netstandard and net50/net60, wrap the Reflection logic to invoke System.Text.Encoding.RegisterProvider() in a try/catch to prevents exceptions when using the netstandard version of MimeKit in a .NET Framework app. (issue #751)
- Added a work-around for Office365
message/delivery-status
parts where all status groups after the first are base64 encoded. This seems to be a bug in Office365 where it treats the first status group as MIME entity and the following status groups as the content. (issue #250) - Fixed the MimeMessage .ctor that takes object parameters to first check that a Message-Id header was not supplied before generating one for the message. (issue #747)
- Fixed the BestEncodingFilter logic such that if any line in binary content is > 998 and it contains nul bytes, it should recommend base64 (not quoted-printable).
- Always use a lowercase domain name in the Message-Id to work around bugs in eM Client. (issue #734)
- Improved handling of parsing Content-Types like "multipart/multipart/mixed; boundary=...". (issue #737)
- Added a maxLineLength argument to the QuotedPrintableEncoder .ctor.
- Added maxLineLength arguments to EncoderFilter.Create() methods.
- Fixed MimePart.Prepare() to remember the maxLineLength argument value for later use in the WriteTo() implementation. This maxLineLength value can then be passed to the Base64 or QuotedPrintable encoder so that it can properly limit lines to that length (up to a max of 76 characters as per the specs). (issue #743)
- Added net6.0 to the list of TargetFrameworks.
- Removed APIs marked as [Obsolete] in 2.x.
- Refactored X509CertificateDatabase protected methods to include a DbConnection parameter.
- Removed OpenPgpContextBase by folding the logic into OpenPgpContext.
- Added Async APIs for OpenPGP and S/MIME.
- Lazy-load headers on MimeMessage and MimeEntity (and subclasses) to improve performance.
- Added a new MimeReader class that acts as a lower-level MimeParser alternative, allowing developers to parse MIME content without having to instantiate a MIME tree of objects or wait until the parser has completed (and returned a MimeMessage or MimeEntity object) before processing MIME data. This is conceptually similar to a SAX XML parser approach.
- Added a new ExperimentalMimeParser that duplicates MimeParser functionality, but is built on top of MimeReader. This implementation will eventually replace MimeParser once I get some feedback on it. Should be ~5% faster than MimeParser.
- Improved MimeParser performance slightly based on some of the experimentation done to make the ExperimentalMimeParser fast.
- Added CancellationToken arguments for some AttachmentCollection.Add() overloads.
- Use 'net5.0' as the .NET 5.0 target framework moniker instead of 'net50'. (issue #720)
- Drop support for .NET 4.5 and replace it with .NET 4.5.2
- Bumped Portable.BouncyCastle to 1.9.0
- Added new MimeMessage.GetRecipients() method.
- Make it possible to bypass MimeEntity preparation for signing by adding a PrepareBeforeSigning property to CryptographyContext. (issue #721)
- MimeMessage and MimeEntity now implement IDisposable. (issue #732)
- Improved MimeParser to be a little more efficient based on work being done for the upcoming v3.0 release.
- Fixed a bug in the MimeParser exposed by added unit tests regarding Content-Length handling.
- Improved address parser error messages.
- Fixed MailboxAddress.Address to be forgiving if there is trailing whitespace after the addr-spec token when setting MailboxAddress.Address. (issue #705)
- Fixed MimeMessage and MimeEntity.ToString() to not write a newline before the message/entity (regression introduced in 2.14.0).
- Use DebugType=full for .NET Framework v4.x. (MailKit issue #1239)
- Fixed bug in MultipartSigned.VerifyAsync() that would dispose of the crypto context before the async task was complete, resulting in an OperationCanceledException.
- Default to using the Environment.SpecialFolder.UserProfile directory instead of Personal when GNUPGHOME isn't defined in the environment. The Personal directory maps to the MyDocuments directory, so this wasn't correct. The .gnupg directory should be in the user's HOME directory.
- Added ContentType.ToString(bool encode) and ContentDisposition.ToString(bool encode) convenience methods.
- Changed the public Header.Parse/TryParse APIs to canonicalize header values to end with a newline even if the input string does not. (issue #695)
- Allow ..'s and trailing .'s in the local-part of an addr-spec by introducing a new RfcComplianceMode.Looser enum value that can be set on the ParserOptions.AddressParserComplianceMode property. (issue #682)
- Use Reflection to call Encoding.RegisterProvider() so that referencing the netstandard MimeKit assemblies from .NET 4.8 won't crash. (issue #683)
- Don't write the X-MimeKit warning header in ToString() anymore. This is a lost cause.
- Updated the OpenPgpContext to default to keys.openpgp.org since keys.gnupg.net does not resolve via DNS anymore.
- Added a way to force MimeKit to always quote parameter values. (issue #674)
- Fixed PGP/MIME signatures to use the proper BEGIN/END PGP SIGNATURE markers instead of BEGIN/END PGP MESSAGE markers by avoiding compressing the PGP signature packet. (issue #681)
- Fixed S/MIME support using WindowsSecureMimeContext with MimeKit's CmsSigner classes which was causing a PlatformNotSupportedException. (issue #664)
- When extracting HTML from TNEF, try to use the charset delcared in the HTML's meta tags. (issue #667)
- Added AttachmentCollection.AddAsync() methods. (issue #670)
- Enable SqliteCertificateDatabase initialization logic for .NET v5.0. (issue #673)
- Fixed DSA key conversion logic to work more reliably.
- Catch exceptions from IPGlobalProperties.GetIPGlobalProperties() and fall back to localhost. (issue #630)
- Fixed base64 encoder to only flush with a newline if it is midline. (issue #646)
- Added .NET 5 build targets and include in the nuget packages.
- Added a new GnuPGContext .ctor that allows specifying a custom path.
- Bumped Portable.BouncyCastle dependency to 1.8.10.
- Improved HtmlWriter ArgumentException messages.
- Treat message/disposition-notification and message/delivery-status the same as text/* when preparing for signing. (issue #626)
- Always set Content-Disposition: inline for BodyBuilder.LinkedResources. This fixes a regression introduced in 2.10.0. (issue #627)
- Fixed NuGet package references to System.Data.DataSetExtensions for netstandard2.1 and net4x.
- Added SQL Server support. (issue #619)
- Fixed a leak in SqlCertificateDatabase when creating the certificates database.
- Bumped BouncyCastle dependency to v1.8.8. (issue #610)
- Exposed some ArcVerifier and DkimVerifier internal methods. (issue #601)
- Improved MimeParser performance.
- Fixed potential leaks in MimeParser when loading MimePart content in exception cases.
- Made use of ArrayPools for various buffers which may help performance. (issue #616)
- Fixed MimeUtils.GenerateMessageId() to encode international domain names.
- Fixed MimeUtils.GenerateMessageId() to cache the local hostname. (issue #612)
- Modified AttachmentCollection to use a custom implementation of Path.GetFileName() that allows illegal path characters.
- Only generate a ContentId for the MultipartRelated Root if it is not the first part.
- Include WindowsSecureMimeContext in the .NET Standard 2.x build. (issue #600)
- Fixed message.Prepare() to never choose the quoted-printable encoding for non-text based MimeParts. (issue #598)
- Added work-around for mailers that don't use a ';' between Content-Type and Content-Disposition parameters. (issue #595)
- Added improved error reporting for ArcVerifier. (issue #591)
- Added another work-around for parsing Authentication-Results headers. (issue #590)
- MimeMessage.ToString() now adds an X-MimeKit-Warning header to the beginning of the output string to make it clear to developers doing this that they are Doing it Wrong(tm).
- Added a TLS-Required HeaderId enum value.
- Refactored OpenPgpContext to separate out key storage implementation. (issue #576)
- Fixed the TextToFlowed converter. (issue #580)
- Protect against ABRs in AuthenticationResults.TryParse(). (issue #581)
- The net45 version of MimeKit now depends on Portable.BouncyCastle instead of official BouncyCastle.
- Added MimeParser events to report stream offsets for MimeMessages and MimeEntities. (issue #582)
- Fixed DkimPublicKeyLocatorBase to treat unspecified 'k' values in DKIM DNS records as "k=rsa". (issue #583)
- Fixed date format serializer to use CultureInfo.InvariantCulture.
- Fixed AuthenticationResults parser to allow '_' characters in method results. (issue #584)
- Improved RSACng and DSACng support.
- Improved logic for verifying signatures for MimeParts containing mixed line endings. (issue #569)
- Fixed MailboxAddress parser to decode IDN-encoded local-parts of email addresses. (MailKit issue #1026)
- Added new MailboxAddress.GetAddress(bool idnEncode) method.
- Improved subclassability of OpenPgpContext by making a number of methods virtual. (issue #571)
- Added support for RSACng and DSACng. (issue #567)
- Dropped Xamarin platforms since they are compatible with netstandard2.0.
- Fixed InternetAddressList.Insert() to allow inserting at the end of the list. (issue #559)
- Added ParserOptions.MaxMimeDepth to allow developers to set the max nesting depth allowed by the parser.
- Added logic to handle multipart children without any headers or content.
- Added a new Verify(bool verifySignatureOnly) method to IDigitalSignature for developers who just want to be able to verify the signature without worrying about the certificate chain.
- Fixed MimePart.WriteTo() to avoid canonicalizing line endings for MimeParts that do not define a Content-Transfer-Encoding. (issue #569)
- NuGet packages now include the portable pdb's.
- Fixed the MimeEntity.ContentId setter to use ParseUtils.TryParseMsgId() instead of MailboxAddress.TryParse() so that it is more lenient in what it accepts. (issue #542)
- Added an HtmlTokenizer.IgnoreTruncatedTags property which is useful when working with truncated HTML.
- Optimized the heck out of HtmlEntityDecoder.
- Added a TextPart.Format property for a quick way to determine the type of text it contains.
- Added text/plain and text/html preview/snippet generators (PlainTextPreviewer and HtmlTextPreviewer, respectively). This is part of a larger improvement to MailKit's text preview feature for IMAP. (MailKit issue #1001)
- Fixed SqlCertificateDatabase to accept null SubjectKeyIdentifiers.
- Changed Header.FormatRawValue() to be protected virtual and added Header.SetRawValue() to allow developers to override the default formatting behavior by either subclassing Header or by calling header.SetRawValue(). (issue #546)
- Switched MimeKit for Android and iOS over to using Portable.BouncyCastle.
- Added MimeTypes.Register() to allow developers to register their own mime-type mappings to file extensions.
- Updated net46, net47, and net48 builds to reference Portable.BouncyCastle instead of the standard BouncyCastle package, just like the netstandard builds. (issue #540)
- Fixed extraction of TNEF EmbeddedMessage attachment data to skip the leading GUID. (issue #538)
- Added a few more TNEF property tags.
- Fixed the HtmlEntityDecoder to require some named attributes to end with a
;
.
- Fixed parsing of email addresses containing unicode or other types of 8-bit text. (issue #536)
- Added a MimeTypes.TryGetExtension() method to try and get a file name extension based on a mime-type. (issue #534)
- Updated mime-type mappings.
- Fixed message reserialization after prepending headers. (issue #524)
- Added a ContentType.CharsetEncoding property. (issue #526)
- Allow empty prop-spec token values in Authentication-Results headers. (issue #527)
- Added logic to quote Authentication-Results pvalue tokens if needed.
- Added support for converting RSACng keys into BouncyCastle keys for net4x versions that support it.
- Added support for RSAES-OAEP for the BouncyCastle backend. (issue #528)
- Updated and changed the API for RSASSA-PSS. CmsSigner now has a RsaSignaturePadding property which obsoletes the previous RsaSignaturePaddingScheme property.
- Added more columns to the default SQLite database CERTIFICATES table that allow more optimal SQL searches for certificates given various matching criteria.
- Fixed WindowsSecureMimeContext.Decrypt() to make sure it doesn't stop at the first failed recipient. (issue #530)
- Fixed splitting and reassembly of message/partial messages.
- Improved handling of Office365 Authentication-Results headers by adding a Office365AuthenticationServiceIdentifier property to the AuthenticationMethodResult class.
- Fixed mailbox address parser to be more lenient about
"["
and"]"
characters in the display-name. (issue #532)
- Don't use PublicSign on non-Windows NT machines when building. (issue #516)
- Improved BouncyCastleSecureMimeContext logic for building certificate chains so that certificate chains are included in the S/MIME signature. (issue #515)
- Improved SqlCertificateDatabase.Find() by using more IX509Selector properties.
- Relaxed the Authentication-Results header parser a bit to allow '/' in pvalue tokens. (issue #518)
- Added the
text/csv
mime-type to theMimeTypes
mapping table for files with a .csv extension. - Expanded the .NETStandard API to match the .NET 4.5 API, so .NETStandard is now complete.
- Dropped support for .NETPortable and WindowsPhone/Universal v8.1.
- Added a net48 assembly to the NuGet package.
- Improved HTML tokenizer performance.
- Fixed X509Crl.IsDelta for CRLs without extensions. (issue #513)
- Added support for
message/global-delivery-status
,message/global-disposition-notification
, andmessage/global-headers
toMimeParser
. (issue #514) - Fixed S/MIME signatures generated by a TemporarySecureMimeContext to include the certificate chain. (issue #515)
- Fixed reserialization of message/rfc822 parts to not add an extra new-line sequence to the end of the message. (issue #510)
- Fixed DefaultSecureMimeContext to build the cert chain outside of the private key query. (issue #508)
- Modified the Message-Id parser to gobble ctrl chars in the local-part.
- Fixed some buglets in the TextToFlowed converter involving space-stuffing lines.
- Fixed BodyBuilder logic for constructing a body with an HtmlBody set to string.Empty. (issue #506)
- Fixed potential memory leaks in WindowsSecureMimeContext and BouncyCastleSecureMimeContext in the Export() methods in cases where an exception is throw while adding certificates.
- Removed MimeKit.Cryptography.NpgsqlCertificateDatabase. It is unlikely anyone actually uses this.
- Updated CmsSigner's default DigestAlgorithm to Sha256 instead of Sha1 to match System.Security.Cryptography.Pkcs.CmsSigner's default.
- Updated WindowsSecureMimeContext to default to IssuerAndSerialNumber for System.Security.Cryptography.Pkcs.CmsSigner.
- Added support for the RSASSA-PSS signature padding algorithm when using the BouncyCastle backend.
- Improved robustness of TNEF processing of email address fields.
- Modified FilteredStream.Flush*() to not flush the source stream. (MailKit issue #904)
- Added net46 and net47 assemblies to the NuGet package.
- Fixed MultipartRelated to fall back to the multipart/related type parameter when locating the Root. (issue #489)
- Improved Authentication-Results parser to handle non-standard syntax. (issue #490)
- When FormatOptions.AllowMixedHeaderCharsets is disabled, always use the user-specified charset. Previously this could/would still use us-ascii and/or iso-8859-1 if the entire header could fit within one of those charsets. (issue #493)
- Fixed the line length calculations in the BestEncodingFilter. (issue #497)
- Fixed Multipart to properly ensure the epilogue ends w/ a new-line when FormatOptions.EnsureNewLine is true. (issue #499)
- Modified Multipart.WriteTo[Async] to not ensure that a Content-Type boundary parameter has been set. This code-path was only hit if the multipart was parsed by the parser and did not have a boundary parameter in the first place. In the interest of preserving byte-for-byte compatibility with the original input, this sanity check has been removed. (issue #499)
- Added support for ARC.
- Added AuthenticationResults class for parsing and constructing Authentication-Results and ARC-Authentication-Results headers.
- Added support for the Ed25519-SHA256 DKIM signature algorithm.
- Obsoleted MimeMessage DKIM API's in favor of the newer DKIM API's:
- MimeMessage.Sign (DkimSigner, ...) has been replaced by DkimSigner.Sign (MimeMessage, ...).
- MimeMessage.Verify (Header, ...) has been replaced by DkimVerifier.Verify (MimeMessage, Header, ...).
- Added DkimPublicKeyLocatorBase to help simplify implementing IDkimPublicKeyLocator.
- Updated the BouncyCastle assemblies to version 1.8.5 for iOS and Android.
- Fixed a possible NullReferenceException when decoding S/MIME digital signatures.
- Fixed the netstandard2.0 dependencies to no longer explicitly include System.Net.Http. (issue #482)
- Override Equals(object) and GetHashCode() for InternetAddress and InternetAddressList. (issue #481)
- Fixed TnefReader.Dispose() to avoid a potential NullReferenceException if double disposed.
- Fixed the Message-Id, Content-Id, References and In-Reply-To parsers to be more liberal
in what they accept in terms of the
msg-id
token. - Changed the Header encoding logic for the In-Reply-To header to not rfc2047 encode the value even if it is longer than the suggested line-length. (issue #479)
- Reduced netstandard dependencies. (issue #475)
- Added a setter for FormatOptions.MaxLineLength, allowing developers to override this value.
- Improved TNEF handling of Content-Disposition and Content-Id properties. (issue #470 and issue #471)
- Improved Content-Id parser to be more forgiving with improperly formatted IDs. (issue #472)
- Added support for the text/rfc822-headers MIME-type via the new TextRfc822Headers class. (issue #474)
- Added fallback logic for international email addresses that are not properly encoded in UTF-8. (issue #477)
- Fixed an NRE in X509CertificateDatabase.Dispose().
- Fixed TextPart.Text and GetText() to properly canonicalize EOLN for multi-byte charsets such as UTF-16. (issue #442)
- Fixed System.Net.Mail.MailMessage cast to MimeMessage when the ContentStream of the attachments has not been rewound to the beginning of the stream. (issue #467)
- Changed ParserOptions.AllowAddressesWithoutDomain to work as users expected and moved the old logic into ParserOptions.AllowUnquotedCommasInAddresses. (issue #465)
- Fixed WindowsSecureMimeDigitalCertificate logic for ECDsa.
- Added X509Certificate.GetPublicKeyAlgorithm() extension method.
- Modified ApplicationPkcs7Mime to be less strict about the smime-type.
- Mapped the TNEF Sensitivity property to the Sensitivity message header when calling TnefPart.ConvertToMessage().
- Fixed the TNEF Importance and Priority mappings when calling TnefPart.ConvertToMessage().
- Added more TnefPropertyId's that have been identified.
- Map PidTagTnefCorrelationKey to the Message-Id message header.
- When the TNEF data does not have a SentDate property, set the MimeMessage.Date property to DateTimeOffset.MinValue instead of DateTimeOffset.Now.
- Fixed TnefPart.ConvertToMessage() to check the TNEF SubjectPrefix and NormalizedSubject properties and use them if a TNEF Subject property is not available.
- Fixed TNEF logic for extracting attachment content to not truncate some bytes from the beginning of the content.
- Added more fallbacks for attempting to extract the sender information out of the TNEF data.
- Bumped Android and iOS versions of BouncyCastle to v1.8.4.
- Optimized SecureMimeCryptographyContext.Supports() and OpenPgpCryptographyContext.Supports() implementations.
- Optimized the OptimizedOrdinalIgnoreCaseComparer even more.
- Fixed OpenPgpDigitalCertificate.ExpirationDate for PGP keys that never expire.
- Reduced string allocations in MultipartSigned.Verify() and MultipartEncrypted.Decrypt().
- Fixed OpenPgpContext.Decrypt() to make sure to always clean up MemoryBlockStreams.
- Added a bunch more HeaderId enum values.
- Improved header folding logic for headers with long words. (issue #451)
- Fixed a bug in the UUEncoder.
- Fixed a bug in MimeIterator.MoveTo().
- Modified BodyBuilder.ToMessageBody() to avoid returning a multipart/mixed with only a single child. (issue #441)
- Modified TnefPart to no longer set the name parameter on the Content-Type header of extracted message bodies. (issue #435)
- Fixed various locations that loaded content from files to use FileShare.Read so as to avoid file sharing violations if the application already has that file opened elsewhere. (issue #426)
- Improved address parser to handle "local-part (User Name)" style addresses.
- Updated the iOS and Android BouncyCastle dependency to 1.8.3.
- Modified TextPart.Text and GetText() to canonicalize the newlines. (issue #442)
- Fixed WindowsSecureMimeContext.EncapsulatedSign (CmsSigner, ...) and Sign (CmsSigner, ...).
- Added SecureMimeContext.Import(string, string) to import passworded pk12 files.
- Improved MimeParser's support of Content-Length.
- Fixed MimeParser.ParseEntity() and MimeEntity.Load() to throw a FormatException if the stream does not have properly formatted headers. (issue #443)
- Added support for message/global.
- Added more bounds checking for parsing mailbox addresses to fix IndexOutOfRangeExceptions given an incomplete address like "Name <". (issue #421)
- Fixed support for parsing mbox files using Content-Length.
- Modified the TextPart.Text getter property to check for a UTF-16 BOM and use an appropriate UTF-16 System.Text.Encoding if found instead of simply assuming UTF-8 and falling back to iso-8859-1. (issue #417)
- Minor optimizations.
- Make sure messages created from System.Net.Mail.MailMessages have a Date header. (MailKit issue #710)
- Allow developers to pass in their own SecureRandom when generating PGP key pairs. (issue #404)
- Modified MemoryBlockStream to use a shared buffer pool to relieve pressure on the GC. (MailKit issue #725)
- The default value of the
CheckCertificateRevocation
property located on theBouncyCastleSecureMimeContext
has been changed tofalse
due to privacy concerns noted in the Efail document published in May of 2018. Clients that wish to continue automatic downloads of S/MIME CRLs can manually set the property totrue
. - Properly wrap long mailbox names with quoted phrases.
- Fixed parsing of header blocks that span across read boundaries. (issue #395)
- Added FormatOptions.EnsureNewLine property (MailKit issue #251)
- Enable System.Net.Mail support for .NET Core 2.0. (issue #393)
- Allow empty TextBody and HtmlBody properties for BodyBuilder. (issue #391)
- Fixed BodyBuilder.Attachments.Add() to properly handle message/rfc822 attachments.
- Fixed HTML entity encoder logic when a surrogate pair is at the end of the input. (issue #385)
- IDN encode/decode the local part of mailbox addresses as well. (MailKit issue #649)
- Added a record for .epub to the MimeTypes database. (issue #376)
- Explicitly pass 'false' as the silent argument to SignedCms.ComputeSignature(). (issue #374)
- Make sure the MimeParser does not hang if the last header line is truncated before CRLF.
- Don't use Encoder/DecoderExceptionFallbacks in the TNEF reader. (issue #370)
- Provide a better error message when the cert within a pkcs12 cannot digital sign. (issue #367)
- Fixed TemporarySecureMimeContext to key off the certificate's fingerprint.
- Improved the HTML parser logic to better handle a number of edge cases.
- MimeKit will now automatically download CRLs based on the CRL Distribution Point certificate extension if any HTTP URLs are defined (LDAP and FTP are not yet supported) when verifying S/MIME digital signatures using a derivative of the BouncyCastleSecureMimeContext backend (the WindowsSecureMimeContext gets this for free from System.Security's CMS implementation).
- Fixed OpenPgpContext.RetrievePublicKeyRingAsync() to use the filtered stream.
- Added support for using the Blowfish encryption algorithm with S/MIME (only supported in the BouncyCastle backends).
- Added support for using the SEED encryption algorithm with S/MIME (also only supported in the BouncyCastle backends).
- Added an optional 'algorithm' argument to OpenPgpContext.GenerateKeyPair() to allow specifying the symmetric key algorithm to use in generating the key pair. This defaults to AES-256, which is the same value used in older versions of MimeKit.
- Added IDkimPublicKeyLocator.LookupPublicKeyAsync() and MimeMessage.VerifyAsync() to support asynchronous DNS lookups of DKIM public keys.
- Fixed tokenization of unquoted HTML attributes containing entities.
- Vastly improved the WindowsSecureMimeContext to do everything using System.Security instead of a mix of System.Security and Bouncy Castle.
- Refactored SecureMimeContext into a base SecureMimeContext and a BouncyCastleSecureMimeContext that contained all of the Bouncy Castle-specific logic.
- Added useful extension methods to facilitate conversion between System.Security and Bouncy Castle crypto types (such as X509Certificates and AsymmetricAlgorithms).
- Renamed the IContentObject interface to IMimeContent.
- Renamed the ContentObject class to MimeContent.
- Renamed the MimePart.ContentObject property to MimePart.Content.
- Dropped support for .NET 3.5 and .NET 4.0.
- Fixed a buffering bug in MimeParser's header parser. (issue #358)
- Set the TnefReader charset on extracted text/plain and text/html bodies. (issue #357)
- Added safeguard to protect against malformed nested group addresses which could cause a stack overflow in the parser. ParserOptions now has a way of limiting the recursive depth of rfc822 group addresses using the MaxAddressGroupDepth property. (issue #355)
- Fixed the S/MIME certificate database for .NETStandard by using GetFieldValue() instead of GetBytes() which is not supported on .NETStandard. (issue #351)
- Added async support for writing MimeMessage, MimeEntity, HeaderList and ContentObject.
- Added async support for parsing MimeMessage, MimeEntity, and HeaderList.
- Added async support to MimeKit.IO streams.
- Removed methods marked [Obsolete] (which have been marked obsolete for several years now).
- Improved performance of writing messages by a small amount.
- Fixed SecureMimeDigitalSignature to capture the signature digest algorithm used by the sending client. (issue #341)
- Fixed the S/MIME decoder to correctly determine the RC2 algorithm used by the sending client. (issue #337)
- Fixed a bug in BoundStream.Seek().
- Added CanSign() and CanEncrypt() methods to CryptographyContext for checking whether or not a mailbox can be used for signing or be encrypted to. (issue #325)
- Automatically register the CodePagesEncodingProvider when running on .NETStandard. (issue #330)
- Fixed MimeMessage.TextBody to return null when the top-level MIME part is a TextPart marked as an attachment.
- Fixed the HtmlToHtml converter to suppress comments if the HtmlTagContext's SuppressInnerContent property is active (even if FilterComments is false).
- Documented OpenPgpContext.GenerateKeyPair() which was added in 1.18.0.
- Added OpenPgpContext.Delete() methods to delete public and secret keyrings.
- Added OpenPgpContext.SignKey().
- Remove "Version:" header from armored OpenPGP output. (issue #319)
- Allow importing of known PGP keys (needed when re-importing keys after signing them). (issue #315)
- Added APIs to enumerate public and secret PGP keys.
- Added an OpenPgpDetectionFilter to detect OpenPGP blocks and their stream offsets.
- Added a MimeMessage.WriteTo() overload that takes a bool headersOnly argument.
- Pushed SecureMimeContext's EncryptionAlgorithm preferences down into CryptographyContext.
- Updated GnuPGContext to load algorithm preferences from gpg.conf.
- Fixed TemporarySecureMimeContext to use the fingerprint in the certificate lookup methods when the MailboxAddress argument is a SecureMailboxAddress. (issue #322)
- Fall back to using the Subject Alternative Rfc822 Name if the SubjectEmailAddress fails. (issue #323)
- Fixed a bug in the MailMessage to MimeMessage conversion which corrupted the Subject string. (issue #306)
- If no KeyUsage extension exists for an X509 certificate, assume no restrictions on key usage.
- Throw an exception if there is a problem building an X509 certificate chain when verifying S/MIME signatures.
- Fixed TextToHtml and FlowedToHtml's OutputHtmlFragment property to work.
- Fixed EncodeAddrspec and DecodeAddrspec to handle string.Empty. (issue #302)
- Allow string.Empty as a valid addrspec for MailboxAddress. (issue #302)
- Catch exceptions trying to import CRLs and Certs when verifying S/MIME signatures. (issue #304)
- Added new ParserOptions option to allow local-only mailbox addresses (e.g. no @domain).
- Improved address parser to interpret unquoted names containing commas in email addresses as all part of the same name/email address instead of as a separate email address.
- Greatly improved the WindowsSecureMimeContext backend.
- A number of fixes to bugs exposed by an ever-increasing set of unit tests (up to 87% coverage).
- Added International Domain Name support for email addresses.
- Added a work-around for mailers that didn't provide a disposition value in a Content-Disposition header.
- Added a work-around for mailers that quote the disposition value in a Content-Disposition header.
- Added automatic key retrieval functionality for the GnuPG crypto context.
- Added a virtual DigestSigner property to DkimSigner so that consumers can hook into services such as Azure. (issue #296)
- Fixed a bug in the MimeFilterBase.SaveRemainingInput() logic.
- Preserve munged From-lines at the start of message/rfc822 parts.
- Map code page 50220 to iso-2022-jp.
- Format Reply-To and Sender headers as address headers when using Header.SetValue().
- Fixed MimeMessage.CreateFromMailMessage() to set MimeVersion. (issue #290)
- Added new DKIM MimeMessage.Sign() methods that take an IList of header field names to sign.
- Improved the address parser to allow the lack of a terminating ';' character at the end of group addresses.
- Improved the address parser to unquoted ',' and '.' characters in the name component of mailbox and group addresses.
- Added support for CryptographyContext factories by adding new Register() methods that take function callbacks that return a SecureMimeContext or OpenPgpContext. Thanks to Christoph Enzmann for this feature. (issue #283)
- Fixed DefaultSecureMimeContext..cctor() to not call Directory.CreateDirectory() on the default database directory. Instead, let the .ctor() create it instead if and when an instance of the DefaultSecureMimeContext is created. (issue #285)
- Store DBNull in S/MIME SQL backends for null values (SQLite handles
null
but databases such as Postgres do not). (issue #286)
- Fixed the Content-Type and Content-Disposition parameter parser to remove trailing lwsp from unquoted parameter values. (issue #278)
- Fixed MimePart.WriteTo() to not necessarily force the content to end with a new-line.
- Fixed OpenPgpContext.Verify() to throw FormatException if no data packets found.
- Added new MailboxAddress constructors that do not take a 'name' argument. (issue #267)
- Added an HtmlToHtml.FilterComments property to remove comments. (issue #271)
- Modified address parser to handle invalid addresses like "user@example.com user@example.com".
- Improved parsing of malformed mailbox addresses.
- Added DecompressTo() and DecryptTo() methods to SecureMimeContext.
- Fixed MessagePartial.Split().
- Use RandomNumberGenerator.Create() for .NET Core instead of System.Random when generating multipart boundaries.
- Strong-name the .NET Core assemblies.
- Fixed logic for selecting certificates from the Windows X.509 Store. (issue #262)
- Fixed QuotedPrintableDecoder to handle soft breaks that fall on a buffer boundary.
- Fixed MimeMessage.WriteTo() to properly respect the FormatOptions when writing the message headers.
- Updated TextFormat to contain a Plain value (Text is now an alias) to hopefully make its mapping to text/plain more obvious.
- Added new TextPart .ctor that takes a TextFormat argument so that developers that don't understand mime-types can more easily intuit what that argument should be.
- Added support for .NET Core 1.0
- Changed the default value of FormatOptions.AllowMixedHeaderCharsets to false.
- Added a new DkimSigner .ctor that takes a stream of key data. (issue #255)
- Fixed parsing bugs in MessageDeliveryStatus.StatusGroups. (issue #253)
- Fixed MimeParser.ParseHeaders() to handle header blocks that do not end with a blank line. (issue #250)
- Fixed the MailboxAddress parser to handle whitespace between '<' and the addr-spec.
- Fixed TemporarySecureMimeContext to handle certificates with null email addresses. (issue #252)
- Modified MimeMessage .ctor to not add an empty To: header by default. (issue #241)
- Modified MimeMessage to remove address headers when all addresses in that field are removed.
- Properly apply SecurityCriticalAttribute to GetObjectData() on custom Exceptions.
- Fixed TnefPropertyReader to convert APPTIME values into DateTimes from the OLE Automation Date format. (issue #245)
- Modified ParamaterList.TryParse() to handle quoted rfc2231-encoded param values. (issue #239)
- Updated to reference BouncyCastle via NuGet packages rather than bundling the assemblies.
- Fixed MimeParser to set a multipart's raw epilogue to null instead of an empty byte array. Fixes some issues with digital signature verification (as well as DKIM verification).
- Added an HtmlWriter.WriteText() override with Console.WriteLine() style params.
- Added convenience MimeMessage property for the X-Priority header.
- Fixed MimeMessage.ConvertFromMailMessage() to use appropriate MimeEntity subclasses. (issue #232)
- Added a new SecureMimeContext.Verify() overload that returns the extracted content stream.
- Exposed the SecureMimeContext.GetDigitalSignatures() method as protected, allowing custom subclasses to implement their own Verify() methods.
- Fixed X509CertificateDatabase to store the X509Certificate NotBefore and NotAfter DateTimes in UTC rather than LocalTime.
- Added a work-around for GoDaddy's ASP.NET web host which does not support the iso-8859-1 System.Text.Encoding (used as a fallback encoding within MimeKit) by falling back to Windows-1252 instead.
- Added new convenience .ctors for CmsSigner and CmsRecipient for loading certificates from a file or stream.
- Fixed UrlScanner to properly deal with IPv6 literals in email addresses.
- Added a MultipartReport class for multipart/report.
- Fixed serialization for embedded message/* parts. (issue #228)
- Fixed MimeMessage.WriteTo() to only make sure that the stream ends with a newline if it wasn't parsed. (issue #227)
- Fixed MimeMessage to only set a MIME-Version if the message was not produced by the parser.
- Ignore timezones outside the range of -1200 to +1400.
- Added InternetAddress.Clone() to allow addresses to be cloned.
- Properly serialize message/rfc822 parts that contain an mbox marker.
- Fixed MimeMessage.DkimSign() to not enforce 7bit encoding of the body. (issue #224)
- Fixed ParameterList.IndexOf(string) to be case insensitive.
- Fixed serialization of mime parts with empty content. (issue #221)
- Fixed a bug in the TnefPropertyReader that would break when not all properties were read by the consumer of the API.
- Fixed the InternetAddress parser to throw a more informative error when parsing broken routes in mailboxes.
- Added HeaderList.Add(, Encoding, string) and .Insert(, Encoding, string) methods.
- Added more OpenPgpContext.Encrypt() overloads (and equivalent MultipartEncrypted overloads).
- Added OpenPgpContext.Import(PgpSecretKeyRing) and OpenPgpContext.Import(PgpSecretKeyRingBundle).
- Fixed HtmlUtils.HtmlAttributeEncode() to properly encode non-ascii characters as entities.
- Fixed HtmlUtils.HtmlEncode() to properly encode non-ascii characters as entities.
- Fixed MimeParser to track whether or not each multipart had an end boundary so that when they get reserialized, they match the original. (issue #218)
- Implemented an optimized OrdinalIgnoreCase string comparer which improves the performance of the MimeParser slightly.
- Fixed QuotedPrintableDecoder to properly handle "==" sequences.
- Added a ContentDisposition.TryParse(ParserOptions,string) method.
- Added a ContentType.TryParse(ParserOptions,string) method.
- Fixed MimeParser to trim the CR from the mbox From marker.
- Fixed SqlCertificateDatabase to properly chain Dispose.
- Handle illegal Content-Id headers that do not enclose their values in <>'s. (issue #215)
- Fixed reserialization of MimeParts with empty content. (issue #213)
- Improved parsing logic for malformed Content-Type headers.
- Fixed HtmlTokenizer to work properly when some closing tags were not lowercase.
- Bumped Bouncy Castle to v1.8.1.
- Removed unimplemented TNEF APIs.
- Use DateTime.UtcNow for S/MIME certificate validity checks.
- Added ToString() methods on ContentType/Disposition that take FormatOptions.
- Added a new ToString() method to InternetAddress that takes a FormatOptions. (issue #208)
- Added a MimeEntity.WriteTo() method that takes a bool contentOnly parameter. (issue #207)
- Added support for encoding parameter values using rfc2047 encoded-words instead of the standard rfc2231 encoding.
- Fixed SecureMailboxAddress's Fingerprint property to work with both the PGP key ID and the fingerprint. Previously only worked with the PGP key id. (issue #203)
- Added GroupAddress.Parse() and MailboxAddress.Parse() methods. (issue #197)
- Set a default filename when generating application/pgp-signature parts. (issue #195)
- Fixed DkimRelaxedBodyFilter to properly handle CRLF split across buffers.
- Added ContentType.IsMimeType method to replace CongtentType.Matches.
- Added S/MIME, PGP and DKIM support to the PCL and WindowsUniversal versions of MimeKit.
- Fixed PGP key expiration calculation when encrypting. (issue #194)
- Fixed relaxed body canonicalization logic for DKIM signatures. (issue #190)
- Fixed the Date parser to catch exceptions thrown by the DateTimeOffset .ctor if any of the fields are out of range.
- Fixed logic for trimming trailing blank lines for the DKIM relaxed body algorithm. (issue #187)
- Fixed DKIM body filters to reserve extra space in the output buffer. (issue #188)
- Allow specifying a charset encoding for each Content-Type/Disposition parameter.
- Fixed DKIM-Signature signing logic to use a UTC-based timestamp value rather than a timestamp based on the local-time. (issue #180)
- Fixed Multipart epilogue parsing and serialization logic to make sure that serializing a multipart is properly byte-for-byte identical to the original text. This fixes a corner-case that affected all types of digital signatures (DKIM, PGP, and S/MIME) spanning across nested multiparts. (issue #181)
- Fixed MimeMessage.WriteTo() to ensure that the output stream always ends with a new-line.
- Modified Base64Encoder's .ctor to allow specifying a maxLineLength.
- Fixed DKIM signing logic for multipart/alternative messages. (issue #178)
- Prevent infinite loop when flushing CharsetFilter when there is no input data left.
- Fixed an IndexOutOfRangeException bug in the TextToHTML converter logic. (issue #165)
- Fixed the DKIM-Signature verification logic to be more lenient in parsing DKIM-Signature headers. (issue #166)
- Fixed the DKIM-Signature verification logic to error-out if the h= parameter does not include the From header. (issue #167)
- Fixed the DKIM-Signature verification logic to make sure that the domain-name in the i= param matches (or is a subdomain of) the d= value. (issue #169)
- Fixed the CharsetFilter to avoid calling Convert() on empty input.
- Fixed logic for canonicalizing header values using the relaxed DKIM algorithm. (issue #171)
- Fixed AttachmentCollection to mark embedded parts as inline instead of attachment.
- Fixed the DKIM-Signature logic (both signing and verifying) to properly canonicalize the body content. (issue #172)
- Added public Stream property to IContentObject.
- Implemented a better fix for illegal unquoted multi-line Content-Type and Content-Disposition parameter values. (issue #159)
- Fixed the UrlScanner to properly handle "ftp." at the very end of the message text. (issue #161)
- Fixed charset handling logic to not override charset aliases already in the cache.
- Fixed WriteTo(string fileName) methods to overwrite the existing file. (issue #154)
- Updated InternetAddressList to implement IComparable.
- Fixed DKIM-Signature generation and verification.
- Added support for Message-Id headers that do not properly use encapsulate the value with angle brackets.
- Added a new MessageDeliveryStatus MimePart subclass to make message/delivery-status MIME parts easier to deal with.
- Improved HtmlTokenizer's support for the script tag - it is should now be completely bug free.
- Fixed to filter out duplicate recipients when encrypting for S/MIME or PGP.
- Fixed MimeParser to handle a message stream of just "\r\n".
- Add a leading space in the Sender and Resent-Sender header values.
- Fixed encoding GroupAddress with multiple mailbox addresses.
- Fixed MessageIdList to be less strict in what it will accept.
- Fixed logic for DKIM-Signature header folding.
- Fixed a bug in the HTML tokenizer to handle some weird HTML created by Outlook 15.0.
- Added CmsRecipient .ctor overloads that accept X509Certificate2. (issue #149)
- Changed BodyParts and Attachments to be IEnumerable - WARNING! This is an API change! (issue #148)
- Moved the IsAttachment property from MimePart down into MimeEntity.
- Added MimeMessage.Importance and MimeMessage.Priority properties.
- Vastly improved the HtmlToHtml text converter with a w3 compliant HTML tokenizer.
- Added support for generating and verifying DKIM-Signature headers.
- Improved error handling for Encoding.GetEncoding() in CharsetFilter constructors.
- Fixed buffering in the HTML parser.
- Fixed Windows and Temporary S/MIME contexts to use case-insensitive address comparisons like the other backends do. (issue #146).
- Added HeaderList.LastIndexOf() convenience methods.
- Added a new Prepare() method to prepare a message or entity for transport and/or signing (used by MultipartSigned and MailKit.SmtpClient) to reduce duplicated code.
- Fixed FilteredStream.Flush() to flush filters even when no data has been written.
- Fixed the ChainedStream.Read() logic. (issue #143)
- Added EncoderFilter and DecoderFilter.Create() overloads that take an encoding name (string).
- HeaderList.WriteTo() now adds a blank line to the end of the output instead of leaving this up to the MimeEntity.WriteTo() method. This was needed for the DKIM-Signatures feature.
- Fixed TextToFlowed logic that stripped trailing spaces.
- Switched to PCL Profile78 to support Xamarin.Forms.
- Added a MultipartAlternative class which adds some useful convenience methods and properties for use with the multipart/alternative mime-type.
- Fixed MimeKitLite's MimeParser to use TnefPart for the ms-tnef mime-types.
- Fixed MimeMessage.TextBody to convert format=flowed into plain text.
- Made BoundStream.LeaveOpen protected instead of private.
- Fixed ChainedStream to dispose child streams when it is disposed.
- Obsoleted MultipartEncrypted.Create() methods in favor of equivalent Encrypt() and SignAndEncrypt() methods to make them a bit more intuitive.
- Added a MimeVisitor class that implements the visitor pattern for visiting MIME nodes.
- Added a Format property to ContentType.
- Added a TryGetValue() method to ParameterList.
- Added IsFlowed and IsRichText convenience properties to TextPart.
- Fixed the HtmlToHtml converter to properly handle HTML text that begins with leading text data.
- Fixed MimeParser.ParseHeaders() to handle input that does not end with a blank line. (issue #142)
- Renamed MimeEntityConstructorInfo to MimeEntityConstructorArgs.
- Modified the MimeParser to use TextPart to represent application/rtf.
- Force the use of the rfc2047 "B" encoding for ISO-2022-JP. (issue #139)
- Added some text converters to convert between various text formats including format=flowed and HTML.
- Fixed MimeMessage.WriteTo() to be thread-safe. (issue #138)
- Added support for .NET 3.5.
- Added a convenience CmsSigner .ctor that takes an X509Certificate2 argument.
- Fixed BodyBuilder to never return a TextPart w/ a null ContentObject.
- Fixed TextPart.GetText() to protect against NullReferenceExceptions if the ContentObject is null.
- Fixed MimeFilterBase.EnsureOutputSize() to initialize OutputBuffer if it is null. Prevents NullReferenceExceptions in obscure corner cases. (issue #135)
- Added a TnefAttachFlags enum which is used to determine if image attachments in MS-TNEF data are meant to have a Content-Disposition of "inline" when extracted as MIME attachments. (issue #129)
- Fixed TnefPart.ConvertToMessage() and ExtractAttachments() to use the PR_ATTACH_MIME_TAG property to determine the intended mime-type for extracted attachments.
- Catch DecoderFallbackExceptions in MimeMessage.ToString() and fall back to Latin1. (issue #137)
- Added a work-around for a bug in Thunderbird's multipart/related implementation. (issue #124)
- Improved MimeMessage.CreateFromMailMessage() a bit more to avoid creating empty From, Reply-To, To, Cc and/or Bcc headers.
- Modified the HeaderIdExtensions to only be available for the HeaderId enum values.
- Modified InternetAddressList.Equals() to return true if the lists contain the same addresses even if they are in different orders. (issue #118)
- Allow S/MIME certificates with the NonRepudiation key usage to be used for signing. (issue #119)
- Don't change the Content-Transfer-Encoding of MIME parts being encrypted as part of a multipart/encrypted. (issue #122)
- Fixed logic to decide if a PGP secret key is expired. (issue #120)
- Added support for SecureMailboxAddresses to OpenPgpContext to allow key lookups by fingerprints instead of email addresses.
- Added the ContentDisposition.FormData string constant.
- Allow the ContentDisposition.Disposition property to be set to values other than "attachment" and "inline". (issue #112)
- Shortened the length of the local-part of auto-generated Message-Ids.
- Fixed MimeMessage.CreateFromMailMessage() to not duplicate From/To/Cc/etc addresses if the System.Net.Mail.MailMessage has been sent via System.Net.Mail.SmtpClient prior to calling MimeMessage.CreateFromMailMessage(). (issue #115)
- When parsing S/MIME digital signatures, don't import the full certificate chain. (issue #110)
- Added immutability-friendly .ctor to MimeMessage for use with languages such as F#. (issue #116)
- Ignore semi-colons in Content-Transfer-Encoding headers to work around broken mailers.
- Added ParserOptions.ParameterComplianceMode (defaults to RfcComoplianceMode.Loose) which works around unquoted parameter values in Content-Type and Content-Disposition headers. (issue #106)
- Modified the MimeParser to handle whitespace between header field names and the ':'.
- Probe to make sure that various System.Text.Encodings are available before adding aliases for them (some may not be available depending on the platform).
- Added a MimePart.GetBestEncoding() overload that takes a maxLineLength argument.
- Modified MultipartSigned to use 78 characters as the max line length rather than 998 characters. (issue #107)
- Added a new MessageDispositionNotification MimePart subclass to represent message/disposition-notification parts.
- Fixed the TNEF parser to gracefully deal with duplicate attachment properties.
- Modified the parser to accept Message-Id values without a domain (i.e. "<local-part@>").
- Fixed a NullReferenceException in MimeMessage.BodyParts in cases where a MessagePart has a null Message.
- Renamed DateUtils.TryParseDateTime() to DateUtils.TryParse() (the old API still exists but has been marked [Obsolete]).
- Renamed MimeUtils.TryParseVersion() to MimeUtils.TryParse() (the old API still exists but has been marked [Obsolete]).
- Fixed S/MIME support to gracefully deal with badly formatted signature timestamps which incrorectly use leap seconds. (issue #103)
- Fixed TnefPropertyReader.GetEmbeddedMessageReader() to skip the Guid.
- When decrypting PGP data, iterate over all encrypted packets to find one that can be decrypted (i.e. the private key exists in the user's keychain).
- Updated WindowsSecureMimeContext to respect SecureMailboxAddresses like the other backends. (issue #100)
- Added a Pkcs9SigningTime attribute to the CmsSigner for WindowsSecureMimeContext. (issue #101)
- Vastly improved MS-TNEF support. In addition to being fixed to properly extract the AttachData property of an Attachment attribute, more metadata is captured and translated to the MIME equivalents (such as attachment creation and modification times, the size of the attachment, and the display name).
- Migrated the iOS assemblies to Xamarin.iOS Unified API for 64-bit support.
Note: If you are not yet ready to port your iOS application to the Unified API, you will need to stick with the 1.0.5 release. The Classic MonoTouch API is no longer supported.
- Fixed out-of-memory error when encoding some long non-ASCII parameter values in Content-Type and Content-Disposition headers.
- Added workaround for msg-id tokens with multiple domains (e.g. id@domain1@domain2).
- Added convenience methods to Header to allow the use of charset strings.
- Added more HeaderList.Replace() method overloads for convenience.
- Added a FormatOptions property to disallow the use of mixed charsets when encoding headers (issue #139).
- Improved MimeMessage.TextBody and MimeMessage.HtmlBody logic. (issue #87)
- Added new overrides of TextPart.GetText() and SetText() methods that take a charset string argument instead of a System.Text.Encoding.
- Fixed charset fallback logic to work properly (it incorrectly assumed that by default, Encoding.UTF8.GetString() would throw an exception when it encountered illegal byte sequences). (issue #88)
- Fixed S/MIME logic for finding X.509 certificates to use for encipherment. (issue #89)
- Fixed MimeMessage.HtmlBody and MimeMessage.TextBody to properly handle nested multipart/alternatives (only generated by automated mailers).
- Added MimeMessage.HtmlBody and MimeMessage.TextBody convenience properties.
- Added TextPart.IsPlain and TextPart.IsHtml convenience properties.