Change Log
==========

All notable changes to this project will be documented in this file.
This project adheres to [Semantic Versioning](http://semver.org/).


## [0.10.0] - 2022-07-20

### Added
- Support for parser options! (#248)
- Option to skip parsing of malformed parts (#248)
- Envelope.Date() method for parsing date (#253)
- Option to handle missing multipart boundaries (#257)

### Fixed
- Remove trailing HTML tags (#252)
- Buffer overrun in quoted-printable (#254)
- Corrected quoted-printable equals counting (#255)
- Improve splitting inside quoted text (#256)


## [0.9.4] - 2022-05-16

### Added
- Remove HTML tags in malformed content types (#229)
- Maximal number of errors recorded in Part limited (#240)
- Builder: Support other parts (#244)
- Additional decoding in mail address (#247)
- Integration test include Go 1.18

### Fixed
- Fix for quote-printed utf-8 header with quotes (#237)
- Parse address joined with semicolons (#238) 
- Use extended parser after fixing address list (#239) 
- Parse media types which are escaped at first rune (#246)

### Changed
- Rely on stdlib for decoding to UTF-8, simplifies address parsing (#234)


## [0.9.3] - 2022-01-29

### Added
- Support for more charsets (#230)
- fixMangledMediaType now removes extra content-type parts (#225)

### Fixed
- Fix new lines (ie in filenames) in mediatype.Parse (#224)
- Fix crash in QPCleaner, when line is too long and buffer is almost full (#220)


## [0.9.2] - 2021-08-21

### Added
- Auto-quote header parameters containing whitespace (#209)

### Fixed
- Remove leading header parameter whitespace (#208)

### Changed
- Move ParseMediaType to its own `mediatype` package to reduce the length of
  header.go.  Introduce wrapper func to preserve public API.


## [0.9.1] - 2021-07-31

### Added
- `mime-dump` now prints a stack trace when parsing fails for easier debugging

### Fixed
- Handle trailing whitespace in `;` separated headers (#195, thanks demofrager)
- Ignore empty sections in `;` separated headers (#199, thanks pavelbazika)
- Handle very long lines inside mime boundaries (#200, thanks pavelbazika)
- Handle 8-bit characters in unencoded media type params (#201, thanks
  pavelbazika)
- Handle tiny destination buffers and long lines in quoted-printable blocks
  (#203)

### Changed
- Encoder now uses QP or b64 encoding for 8-bit filenames instead of flattening
  to ASCII (#197, thanks Alexfilus)


## [0.9.0] - 2021-05-01

### Added
- `SendWithReversePath` method to builder, allows specifying a reverse-path
  that differs from the from address (#179, thanks cgroschupp)
- A `Sender` interface that allows our users to provide their own mail
  sending routines, or mock them in tests. #182

### Fixed
- Reject empty addresses during builder validation (#187, thanks jawr)
- Allow unset subject line during builder validation (#191, thanks psanford)

### Changed
- Updated dependencies


## [0.8.4] - 2020-12-18

### Fixed
- Attachment file names containing semicolons are no longer truncated (#174)


## [0.8.3] - 2020-11-05

### Fixed
- Reverted folded header parsing changes due to compatibility problems (#172)
- Improved performance and memory consumption of boundary reader (#170, thanks
  bttrfl and dcormier)


## [0.8.2] - 2020-10-10

### Fixed
- Use DFS instead of BFS to locate HTML body to match behavior of popular
  email clients (#157, thanks huaconghub)
- Improvements to media type parsing
- Improvements to unescaping quotes with higher codepoints (#165, thanks
  pavelbazika)
- Improvements to folded header parsing (#166, thanks pacellig)


## [0.8.1] - 2020-05-25

### Fixed
- Handle incorrectly indented headers (#149, thanks requaos)
- Handle trailing separator characters in header (#154, thanks joekamibeppu)

### Changed
- enmime no longer uses git-flow, and will now accept PRs against master


## [0.8.0] - 2020-02-23

### Added
- Inject a `application/octet-stream` as default content type when none is
  present (#140, thanks requaos)
- Add support for content-type params to part & encoding (#148, thanks
  pzeinlinger)
- UTF-7 support (#17)

### Fixed
- Handle missing parameter values in the middle of the media parameter list
  (#139, thanks requaos)
- Fix boundaryReader to respect length instead of capacity (#145, thanks
  dcormier)
- Handle very empty mime parts (#144, thanks dcormier)


## [0.7.0] - 2019-11-24

### Added
- Public DecodeHeaders function for getting header data without processing the
  body parts (thanks requaos.)
- Test coverage over 90% (thanks requaos!)

### Changed
- Update dependencies

### Fixed
- Do not attempt to detect character set for short messages (#131, thanks
  requaos.)
- Possible slice out of bounds error (#134, thanks requaos.)
- Tests on Go 1.13 no longer fail due to textproto change (#137, thanks to
  requaos.)


## [0.6.0] - 2019-08-10

### Added
- Make ParseMediaType public.

### Fixed
- Improve quoted display name handling (#112, thanks to requaos.)
- Refactor MIME part boundary detection (thanks to requaos.)
- Several improvements to MIME attribute decoding (thanks to requaos.)
- Detect text/plain attachments properly (thanks to davrux.)


## [0.5.0] - 2018-12-15

### Added
- Use github.com/pkg/errors to decorate errors with stack traces (thanks to
  dcomier.)
- Several improvements to Content-Type header decoding (thanks to dcormier.)
- File modification date to encode/decode (thanks to dann7387.)
- Handle non-delimited address lists (thanks to requaos.)
- RFC-2047 attribute name deocding (thanks to requaos.)

### Fixed
- Only detect charset on `text/*` parts (thanks to dcormier.)
- Stop adding extra newline during encode (thanks to dann7387.)
- Math bug in selecting QP or base64 encoding (thanks to dann7387.)

## [0.4.0] - 2018-11-21

### Added
- Override declared character set if another is detected with high confidence
  (thanks to nerdlich.)
- Handle unquoted specials in media type parameters (thanks to requaos.)
- Handle barren Content-Type headers (thanks to dcormier.)
- Better handle malformed media type parameters (thanks to dcormier.)

### Changed
- Use iso-8859-1 character map when implicitly declared (thanks to requaos.)
- Treat "inline" disposition as message content, not attachment unless it is
  accompanied by parameters (e.g. a filename, thanks to requaos.)

## [0.3.0] - 2018-11-01

### Added
- CLI utils now output inlines and other parts in addition to attachments.
- Clone() method to Envelope and Part (thanks to nerdlich.)
- GetHeaderKeys() method to Envelope (thanks to allenluce.)
- GetHeaderValues() plus a suite of setters for Envelope (thanks to nerdlich.)

### Changed
- Use value instead of pointer receivers and return types on MailBuilder
  methods.  Cleaner API, but may break some users.
- `enmime.Error` now conforms to the Go error interface, its `String()` method
  is now deprecated.
- `NewPart()` constructor no longer takes a parent parameter.
- Part.Errors now holds pointers, matching Envelope.Errors.

### Fixed
- Content is now populated for binary-only mails root part (thank to ostcar.)

### Removed
- Part no longer implements `io.Reader`, content is stored as a byte slice in
  `Part.Content` instead.


## [0.2.1] - 2018-10-20

### Added
- Go modules support for reproducible builds.


## [0.2.0] - 2018-02-24

### Changed
- Encoded filenames now have unicode accents stripped instead of escaped, making
  them more readable.
- Part.ContentID
  - is now properly encoded into the headers when using the builder.
  - is now populated from headers when decoding messages.
- Update go doc, add info about headers and errors.

### Fixed
- Part.Read() and Part.Utf8Reader, they are deprecated but should continue to
  function until 1.0.0.


## 0.1.0 - 2018-02-10

### Added
- Initial implementation of MIME encoding, using `enmime.MailBuilder`


[Unreleased]: https://github.com/jhillyerd/enmime/compare/v0.9.4...master
[0.9.4]:      https://github.com/jhillyerd/enmime/compare/v0.9.3...v0.9.4
[0.9.3]:      https://github.com/jhillyerd/enmime/compare/v0.9.2...v0.9.3
[0.9.2]:      https://github.com/jhillyerd/enmime/compare/v0.9.1...v0.9.2
[0.9.1]:      https://github.com/jhillyerd/enmime/compare/v0.9.0...v0.9.1
[0.9.0]:      https://github.com/jhillyerd/enmime/compare/v0.8.4...v0.9.0
[0.8.4]:      https://github.com/jhillyerd/enmime/compare/v0.8.3...v0.8.4
[0.8.3]:      https://github.com/jhillyerd/enmime/compare/v0.8.2...v0.8.3
[0.8.2]:      https://github.com/jhillyerd/enmime/compare/v0.8.1...v0.8.2
[0.8.1]:      https://github.com/jhillyerd/enmime/compare/v0.8.0...v0.8.1
[0.8.0]:      https://github.com/jhillyerd/enmime/compare/v0.7.0...v0.8.0
[0.7.0]:      https://github.com/jhillyerd/enmime/compare/v0.6.0...v0.7.0
[0.6.0]:      https://github.com/jhillyerd/enmime/compare/v0.5.0...v0.6.0
[0.5.0]:      https://github.com/jhillyerd/enmime/compare/v0.4.0...v0.5.0
[0.4.0]:      https://github.com/jhillyerd/enmime/compare/v0.3.0...v0.4.0
[0.3.0]:      https://github.com/jhillyerd/enmime/compare/v0.2.1...v0.3.0
[0.2.1]:      https://github.com/jhillyerd/enmime/compare/v0.2.0...v0.2.1
[0.2.0]:      https://github.com/jhillyerd/enmime/compare/v0.1.0...v0.2.0


## Release Checklist

1.  Update CHANGELOG.md:
    - Ensure *Unreleased* section is up to date
    - Rename *Unreleased* section to release name and date
    - Add new GitHub `/compare` link
2.  Run tests
3.  Tag release with `v` prefix

See http://keep change log.com/ for additional instructions on how to update this
file.
