All notable changes to this project will be documented in this file. The changes in this project follow Convention Commits.
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("[email protected]");
- input.set_from_email("[email protected]");
+ let input = CheckEmailInputBuilder::default()
+ .to_email("[email protected]")
+ .from_email("[email protected]")
+ .build()
+ .unwrap();
let res = check_email(input, &config).await;
- 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) (), closes #65 - 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--
}
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": "[email protected]",
"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("[email protected]", "[email protected]");
+ email_exists(
+ EmailInput::new("[email protected]".to_string()).from_email("[email protected]".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)