Validation Fake atau Disposable Domain Email pada Laravel
Pada tutorial kali ini kita akan membuat custom validation fake email pada framework Laravel. Fake email atau disposable email adalah email sekali pakai yang biasa digunakan user untuk melakukan register.
Kenapa kita harus verifikasi alamat email yang masuk ke database kita ?
- Supaya user yang verified bukan dari fake email
- Membatasi satu orang membuat banyak akun spam
Jika di database kita sudah terlanjur banyak data alamat email fake maka kita dapat memfilter penerima email saat:
- Pengiriman email newsletter
- Pengiriman email marketing dan sebagainya
Pembuatan fake email sangat mudah, tinggal search di google dengan keyword “fake email”, maka kita akan mendapatkan banyak sekali layanan fake email generator dengan nama domain tertentu.
Untuk implementasi pada project Laravel dapat dengan memvalidasi email yang dimasukan oleh user :
- Buat database untuk daftar fake domain.
- Dapatkan nama domain dengan filter @
- Buat kondisi statement untuk check nama domain, apakah terdaftar pada database atau tidak
Mari kita development:
Step 1 — Import Database Table Disposable Domain
Import table “disposable_email_domains” yang bisa di download pada tautan github berikut :
Setelah import table pada database mysql selesai, selanjutnya kita buat model dan filter di project Laravel.
Step 2— Buat Model
Buat model dengan perintah artisan berikut pada terminal:
php artisan make:model DisposableDomain
// Model created successfully.
Edit model DisposableDomain dan custom nama table seperti baris kode berikut:
<?phpnamespace App;use Illuminate\Database\Eloquent\Model;class DisposableDomain extends Model
{
/**
* The table associated with the model.
*
* @var string
*/
protected $table = 'disposable_email_domains'; /**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [ 'id', 'domain'];
}
Step 3 — Filter email
Implementasi filter domain dengan mendapatkan nama domain dari email kemudian check dengan isi domain yang ada pada table disposable_email_domains:
Berikut contohnya, buka controller :
<?phpnamespace App\Http\Controllers\Auth;use Illuminate\Support\Str;
use App\DisposableDomain;class AuthController extends Controller
{ public function filter(Request $request)
{
$email = $request->input('email');
$domain = Str::after($email, '@'); $valid = DisposableDomain::where('domain', $domain)->first();
if ($valid) {
// Email not valid
} else {
// email valid
}
}
}
Step 4 — Custom Validation Rule
Kita bisa buat validation rule untuk disposable email pada Laravel dengan perintah artisan make:rule, mari kita buat class untuk rule:
Jalankan perintah artisan berikut pada terminal:
php artisan make:rule FakeEmail
// Rule created successfully.
Akan ada file class FakeEmail yang tersimpan pada Folder app/Rules, buka class ini, lalu edit pada method passes:
public function passes($attribute, $value)
{
$email = filter_var($value, FILTER_VALIDATE_EMAIL);
if ($email) {
$domain = Str::after($email, '@'); $exist = DisposableDomain::where('domain', $domain)->first();
return $exist ? false : true;
} return false;
}
Kemudian edit method message untuk custom pesan error:
public function message()
{
return 'The :attribute must be a valid, non-disposable domain';
}
Kode lengkapnya seperti berikut:
<?phpnamespace App\Rules;use Illuminate\Contracts\Validation\Rule;
use Illuminate\Support\Str;
use App\DisposableDomain;class FakeEmail implements Rule
{
/**
* Create a new rule instance.
*
* @return void
*/
public function __construct()
{
//
} /**
* Determine if the validation rule passes.
*
* @param string $attribute
* @param mixed $value
* @return bool
*/
public function passes($attribute, $value)
{
$email = filter_var($value, FILTER_VALIDATE_EMAIL);
if ($email) {
$domain = Str::after($email, '@'); $exist = DisposableDomain::where('domain', $domain)
->first();
return $exist ? false : true;
} return false;
} /**
* Get the validation error message.
*
* @return string
*/
public function message()
{
return 'The :attribute must be a valid, non-disposable domain';
}
}
Step 5— Validasi Fake Email di Register
Kita bisa tambahkan validation rules pada field email di form Register dengan menambahkan class rule FakeEmail,
Buka class Auth/RegisterController, lalu edit pada method validator dengan tambahan kode berikut:
protected function validator(array $data)
{
return Validator::make($data, [
....
'email' => ['required', 'string', 'email', 'max:255', 'unique:users', new FakeEmail()],
....
]);
}
Kode lengkapnya seperti berikut:
<?phpnamespace App\Http\Controllers\Auth;use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use App\User;
use Illuminate\Foundation\Auth\RegistersUsers;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use App\Rules\FakeEmail;class RegisterController extends Controller
{
/*
|--------------------------------------------------------------------------
| Register Controller
|--------------------------------------------------------------------------
|
| This controller handles the registration of new users as well as their
| validation and creation. By default this controller uses a trait to
| provide this functionality without requiring any additional code.
|
*/ use RegistersUsers; /**
* Where to redirect users after registration.
*
* @var string
*/
protected $redirectTo = RouteServiceProvider::HOME; /**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('guest');
} /**
* Get a validator for an incoming registration request.
*
* @param array $data
* @return \Illuminate\Contracts\Validation\Validator
*/
protected function validator(array $data)
{
return Validator::make($data, [
'name' => ['required', 'string', 'max:255'],
'email' => ['required', 'string', 'email', 'max:255', 'unique:users', new FakeEmail()],
'password' => ['required', 'string', 'min:8', 'confirmed'],
'username' => ['required', 'string', 'min:4', 'max:255', 'unique:users'],
]);
} /**
* Create a new user instance after a valid registration.
*
* @param array $data
* @return \App\User
*/
protected function create(array $data)
{
return User::create([
'name' => $data['name'],
'email' => $data['email'],
'password' => Hash::make($data['password']),
'username' => $data['username'],
]);
}
}
Step 6 — Testing
Jalankan perintah php artisan serve pada terminal, dan akses routes register pada browser, untuk input email yang menggunakan domain yan terdaftar pada table disposable_email_domains, seperti dev@cbair.com
Kesimpulan
Validasi ini bisa kita implementasi pada project Laravel yang mempunyai fitur register user, seperti website forum atau blog untuk menghindari spam user.
Untuk daftar disposable domain bisa dibuatkan CRUD pada fitur admin untuk penambahan data domain.
Alternatif kita bisa menggunakan layanan API https://kickbox.com dengan contoh endpoint:
// GET request to https://open.kickbox.com/v1/disposable/{DomainOrEmailAddress}
// return {“disposable”:true} atau {“disposable”:false} dalam bentuk JSON response
Namun setelah saya check dengan domain inbov03.com hasilnya bukan disposable email, padahal itu diambil dari website https://temp-mail.org.
https://open.kickbox.com/v1/disposable/inbov03.com
// return {"disposable":false}
Atas dasar itu saya buat daftar fake domain dengan database sendiri.
Other Tutorial
Final Code
Tersedia di Github
Support the Author
Jika suka dengan artikel ini, bisa support saya ditautan berikut ini https://karyakarsa.com/tobidsn :)
Cheers
Tobi Ahmad