Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> ซอฟต์แวร์ >> อีเมล

เพิ่มประสิทธิภาพการยืนยันตัวตนผู้ใช้ Flask ด้วยบริการตรวจสอบอีเมล

ในโลกดิจิทัลวันนี้ ความปลอดภัยออนไลน์สำคัญมาก และการยืนยันตัวตนผู้ใช้เป็นแง่มุมสำคัญ

การยืนยันตัวตนผ่านอีเมลเป็นวิธีที่นิยมและใช้กันกว้างที่สุดสำหรับการลงทะเบียนและล็อกอินผู้ใช้ แต่ไม่ได้น่าเชื่อถือเสมอไป เพราะผู้ใช้อาจป้อนอีเมลปลอมหรือไม่ถูกต้องระหว่างลงทะเบียน ซึ่งนำไปสู่ความเสี่ยงด้านความปลอดภัยและการฉ้อโกง นี่คือที่มาของบริการตรวจสอบอีเมล (Email Validation Services)

ในบทเรียนนี้ คุณจะใช้ Email Validation Service เพื่อช่วยทำให้กระบวนการตรวจสอบอีเมลระหว่างการลงทะเบียนผู้ใช้เป็นอัตโนมัติ โดยการตรวจสอบข้อมูลติดต่อ

API ตรวจสอบ Syntax, Domain และ Mailbox ของที่อยู่อีเมล และสามารถตรวจจับ Disposable และ Risky Emails ได้อีกด้วย

โดยการรวม API นี้กับแอปพลิเคชันของคุณ คุณสามารถรับรองได้ว่ามีเฉพาะที่อยู่อีเมลที่ถูกต้องและแท้จริงเท่านั้นที่ใช้สำหรับการลงทะเบียนผู้ใช้ ซึ่งจะเพิ่มความปลอดภัยของแอปพลิเคชัน

ข้อกำหนดเบื้องต้น

ก่อนเริ่มบทเรียน ตรวจสอบให้แน่ใจว่าคุณมี:

  • ความรู้ทำงานเกี่ยวกับ Python
  • Python 3.8+ ติดตั้งบนระบบ
  • ความรู้พื้นฐานเกี่ยวกับ Flask, Flask Blueprints และ Requests

วิธีตั้งค่า Virtual Environment

ก่อนเริ่มเขียนโค้ด ต้องแน่ใจว่ามีเครื่องมือและไลบรารีที่จำเป็นติดตั้งทั้งหมด เพื่อให้ได้ Environment ที่สะอาดและแยกต่างหาก คุณจะสร้าง Virtual Environment ด้วย venv

สร้าง Project Directory และเข้าไปใน Terminal:

mkdir email-validation
cd email-validation

สร้าง Virtual Environment ชื่อ env ด้วยคำสั่ง:

python -m venv env

Python ตอนนี้มาพร้อม Library venv สำหรับสร้าง Virtual Environment

Activate Virtual Environment:

source env/bin/activate

หมายเหตุ: ถ้าคุณใช้ Windows ใช้ source env/Scripts/activate แทน

ควรเห็น (env) ใน Terminal Prompt แสดงว่า Virtual Environment Active แล้ว

การตรวจสอบอีเมลเป็นกระบวนการสำคัญสำหรับแอปพลิเคชันเว็บที่ต้องการยืนยันตัวตนผู้ใช้ และมีหลายวิธีทำ

หนึ่งในวิธีคือใช้ Email Validation Service อย่าง emailvalidation.io API นี้ช่วยให้นักพัฒนาตรวจสอบที่อยู่อีเมล โดยตรวจสอบว่า Syntax ถูกต้อง Domain มีอยู่จริง และ Mailbox รับข้อความได้หรือไม่

API มีแผนราคาต่างๆ Free Plan ให้ตรวจสอบได้ถึง 100 อีเมล ซึ่งพอสำหรับทดสอบ แพนพรีเมียมเริ่ม $9.99/เดือน ให้ Request มากขึ้น ฟีเจอร์มากขึ้น และ Response เร็วขึ้น

ในส่วนนี้ คุณจะเขียน Python Function ที่ส่ง GET Request ไปที่ Endpoint ของ API และส่งที่อยู่อีเมลที่ต้องการตรวจสอบเป็น Parameter

เพื่อ Authenticate API Request คุณต้องส่ง API Key พร้อม Request ด้วย ก่อนดำเนินการ ต้องสร้างบัญชีที่ emailvalidation.io เพื่อรับ API Key หลังสร้างบัญชีเสร็จ จะถูก Redirect ไป Dashboard คล้ายรูปด้านล่าง API Key อยู่ในพื้นที่สีดำที่ไฮไลท์

