Regex مناسب برای ایمیل

regex

#1

سلام
توی نت دنبال یه regex برای ایمیل میگشتم در کمال تعجب هزار نوع regex دیدم
یکیش اینه:

(^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$)

میخوام توی python استفاده کنم
الآن این خوبه؟
regex ای برای ایمیل داریم که صد در صد کار کنه
چون توی سایتی که اینو برداشتم نوشته بود 99.9 درصد کار میکنه بعدشم گفته بود که هیچ regex ای برای ایمیل نداریم که صد در صد کار کنه!


#2

درود خدمت شما متاسفانه رجکس ایمیل که ۱۰۰ درصد کار بکنه به نظرم نداریم . من خیلی تست کردم خیلی گشتم حتی داخل این انجمن هم پست زدم . آخرین حرکتی که فکرم رسید این بود که ایمیل فعال سازی می تونه ایمیل مناسب با ایمیل بد رو سر آخر فیلتر کنه


#3

دلیل چک کردن ایمیل چیه؟
گاهی میشه یک ping فرستاد و دید که اصلا دامنه درسته یا نه؟


#4

فقط آخه دامنه نیست توماج جان برخی مواقع اشتباه در نوشتن کلمه و … هست به نظرم کلا بی خیال همه چیز شد و منتظر موند طرف اون رو تایید کنه بهترین راه حله . اگر تایید کرد که اوکی هست و اگر نکرد یعنی ایمیل مشکل داره و زمان بندی زد مثلا هر سه ماه اونایی که ۳ ماهه فعال نشده حذف بشه


#5

فکر خوبیه، کاری که ما می کنیم اینه که در بعضی از فرم ها قبل از ثبت فرم دامنه رو چک میکنیم اما تایید هم لازمه، البته دلیل خاصی برای قسمت اول وجود داره اونم اینه که ممکنه اون فرم بخصوص رو یک کارمند بجای صاحب حساب پر کنه و ما سعی میکنیم احتمال خطا کم بشه، اما در مورد regex باید بگم که کاملا موافقم، و مثل همیشه regex یک مشکل به سیستم اضافه میکنه، در ضمن همونطور که شما فرمودی واقعا استاندارد دقیقی برای پترن ایمیل وجود نداره


#6

سلام
با جنگو دارم یه سایت مینویسم
میخواستم کاربر هم بتونه با ایمیل login کنه هم با username
کاری که کردم یه تابع نوشتم که یه ورودی میگیره با regex بررسی میکنه اگه ایمیل وارد شده بود تو db میگرده و یوزرنیم مرتبط باهاش رو پیدا میکنه و برمیگردونه
اگه هم با پترن regex همخونی نداشت یعنی خودش یوزر نیم هست و خودشو برمیگردونه
این خروجی رو + پسوورد میدم که authenticate و بعد لوگین بشه

def login_view(request):
    login_error = ""
    if request.user.is_authenticated:
        return redirect('app:index')
    if request.method == 'POST':
        username = return_username(data=request.POST['username'])
        user = authenticate(username=username, password=request.POST['password'])
        if user is not None:
            login(request, user)
            return redirect('app:index')
        else:
            login_error = "user name or password wrong"
    return render(request, 'app/login.html', {'login_error': login_error})


def return_username(data):
    email_pattern = re.compile("(^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$)")
    if email_pattern.match(data):
        unknown_user = User.objects.filter(email=data)
        if unknown_user.exists():
            username = unknown_user[0].username
        else:
            return None
    else:
        username = data
    return username

#7

کافیه روی username یک constraint بزارید که اجازه قرار دادن @ رو نده، این constraint میتونه اول فقط یک validation ساده در مدل باشه، و وقتی یوزر درخواست login میده فقط @ رو در username چک کنید.

if “@“ in username:
    It is an email

در مورد پترن هم اگر دوست دارید حتما استفاده کنید، لازم نیست regex شما خیلی پیچیده و دقیق باشه، کافیه فقط روی @ و وجود string در دو طرف @ کار کنید و باز هم از ورود @ برای فیلد username جلو گیری کنید که نیازی به پترن های پیچیده و کند نداشته باشید


#8

مورد بعدی اینه که چرا باید دوتا login به یک یوزر داد؟ اگر فقط با email باشه مشکلات زیادی حل میشه :sunny:


#9

سلام
علت خاصی نداره فقط سلیقه شخصی
مشکل اصلی اینجاست که توی مدل یوزر پیشفرض جنگو اصلا ایمیل unique نیست چه برسه به این که بشه باهاش login کرد
من تمام این کارار رو به روش های عجیب غریب دارم انجام میدم که ایمیل هم unique باشه و هم بشه باهاش login کرد