# MailChecker [![PyPi version](https://img.shields.io/pypi/v/mailchecker.svg)](https://pypi.org/project/mailchecker/#history) ![PyPI - Downloads](https://img.shields.io/pypi/dm/mailchecker) [![Cargo version](https://img.shields.io/crates/v/mailchecker.svg)](https://crates.io/crates/mailchecker) ![Crates.io](https://img.shields.io/crates/d/mailchecker) [![NPM version](https://img.shields.io/npm/v/mailchecker.svg)](http://badge.fury.io/js/mailchecker) ![npm](https://img.shields.io/npm/dm/mailchecker) [![Gem version](https://img.shields.io/gem/v/ruby-mailchecker.svg)](http://badge.fury.io/js/mailchecker) ![Gem](https://img.shields.io/gem/dt/mailchecker) [![Packagist version](https://img.shields.io/packagist/v/fgribreau/mailchecker.svg)](https://packagist.org/packages/fgribreau/mailchecker) ![Packagist](https://img.shields.io/packagist/dm/fgribreau/mailchecker) [![GoDoc](https://godoc.org/github.com/FGRibreau/mailchecker/platform/go?status.svg)](https://godoc.org/github.com/FGRibreau/mailchecker/platform/go) [![Get help on Codementor](https://cdn.codementor.io/badges/get_help_github.svg)](https://www.codementor.io/francois-guillaume-ribreau?utm_source=github&utm_medium=button&utm_term=francois-guillaume-ribreau&utm_campaign=github) [![available-for-advisory](https://img.shields.io/badge/available%20for%20advising-yes-ff69b4.svg?)](http://bit.ly/2c7uFJq) ![extra](https://img.shields.io/badge/actively%20maintained-yes-ff69b4.svg?) [![Slack](https://img.shields.io/badge/Slack-Join%20our%20tech%20community-17202A?logo=slack)](https://join.slack.com/t/fgribreau/shared_invite/zt-edpjwt2t-Zh39mDUMNQ0QOr9qOj~jrg) Cross-language email validation. Backed by a [database](./list.txt) of **over 55 000 throwable email domains**. * Validate the format of your email (uses [validator.js](https://github.com/chriso/validator.js/blob/master/validator.js#L38) email regex underneath and `FILTER_VALIDATE_EMAIL` for PHP) * Validate if the email is not a **temporary mail** (yopmail-like..., [add your own dataset to list.txt](./list.txt)) This will be very helpful when you have to contact your users and you want to avoid errors causing lack of communication or want to block "spamboxes". ------------------------- > Need to provide Webhooks inside your SaaS? - [Try Hook0, an open-source self-hostable webhook micro-service](https://www.hook0.com/) > Need to embed a charts into an email? > > It's over with **[Image-Charts](https://image-charts.com?gh_mailchecker)**, no more server-side rendering pain, 1 url = 1 chart. ``` https://image-charts.com/chart? cht=lc // chart type &chd=s:cEAELFJHHHKUju9uuXUc // chart data &chxt=x,y // axis &chxl=0:|0|1|2|3|4|5| // axis labels &chs=873x200 // size ```
------------------------ # Upgrade ## From 3.x to 4.x - PHP ```php # import using the fully qualified name. use Fgribreau\MailChecker; // ... echo MailChecker::isValid('myemail@yopmail.com'); ``` ## From 1.x to 3.x Mailchecker public API has been normalized, here are the changes: - NodeJS/JavaScript: `MailChecker(email)` -> `MailChecker.isValid(email)` - PHP: `MailChecker($email)` -> `MailChecker::isValid($email)` - Python ```python import MailChecker m = MailChecker.MailChecker() if not m.is_valid('bla@example.com'): # ... ``` became: ```python import MailChecker if not MailChecker.is_valid('bla@example.com'): # ... ``` ------------------------- MailChecker currently supports: * [NodeJS](https://github.com/FGRibreau/mailchecker/tree/master/platform/node) (CommonJS, [Instructions](#nodejs)) * [JavaScript](https://github.com/FGRibreau/mailchecker/tree/master/platform/javascript) (Client-Side, [Instructions](#javascript)) * [PHP](https://github.com/FGRibreau/mailchecker/tree/master/platform/php) ([Instructions](#php)) * [Python](https://github.com/FGRibreau/mailchecker/tree/master/platform/python) ([Instructions](#python)) * [Ruby](https://github.com/FGRibreau/mailchecker/tree/master/platform/ruby) ([Instructions](#ruby)) * [Rust](https://github.com/FGRibreau/mailchecker/tree/master/platform/rust) ([Instructions](#rust)) * [Elixir](https://github.com/FGRibreau/mailchecker/tree/master/platform/elixir) ([Instructions](#elixir)) * [Clojure](https://github.com/FGRibreau/mailchecker/tree/master/platform/clojure) ([Instructions](#clojure)) * [Go](https://github.com/FGRibreau/mailchecker/tree/master/platform/go) ([Instructions](#go)) * **Easily add support for your own language with MailChecker template system and [send us a pull-request!](https://github.com/FGRibreau/mailchecker/fork_select)** ------------------------- ## Usage ### NodeJS ```javascript var MailChecker = require('mailchecker'); if(!MailChecker.isValid('myemail@yopmail.com')){ console.error('O RLY !'); process.exit(1); } if(!MailChecker.isValid('myemail.com')){ console.error('O RLY !'); process.exit(1); } ``` ### JavaScript ```html ``` ### PHP ```php use Fgribreau\MailChecker; require __DIR__ . '/vendor/autoload.php'; if(!MailChecker::isValid('myemail@yopmail.com')){ die('O RLY !'); } if(!MailChecker::isValid('myemail.com')){ die('O RLY !'); } ``` ### Python ``` pip install mailchecker ``` ```python # no package yet; just drop in MailChecker.py where you want to use it. from MailChecker import MailChecker if not MailChecker.is_valid('bla@example.com'): print "O RLY !" ``` Django validator: https://github.com/jonashaag/django-indisposable ### Ruby ```ruby require 'mail_checker' unless MailChecker.valid?('myemail@yopmail.com') fail('O RLY!') end ``` ### Rust ```rust extern crate mailchecker; assert_eq!(true, mailchecker::is_valid("plop@plop.com")); assert_eq!(false, mailchecker::is_valid("\nok@gmail.com\n")); assert_eq!(false, mailchecker::is_valid("ok@guerrillamailblock.com")); ``` ### Elixir ```elixir Code.require_file("mail_checker.ex", "mailchecker/platform/elixir/") unless MailChecker.valid?("myemail@yopmail.com") do raise "O RLY !" end unless MailChecker.valid?("myemail.com") do raise "O RLY !" end ``` ### Clojure ```clojure ; no package yet; just drop in mailchecker.clj where you want to use it. (load-file "platform/clojure/mailchecker.clj") (if (not (mailchecker/valid? "myemail@yopmail.com")) (throw (Throwable. "O RLY!"))) (if (not (mailchecker/valid? "myemail.com")) (throw (Throwable. "O RLY!"))) ``` ### Go ```go package main import ( "log" "github.com/FGRibreau/mailchecker/platform/go" ) if !mail_checker.IsValid('myemail@yopmail.com') { log.Fatal('O RLY !'); } if !mail_checker.IsValid('myemail.com') { log.Fatal("O RLY !") } ``` -------------------- ## Installation Go ```bash go get https://github.com/FGRibreau/mailchecker ``` NodeJS/JavaScript ```bash npm install mailchecker ``` Ruby ```bash gem install ruby-mailchecker ``` PHP ```bash composer require fgribreau/mailchecker ``` __We accept pull-requests for other package manager__. ## Data sources [TorVPN](http://torvpn.com/temporaryemail.html) ```javascript $('td', 'table:last').map(function(){ return this.innerText; }).toArray(); ``` [BloggingWV](http://www.bloggingwv.com/big-list-of-disposable-temporary-email-services/) ```javascript Array.prototype.slice.call(document.querySelectorAll('.entry > ul > li a')).map(function(el){return el.innerText}); ``` ... [please add your own dataset to list.txt](./list.txt). Regenerate libraries from list.txt ------------------------------- Just run (requires NodeJS): ``` npm run build ``` ## Development Development environment requires [docker](https://www.docker.com/). ```sh # install and setup every language dependencies in parallel through docker npm install # run every language setup in parallel through docker npm run setup # run every language tests in parallel through docker npm test ```CONTRIBUTING.md
file.
## [Changelog](/CHANGELOG.md)