[รูปภาพ Dashboard emailvalidation.io]

เพื่อทำ GET Request ต้องติดตั้ง Library requests ใน Virtual Environment:

pip install requests

ต่อไป สร้างไฟล์ test.py และเพิ่มโค้ด:

import requests
from requests.structures import CaseInsensitiveDict

def is_valid(email: str):
    url = f"https://api.emailvalidation.io/v1/info?email={email}"
    headers = CaseInsensitiveDict()
    headers["apikey"] = "your-api-key-here"
    response = requests.get(url, headers=headers)
    return response.json()

print(is_valid("support@emailvalidation.io"))
print(is_valid("venip42579@jdsdhak.com"))

Function is_valid รับที่อยู่อีเมลเป็น Argument และสร้าง URL พร้อมอีเมลเพื่อเรียก API ของ emailvalidation.io Class CaseInsensitiveDict จาก Module requests.structures ใช้สร้าง Dictionary ที่มี Keys ไม่สนใจ Case เพื่อตั้ง API Key ใน Header ของ Request จากนั้น Return JSON Response จาก Function

สุดท้าย เรียก is_valid 2 ครั้งด้วยอีเมลต่างกัน เพื่อสาธิตการ Validate ทั้ง Valid Email (support@emailvalidation.io) และ Invalid Email (venip42579@jdsdhak.com)

Output:

{
  "email":"support@emailvalidation.io",
  "user":"support",
  "tag":"",
  "domain":"emailvalidation.io",
  "smtp_check":true,
  "mx_found":true,
  "did_you_mean":"",
  "role":true,
  "disposable":false,
  "score":0.64,
  "state":"deliverable",
  "reason":"valid_mailbox",
  "free":false,
  "format_valid":true,
  "catch_all":"None"
}
{
  "email":"venip42579@jdsdhak.com",
  "user":"venip42579",
  "tag":"",
  "domain":"jdsdhak.com",
  "smtp_check":false,
  "mx_found":false,
  "did_you_mean":"",
  "role":false,
  "disposable":false,
  "score":0.64,
  "state":"undeliverable",
  "reason":"invalid_mx",
  "free":false,
  "format_valid":true,
  "catch_all":"None"
}

คุณสามารถเรียนรู้ Keys ต่างๆ ใน Response ได้ที่นี่ เพื่อตัดสินใจว่าที่อยู่อีเมล Valid หรือ Invalid จาก JSON Response ของ emailvalidation.io ควรตรวจสอบ Fields ต่อไปนี้:

  1. format_valid: ถ้า true อีเมล Format ถูกต้อง ถ้า false อีเมลไม่ถูกต้อง
  2. mx_found: ถ้า true พบ MX Record อย่างน้อย 1 ตัวสำหรับ Domain ถ้า false Domain ไม่ถูกต้อง
  3. smtp_check: ถ้า true อีเมลมี Mailbox ถูกต้อง ถ้า false Mailbox ไม่ถูกต้อง
  4. state: สถานะปัจจุบันของอีเมล ค่าเป็น "deliverable" หรือ "undeliverable"

ดังนั้น คุณสามารถปรับ Function is_valid ให้ Return Boolean แทน JSON Object ได้:

import requests
from requests.structures import CaseInsensitiveDict

def is_valid(email: str):
    url = f"https://api.emailvalidation.io/v1/info?email={email}"
    headers = CaseInsensitiveDict()
    headers["apikey"] = "nUH1hmV24lEwX1TIXmsgRPRRZw0L0NuOeHrdMp78"
    response = requests.get(url, headers=headers)
    if response.status_code == 200:
        json_resp = response.json()
        format_valid = json_resp["format_valid"]
        mx_found = json_resp["mx_found"]
        smtp_check = json_resp["smtp_check"]
        state = json_resp["state"]
        return format_valid and mx_found and smtp_check and state == "deliverable"
    return False

print(is_valid("support@emailvalidation.io"))
print(is_valid("venip42579@jdsdhak.com"))

Output:

True
False

ในส่วนต่อไป คุณจะใช้ Function นี้ตรวจสอบอีเมลระหว่างการลงทะเบียนผู้ใช้

วิธีตั้งค่าการยืนยันตัวตนผู้ใช้พื้นฐานใน Flask

ในส่วนนี้ คุณจะผ่านขั้นตอนตั้งค่าการยืนยันตัวตนผู้ใช้พื้นฐานใน Flask คุณจะใช้โค้ดจากบทความก่อนหน้าของผม ที่อธิบายวิธี Implement Basic User Authentication

เริ่มต้นด้วยการ Pull Code จาก GitHub Repository ไปที่โฟลเดอร์ email-validation:

