All notable changes to this project will be documented in this file. The changes in this project follow Convention Commits.
0.11.0 (2025-02-19)
- docker: Fix dockerfile entrypoint (d1d3326)
- Don't show proxy full info in logs (2668ce1)
- Fix AWS login in Action (6dd6fb0)
- Fix correct Dockerfile in Action (4d4d91e)
- Fixed inverted hello-name and from-email in CLI (#1565) (a53561e)
- Improve logging, add retries for Yahoo headless, switch to rustls (#1549) (b1377db)
- Make new config backwards-compatible (#1567) (b824e2c)
- Reinstate proxy in JSON request (#1569) (c36e6e0)
-
- The
hello_name
,from_email
,smtp_timeout
,retries
andproxy
settings have been moved to inside the newverif_method
field, which is now the centralized place to configure how each email is verified (categorized by email provider).
- The
0.10.0 (2024-12-15)
- feat(core)!: Update async-smtp to 0.9 (#1520) (297ce4f), closes #1520
- feat!: Add
/v1/{check_email,bulk}
endpoints with throttle&concurrency (#1537) (08522e4), closes #1537 - fix(core)!: Clean up CheckEmailInput (#1531) (b97b9ff), closes #1531
- refactor!: Use config-rs instead of env vars (#1530) (bcd2dc8), closes #1530
- feat(backend)!: Remove /v0/bulk endpoints (#1421) (522f324), closes #1421
- fix!(core): Bump timeout to 45s, set retries to 1 (#1406) (22e8e3e), closes #1406
- refactor!: Use verify method for known providers (#1366) (5ca4dfa), closes #1366
- Add backend_name in /v0/check_email (a738fae)
- Add HoneyPot rule (fb428ef)
- backend: CSV download retrieves all results (#1362) (b3670fc)
- backend: Fix docker CTRL+C (3a7245f)
- backend: Fix env var for multiple queues (ed19166)
- backend: Update sqlx to 0.7 (#1390) (7198f87)
- ci: actions/download-artifact@v4 (ec48fec)
- ci: Fix Windows build (#1397) (ab2bb41)
- ci: Use v4 of upload-artifacts (fa7f438)
- ci: Use v4 of upload-artifacts (b97d181)
- core: Fix gmail test (ea80690)
- core: Fix hotmail/outlook checks (5e4bf16)
- core: Headless check for Microsoft365 too (#1346) (682cc2d)
- core: More robust Hotmail invalid check (ee741f4)
- core: Prefer empty MX lookup when Err NoRecordsFound (#1409) (d4b5ef9)
- core: Use semver in sentry (03e6c97)
- core: Use Smtp for Gmail by default (8e79884)
- core: Use tagged enum representation (ffde851)
- Fix dockerfile (ce5067e)
- Fix dockerfile (83d70d8)
- Fix dockerfile build (95aeecb)
- Fix Dockerfiles (e9fb1e3)
- Fix duplicate
yahoo_verif_method
field in default() inputs (#1428) (b7c51d5) - Only do headless for non-365 hotmail emails (1c52bdc)
- Put Smtp debug details in Debug struct (5b71ca5)
- Remove local_ip retrieval (ff8e599)
- Revert Cargo files (#1389) (96a2278)
- rm .rustfmt.toml (#1524) (1691d2d)
- Support queues in env var (39655d5)
- Typo in expect of RCH_VERIF_METHOD (#1405) (c50d8eb)
- Add back RabbitMQ-based worker (#1513) (de75ece)
- Add debug information about each email verification (#1391) (3ea6e66)
- Add proxy field in SmtpDebug (2f60a03)
- Add RabbitMQ worker (#1395) (ecef8c9)
- Add sentry logging to worker (5aa6026)
- Allow /v1/check_email without worker mode (9ca9f39)
- backend: Add one simple retry on Unknown (fcffc1a)
- backend: Add POST /v1/bulk (#1413) (d9302d4)
- backend: Add reply-to queue (aaea59f)
- backend: Add worker webhook (db90cfa)
- backend: Customize SMTP defaults (8f152b8)
- backend: Prune bulk email verification database (#1377) (f905735)
- backend: Reject a request with to_email field empty or missing (#1353) (1d9c29f)
- backend: Support RCH_SMTP_TIMEOUT (#1407) (b9bda40)
- core: Add domain-specific rules as JSON file (#1347) (cab143c)
- core: Bump to 45s timeout for some domains (#1348) (fda33a2)
- core: Default Gmail checks to use API (4304743)
- Increase content length limit for bulk validation endpoint (#1525) (bbdab31)
- Update parser.rs (#1345) (8269f22)
- Use 2 queues instead of 1 (#1396) (af44f6c)
- Yahoo account recovery via headless (#1364) (6f0f12b)
- The
smtp_security
field has been removed from the /check_email request. -
- In
/v0/check_email
endpoint, thehotmail_verif_method
field has been replaced two fields:hotmailb2b_verif_method
andhotmailb2c_verif_method
- In
- All serializations of
"Smtp","Api","Headless"
have been converted to lowercase"smtp","api","headless"
- We switched to a more commonly-used builder pattern to create an input:
- let mut input = CheckEmailInput::new("someone@gmail.com");
- input.set_from_email("me@mycompany.com");
+ let input = CheckEmailInputBuilder::default()
+ .to_email("someone@gmail.com")
+ .from_email("me@mycompany.com")
+ .build()
+ .unwrap();
let res = check_email(input, &config).await;
- The main function,
check_email()
, now takes a second argument calledReacherConfig
. This struct contains configuration such as the webdriver address to listen to for headless email verifications, or an optional Sentry configuration to send error reports to. Previously, these configurations were passed through poorly-documented environment variables; now we make them explicit. When migration, you can passReacherConfig::default()
which returns sensible default values. - Remove /v0/bulk endpoints in favor of the /v1/bulk endpoints. New docs are here: https://help.reacher.email/bulk-email-verification.
- Vercel functions (used by https://app.reacher.email) usually timeout with a 504 error within less than 60s. So we should absolutely make a verification in less time than that.
After some testing, Reacher performs better with this setting:
- each SMTP connection times out after 45s, but we don't retry over this previous setting
- each SMTP connection times out after ~20s, but we do retry once (to avoid greylisting in some rare cases)
Changing the default behaviour in this PR.
- For Hotmail, Gmail and Yahoo addresses, the
*_use_api
and*_use_headless
parameters have been removed and replaced with a*VerifyMethod
, an enum which can take value Api, Headless or Smtp. If using headless, pass a webdriver address to env variable RCH_WEBDRIVER_ADDR. input.hotmail_use_headless
is now a bool instead of a string. Pass the webdriver address as an environment variableRCH_WEBDRIVER_ADDR
now.- core:
SmtpError::TimeoutError
has been removed in favor of the one async-smtp uses, namelystd::io::Error
withErrorKind::TimeoutError
0.9.1 (2023-10-08)
- backend: Fix CI priting (748940c)
- backend: Fix deploy to docker (20fcfa6)
- backend: Fix dockerfile (f0ed49f)
- backend: Improve sentry error messages (#1155) (d90d998)
- backend: Redact email in sentry bug tracking (2c2d1d8)
- cli: Update flags default values (a4fe57e)
- core: Add more invalid parsing and improve logging (#1156) (b5ae9f8)
- core: Default SMTP timeout to 15 (0d4fa4d)
- core: Don't use headless on Microsoft 465 addresses (#1196) (0c3c21d)
- core: Fix default CheckEmailInput (09215a1)
- core: Fix hotmail headless option parsing (6ddc3b9)
- core: Fix hotmail headless with authenticator (51cdb2e)
- core: Fix MX random record selection (#1263) (9fae593)
- core: Improve invalid parser (#1166) (bb46004)
- core: Improve parser and headless hotmail runner (#1167) (0de33a5)
- core: Improve parser from Sentry errors (fbaf588)
- core: Improve parser's
is_invalid
(#1159) (ec1c4d5) - core: No sandbox in headless Hotmail check (0590438)
- core: Remove antispam check (#1337) (06f18ed)
- core: Yahoo add back IDENTIFIER_EXISTS (2b63556)
- core: yahoo api changes: yid is userId now, sessionIndex is required and fo… (#1314) (0209111)
- Don't auto-fetch Chrome, install in Docker (84fcc0d)
- split Microsoft 365/Hotmail functionality (#1204) (e987b13)
- Switch back to upstream fast-socks (#1164) (db356f1)
- TLS accept unsafe (778692b)
- Use chromedriver instead of gecko for parallel requests (e282e28)
- #289: add haveibeenpwned check (#1253) (166dbd2), closes #289
- add email address normalisation (#1206) (f8ec348), closes #952
- add Microsoft 365 HTTP API validation (#1194) (5d3c49f), closes #937
- Add skipped domains (#1293) (29119fa)
- Add suggestions for syntax errors (#1192) (2d385f3)
- additional Gmail validation (#1193) (49c8f5c), closes #937
- backend: Add header secret to protect against public requests (#1158) (fa6a56b)
- core: Add check for antispam MX records (#1257) (c9771da)
- core: Add check gravatar image (#1188) (6a26035)
- core: Add Hotmail checks via headless password recovery (#1165) (7517ed9)
- core: Fix disabled accts on hanmail.net (#1339) (90393c8)
- core: Skip catch-all for known domains (#1336) (c40a46c)
- core: Update default MAIL-FROM and HELO (743a811)
- Move
backend
code to this repo (#1138) (0dc6053) - Revert back to
check_email
input with single email (#1150) (ce1ba53) - Set default timeout to 10s (#1251) (d04f84c)
- The
RUST_LOG
target has been changed fromcheck-if-email-exists
toreacher
.
- RUST_LOG=check-if-email-exists=debug cargo run
- RUST_LOG=reacher=debug cargo run
- The library's main function
check_email
's argumentCheckEmailInput
nows takes a singleto_email
field, instead of ato_emails: Vec<String>
pub struct CheckEmailInput {
- pub to_emails: Vec<String>,
+ pub to_email: String,
// --snip--
}
This effectively makes the public API more similar to the v0.7.* series. I'm still thinking about how to best verify multiple emails in one SMTP connection, but it most likely will be a new function with a different API. Follow issue #65 for more info.
0.8.32 (2022-08-13)
0.8.31 (2022-08-10)
0.8.30 (2022-06-02)
- Fix
has_full_inbox
check too lenient (93de444)
0.8.29 (2022-03-02)
0.8.28 (2022-02-11)
0.8.27 (2022-02-07)
- Allow user to define SMTP client security for TLS (#1043) (bc722ff)
- Break SmtpError into
{Helo,Connect,ConnectWithStream,MailFrom,RcptTo,Close}Error
(#1055) (64e5193)
0.8.26 (2022-01-26)
0.8.25 (2021-10-05)
- Use async_std_resolver::resolver_from_system_conf (#982) (376c3b0)
- Use TLS when available (#964) (aed11d2)
0.8.24 (2021-07-03)
- Add
CheckEmailInput
setterset_
prefix to differentiate with accessing fields (#933) (276f656) - Add deprecated warning when running HTTP server (#943) (e4b1570)
0.8.23 (2021-06-20)
0.8.22 (2021-03-31)
0.8.21 (2021-03-31)
0.8.20 (2021-03-30)
0.8.19 (2021-01-10)
0.8.18 (2021-01-07)
0.8.17 (2021-01-05)
0.8.16 (2020-12-07)
0.8.15 (2020-11-11)
- Don't check inputted email if catch-all (#714) (5129dd1)
- Fix 'reached the type-length limit while instantiating' (#665) (fa040fd)
0.8.14 (2020-09-24)
0.8.13 (2020-08-04)
0.8.12 (2020-08-04)
- Add "recipient address accepted" check (#489) (5d1e72a)
- http request body to use
to_emails
(#502) (36aed56)
0.8.11 (2020-07-11)
- Add "Invalid email address" check (#471) (3b03617)
- Add possibility to use proxy in Yahoo API request (#472) (aafcedf)
0.8.10 (2020-07-04)
0.8.9 (2020-07-04)
0.8.8 (2020-06-28)
- Add debug logs for Yahoo (e534670)
0.8.7 (2020-06-28)
0.8.6 (2020-06-28)
- Add additional error check for undeliverable (#374) (e52a8f0)
- Use HTTP requests to verify Yahoo emails (#412) (5fad57d)
0.8.5 (2020-05-21)
0.8.4 (2020-05-19)
0.8.3 (2020-05-12)
0.8.2 (2020-05-12)
- Add "Unknown user" smtp error check (#347) (47eb578)
- Add more error strings matching (#323) (f5392d4)
0.8.1 (2020-05-09)
0.8.0 (2020-05-08)
- This new version includes an overhaul of the codebase, mainly to prepare the groundwork for the upcoming work on bulk validation. These changes include:
- The main function
email_exists
has been renamed tocheck_email
:
- email_exists(&input).await;
+ check_email(&input).await;
-
The input
EmailInput
has been renamed toCheckEmailInput
. Its::new()
method, instead of taking a singleString
, now takesVec<String>
. -
The output
SingleEmail
has been renamed toCheckEmailOutput
. The main functioncheck_emails
now returns aVec<CheckEmailOutput>
.
pub async fn check_email(inputs: &CheckEmailInput) -> Vec<CheckEmailOutput>
-
The
syntax
field inCheckEmailOutput
is no longer aResult<SyntaxDetails, SyntaxError>
, but onlySyntaxDetails
. Error cases are guaranteed not to happen for syntax validation. -
The
misc
,mx
, andsmtp
fields' signatures stay the same:Result<{Misc,Mx,Smtp}Details, {Misc,Mx,Smtp}Error>
. However, theResult
is anErr
only when an internal error arrives. In case of errors due to user input (e.g. incorrect email inputted), theDefault
trait has been implemented on{Misc,Mx,Smtp}Details
and will be returned. As such, theSkipped
variant of error enums has been removed.
{
"input": "foo@bar.baz",
"mx": {
- "error": { "cannot resolve" }
+ "accepts_mail": false, // This is Default
+ "records": [] // This is Default
}
- The
misc
,mx
,smtp
,syntax
modules have been made private.
- The field
syntax.valid_format
has been renamed tosyntax.is_valid_syntax
.
0.7.1 (2020-04-14)
0.7.0 (2020-03-26)
email_exists
only takes one input now, anEmailInput
which is built using the builder pattern.
- use check_if_email_exists::email_exists;
+ use check_if_email_exists::{email_exists, EmailInput};
- email_exists("someone@gmail.com", "user@example.org");
+ email_exists(
+ EmailInput::new("someone@gmail.com".to_string()).from_email("user@example.org".to_string())
+ )
EmailInput
additionally takes a hello_name()
method, which is used to set the name in the EHLO smtp command.
--from
in CLI has been replaced with --from-email
.
0.6.7 (2020-03-20)
0.6.6 (2020-03-01)
0.6.1 (2020-02-18)
0.6.0 (2019-12-01)
- Add a HTTP server behind the
--http
flag (#85) (d8b733e) - Add Dockerfile &
x86_64-unknown-linux-musl
target (#86) (cba1241)
-
- The
is_disposable
subfield has been moved from themx
field to a separatemisc
field
- The
0.5.0 (2019-11-16)
-
- The main function
email_exists
now returns a Future:
- The main function
pub async fn email_exists(to_email: &str, from_email: &str) -> SingleEmail {}
- The
SmtpError::SmtpError
has been renamed toSmtpError::LettreError
to show the underlying error more correctly (i.e., coming fromlettre
crate). - The
BlockedByISP
error has been removed. Instead, you'll see e.g."connection refused"
, or whatever is returned by the SMTP server:
{
// ...,
"smtp": {
"error": {
"type": "LettreError",
"message": "connection refused"
}
},
}
0.4.0 (2019-09-30)
- the
smtp
's object keys have changed. Instead of
{
"deliverable": ...,
"full_inbox": ...,
"has_catch_all": ...
}
it now returns
{
"has_full_inbox": ...,
"is_deliverable": ...,
"is_disabled": ...,
"is_catch_all": ...
}
where is_disabled
checks if the address has been disabled/blocked by the email provider
0.3.2 (2019-09-26)
0.3.1 (2019-09-26)
0.3.0 (2019-09-26)
- New error JSON format (#56) (fec4315)
- Output JSON information with CLI (#53) (1d026d5)
- Return Result instead of Result, with much more details (#23) (39b13f5)
0.2.3 (2019-05-09)
- Update version to correct version in cli (992777c)
0.2.2 (2019-05-09)
- Fix travis and appveyor to build binaries (f743e67)