git init
git remote add origin https://github.com/ashutoshkrris/Flask-User-Authentication.git
git pull origin main

หมายเหตุ: คำสั่ง git clone [https://github.com/ashutoshkrris/Flask-User-Authentication.git](https://github.com/ashutoshkrris/Flask-User-Authentication.git) . จะไม่รันในกรณีนี้ เพราะ Directory ไม่ได้ว่าง

ต่อไป จะเห็นไฟล์ requirements.txt ที่มี Dependencies สำหรับรันแอปพลิเคชัน ติดตั้งด้วยคำสั่ง:

pip install -r requirements.txt

เมื่อติดตั้ง Dependencies ครบแล้ว ต้องเพิ่ม Environment Variables ที่จำเป็น โปรเจกต์มีไฟล์ .env ที่มี Environment Variables ทั้งหมด รันคำสั่งเพื่อ Export ทั้งหมดจาก .env:

source .env

ต่อไป ต้องสร้าง Database เนื่องจากโปรเจกต์ใช้ Flask-Migrate การสร้าง Database ง่ายมากด้วยคำสั่ง:

python manage.py db init
python manage.py db migrate
python manage.py db upgrade

ตอนนี้ รันแอปพลิเคชันได้ด้วยคำสั่ง:

python manage.py run

แอปพลิเคชันจะเริ่มรัน และคุณสามารถไปที่ https://localhost:5000/login บนเว็บเบราว์เซอร์เพื่อดูแอปพลิเคชัน

นี่คือ Demo Video ที่แสดงแอปพลิเคชัน:

[Demo Video]

ภายในโปรเจกต์ flask-validation จะมีโฟลเดอร์ src ที่มี Source Code และโฟลเดอร์ tests ที่มี Unit Tests

นอกจากนี้ยังมีไฟล์ config.py ที่มี Settings Configuration, manage.py ที่ใช้ Flask-CLI เพื่อเพิ่ม Commands ต่างๆ สำหรับรันและทดสอบ และไฟล์อื่นๆ อย่าง .env และ requirements.txt ที่คุณรู้จักแล้ว

โฟลเดอร์ src มี 4 Subfolders – accounts, core, templates, และ static โฟลเดอร์ templates และ static มีไฟล์ HTML และ Static Files (CSS, Images, JavaScript) ตามลำดับ โฟลเดอร์อีกสองตัว accounts และ core ใช้ Concept ของ Flask Blueprints และมีโค้ดสำหรับส่วนต่างๆ ของแอปพลิเคชัน

ถ้าอยากเรียนรู้เพิ่มเติมเกี่ยวกับ Implementation ของ Flask App คุณสามารถอ้างอิง Tutorial นี้ได้

วิธีรวม Email Validation Service เข้า Flask App

จนถึงจุดนี้ ยังสามารถลงทะเบียนในแอปพลิเคชันได้ด้วยอีเมลใดก็ได้ ไม่ว่าจะ Valid หรือไม่

แต่มันไม่ควรให้อีเมลสุ่มหรือไม่ถูกต้อง擁擠 Database ดังนั้นควร Validate อีเมลก่อนลงทะเบียนผู้ใช้ ถ้าอีเมล Valid สามารถดำเนินการลงทะเบียนต่อได้

เพิ่ม Email Validation API Key ในไฟล์ .env เพื่ออ่านได้โดยไม่ Expose สู่สาธารณะ:

export SECRET_KEY=fdkjshfhjsdfdskfdsfdcbsjdkfdsdf
export DEBUG=True
export APP_SETTINGS=config.DevelopmentConfig
export DATABASE_URL=sqlite:///db.sqlite
export FLASK_APP=src
export FLASK_DEBUG=1
export API_KEY=your-api-key-here

แทนที่ your-api-key-here ด้วย API Key ที่ถูกต้อง ต่อไป รันคำสั่งอีกครั้งเพื่อ Export Environment Variables:

source .env

ตอนนี้ สร้างไฟล์ utils.py ภายใน Subfolder accounts ในโฟลเดอร์ src ไฟล์นี้จะมี Utility Function สำหรับ Validate Email เพิ่มโค้ด:

import requests
from requests.structures import CaseInsensitiveDict
from decouple import config

def is_valid(email: str):
    url = f"https://api.emailvalidation.io/v1/info?email={email}"
    headers = CaseInsensitiveDict()
    headers["apikey"] = config("API_KEY")
    response = requests.get(url, headers=headers)
    if response.status_code == 200:
        json_resp = response.json()
        format_valid = json_resp["format_valid"]
        mx_found = json_resp["mx_found"]
        smtp_check = json_resp["smtp_check"]
        state = json_resp["state"]
        return format_valid and mx_found and smtp_check and state == "deliverable"
    return False

เช่นที่กล่าวมา Function is_valid() Return Boolean บอกว่าอีเมล Valid หรือไม่ สำคัญคือ Function ไม่ได้ Hardcode API Key แต่ดึงจาก Environment Variables

ต่อไป ใน Class RegisterForm ในไฟล์ forms.py มี Method validate Method นี้รับผิดชอบ Validate Input Data ที่ผู้ใช้ Submit ระหว่าง Registration

ก่อนหน้านี้ Method นี้ตรวจสอบแค่ว่าอีเมลลงทะเบียนแล้วหรือยัง และรหัสผ่านตรงกันหรือไม่ แต่นี้สามารถเพิ่ม Validation เพื่อเช็คว่าอีเมล Valid หรือไม่ ดังนั้น Modified validate Method จะเป็นแบบนี้:

...
from src.accounts.utils import is_valid
...

class RegisterForm(FlaskForm):
    ...
    def validate(self):
        initial_validation = super(RegisterForm, self).validate()
        if not initial_validation:
            return False
        if not is_valid(self.email.data):
            self.email.errors.append("Email is invalid")
            return False
        user = User.query.filter_by(email=self.email.data).first()
        if user:
            self.email.errors.append("Email already registered")
            return False
        if self.password.data != self.confirm.data:
            self.password.errors.append("Passwords must match")
            return False
        return True

ใน Method validate ถ้า self.email.data (คืออีเมลของผู้ใช้) ไม่ Valid คุณ Append Error Message ไปที่ List self.email.errors และ Return False หมายถึง User Data ไม่ Valid

ตอนนี้ เมื่อรันแอปพลิเคชันและลองลงทะเบียน จะเห็นการทำงานจริง นี่คือ Demo แสดงทั้งกรณี Valid และ Invalid:

[รูปภาพ Demo]

กรณีการใช้งานอื่นๆ ของ Email Validation Service

นอกจากการ Validate อีเมลผู้ใช้ระหว่างลงทะเบียน ยังมี Use Cases อื่นๆ หลายอย่างสำหรับ Email Validation Services:

  1. ทำความสะอาด Email Lists: ใช้ Email Validation Services ทำความสะอาด Email Lists โดยลบอีเมลที่ Invalid, ไม่อยู่จริง หรือ Risky ช่วยเพิ่ม Email Deliverability และรับรองว่าอีเมลถึงผู้รับเป้าหมาย
  2. ป้องกันกิจกรรมฉ้อโกง: ใช้ตรวจจับกิจกรรมฉ้อโกง เช่น การสร้างบัญชีปลอม หรือ Order ฉ้อโกง โดย Validate อีเมลที่เกี่ยวข้องกับกิจกรรมเหล่านี้ เพื่อป้องกันไม่ให้เกิดขึ้น
  3. ปรับปรุงแคมเปญการตลาด: บริการเหล่านี้ช่วยเพิ่มความแม่นยำและประสิทธิภาพของ Email Marketing Campaigns โดยรับรองว่าอีเมล Valid และ Active ธุรกิจสามารถเพิ่ม Email Deliverability Rates และปรับปรุง Campaign Performance ได้

โดยรวม Email Validation Services เป็นเครื่องมือทรงพลังในการรับรองความถูกต้องและความถูกต้องของข้อมูลผู้ใช้ ป้องกันการฉ้อโกง และปรับปรุงประสบการณ์ผู้ใช้

สรุป

Email Validation Services เป็นเครื่องมือทรงพลังสำหรับแอปพลิเคชันที่ต้องการตรวจสอบที่อยู่อีเมลผู้ใช้ การรับรองว่าอีเมล Valid เป็นสิ่งจำเป็นเพื่อป้องกันข้อผิดพลาด และรับรองว่าข้อมูล Input ของผู้ใช้ถูกต้อง

ในบทความนี้ คุณเห็นวิธีใช้ API ของ emailvalidation.io เพื่อ Validate อีเมลใน Python คุณยังเรียนรู้ Use Cases อื่นๆ ที่เป็นไปได้ เช่น Fraud Detection และ Email Marketing

ด้วยการ Implement Email Validation Services ในแอปพลิเคชันของคุณ คุณสามารถปรับปรุง User Experience และรับรองว่าข้อมูลของคุณแม่นยำและทันสมัย

แหล่งข้อมูลเพิ่มเติม

  • วิธีใช้ Blueprints จัดระเบียบ Flask Apps
  • วิธีตั้งค่า Email Verification ใน Flask App
  • emailvalidation.io Documentation

Learn to code for free. freeCodeCamp's open source curriculum has helped more than 40,000 people get jobs as developers. Get started