אימות דוא"ל ב-1C-Bitrix: הגן על החנות שלך מהזמנות מזויפות

הזמנות מזויפות ואובדן קשרים עקב שגיאות הקלדה בכתובת האימייל הם הפסדים ישירים לחנות המקוונת. אנו מיישמים אימות אימייל רב-שלבי ב-1C-Bitrix המסנן כתובות לא קיימות וחד-פעמיות בשלב הקופה. הצוות שלנו מספק פרויקט סוהר עם שמירת תוצאות במטמון ותמיכה שוטפת כדי להגן על העסק שלך מבלי להאט את האתר.
השירותים שאנו מציעים
מציג 1 מתוך 1כל 1626 השירותים
אימות דוא"ל ב-1C-Bitrix: הגן על החנות שלך מהזמנות מזויפות
פשוט
~1 יום

הכישורים שלנו:

שאלות נפוצות

אילו בעיות פותר אימות דוא"ל?

אובדן לקוח עקב שגיאת הקלדה: הלקוח לעולם לא מקבל קישור מעקב או חשבונית, ואתם מאבדים את ההזמנה. אנו פותרים זאת על ידי יישום אימות דוא"ל במספר רמות. הונאה: כתובות דוא"ל חד-פעמיות משמשות לעתים קרובות להתקפות או לניצול לרעה של החזרות — כל הזמנה כזו גורמת להפסדים ישירים. ירידה ביכולת המסירה: שליחה לדומיין לא קיים פוגעת במוניטין של השולח.

אימות תחבירי בלבד תופס רק 30% מהשגיאות; הוספת בדיקת רשומת MX מעלה את הדיוק ל-95% — יעיל פי שלושה. חסימת דומיינים חד-פעמיים מבטלת 5–10% מההזמנות הבעייתיות הפוטנציאליות, וחוסכת תקציב על החזרות ותמיכה.

מדוע אימות תחבירי בלבד אינו מספיק?

אימות פורמט בלבד עם filter_var אינו תופס דומיינים ללא דואר ([email protected]) או כתובות זמניות. לכן אנו מוסיפים בדיקת רשומת MX וחוסמים דומיינים חד-פעמיים. השלב החובה הוא חסימת דומיינים חד-פעמיים. זה מעלה את הדיוק ל-95% ללא שליחת דוא"ל.

מה נותנת בדיקת רשומת MX?

רשומת MX (Mail Exchange) מציינת איזה שרת מטפל בדואר עבור דומיין. אם הרשומה חסרה, שליחת דואר לדומיין זה בלתי אפשרית. הבדיקה דרך getmxrr() אורכת 50–500 אלפיות השנייה. אנו שומרים במטמון את התוצאה לכל דומיין למשך שעה כדי לא להאט את תהליך התשלום. מידע נוסף על רשומות MX זמין בתיעוד.

לפי תיעוד 1C‑Bitrix, אירועי מודול המכירה מאפשרים ליירט את הצבת ההזמנה.

שתי רמות אימות

תחביר + MX — אימות מינימלי של פורמט ורשומת MX של DNS. מהיר, ללא שליחת דוא"ל, תופס שגיאות הקלדה ודומיינים לא קיימים.

אימות מלא באמצעות קישור — אנו שולחים דוא"ל עם קישור אישור; המשתמש לוחץ כדי לאשר. אמין אך דורש שלב נוסף. עבור רוב ההזמנות הרמה הראשונה מספיקה, עם אפשרות להפעיל את השנייה עבור כתובות חשודות.

השוואת רמות

פרמטר תחביר + MX אימות מלא
מהירות מיידי 1–2 דקות (המתנה לדוא"ל)
דיוק ~95% ~99%
חסימת דומיינים חד-פעמיים כן כן
אישור בעלות לא כן
עלויות נוספות אין פיתוח תבנית דוא"ל

יישום בדיקת תחביר + MX

namespace Local\Validation;

class EmailValidator
{
    public static function validate(string $email): ValidationResult
    {
        // Формат
        if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
            return new ValidationResult(false, 'Неверный формат email');
        }

        $domain = strtolower(substr(strrchr($email, '@'), 1));

        // Одноразовые домены
        if (self::isDisposable($domain)) {
            return new ValidationResult(false, 'Временные email-адреса не принимаются');
        }

        // Проверка MX-записи
        if (!self::hasMxRecord($domain)) {
            return new ValidationResult(false, 'Домен не принимает почту');
        }

        return new ValidationResult(true, '');
    }

    private static function isDisposable(string $domain): bool
    {
        $disposable = [
            'mailinator.com',
            'guerrillamail.com',
            'tempmail.com',
            'throwam.com',
            'yopmail.com',
            '10minutemail.com',
            'trashmail.com',
            'dispostable.com',
            'fakeinbox.com',
            'getairmail.com',
            'sharklasers.com',
        ];

        return in_array($domain, $disposable, true);
    }

    private static function hasMxRecord(string $domain): bool
    {
        return (bool)@getmxrr($domain, $mxHosts);
    }
}

שימוש במטפל הזמנות

AddEventHandler('sale', 'OnBeforeOrderFinalAction', function(\Bitrix\Sale\Order $order) {
    if ($order->getId() > 0)
        return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS);

    $props = $order->getPropertyCollection();
    $email = trim($props->getItemByOrderPropertyCode('EMAIL')?->getValue() ?? '');

    if (empty($email)) {
        return new \Bitrix\Main\EventResult(
            \Bitrix\Main\EventResult::ERROR,
            new \Bitrix\Main\Error('Укажите email для получения подтверждения заказа')
        );
    }

    $result = \Local\Validation\EmailValidator::validate($email);
    if (!$result->isValid()) {
        return new \Bitrix\Main\EventResult(
            \Bitrix\Main\EventResult::ERROR,
            new \Bitrix\Main\Error($result->getError())
        );
    }

    return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS);
});

אימות מלא באמצעות קישור (למשתמשים מורשים)

namespace Local\Validation;

class EmailVerificationService
{
    public static function sendVerification(int $userId, string $email): bool
    {
        $token = bin2hex(random_bytes(32));
        $exp = time() + 86400; // 24 часа

        // Сохраняем токен
        $hlEntity = \Bitrix\Highloadblock\HighloadBlockTable::compileEntity(
            \Bitrix\Highloadblock\HighloadBlockTable::getById(EMAIL_VERIFY_HLBLOCK_ID)->fetch()
        );
        $hlEntity->getDataClass()::add([
            'UF_USER_ID' => $userId,
            'UF_EMAIL' => $email,
            'UF_TOKEN' => $token,
            'UF_EXPIRES' => \Bitrix\Main\Type\DateTime::createFromTimestamp($exp),
            'UF_CONFIRMED' => false,
        ]);

        // Отправляем письмо
        $verifyUrl = 'https://' . SITE_SERVER_NAME . '/local/verify-email.php?token=' . $token;
        return \CEvent::Send('EMAIL_VERIFICATION', SITE_ID, [
            'EMAIL' => $email,
            'VERIFY_URL' => $verifyUrl,
            'EXPIRES_AT' => date('d.m.Y H:i', $exp),
        ]);
    }

    public static function confirmToken(string $token): bool
    {
        $hlEntity = \Bitrix\Highloadblock\HighloadBlockTable::compileEntity(
            \Bitrix\Highloadblock\HighloadBlockTable::getById(EMAIL_VERIFY_HLBLOCK_ID)->fetch()
        );
        $dataClass = $hlEntity->getDataClass();
        $row = $dataClass::getRow([
            'filter' => [
                'UF_TOKEN' => $token,
                'UF_CONFIRMED' => false,
                '>=UF_EXPIRES' => new \Bitrix\Main\Type\DateTime(),
            ],
            'select' => ['ID', 'UF_USER_ID'],
        ]);

        if (!$row) return false;

        $dataClass::update($row['ID'], ['UF_CONFIRMED' => true]);

        // Обновляем флаг в профиле пользователя
        \CUser::Update($row['UF_USER_ID'], ['UF_EMAIL_VERIFIED' => 'Y']);

        return true;
    }
}

כיצד להאיץ אימות דוא"ל בצד הלקוח?

ספקו משוב מהיר לפני שליחת הטופס — אמתו תחביר והציגו רמזים. בקשת AJAX לשרת בודקת MX ודומיינים חד-פעמיים. זה משפר את חוויית המשתמש ומפחית כתובות שהוזנו שגוי.

const emailInput = document.querySelector('[name="ORDER_EMAIL"]');
emailInput?.addEventListener('blur', async () => {
  const email = emailInput.value.trim();
  if (!email) return;
  // Синтаксическая проверка на клиенте
  const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
  if (!emailRegex.test(email)) {
    showFieldError(emailInput, 'Проверьте правильность email');
    return;
  }
  // Проверка на сервере (MX + disposable)
  const res = await fetch('/local/ajax/validate-email.php', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({ email }),
  }).then(r => r.json());
  if (!res.valid) {
    showFieldError(emailInput, res.error);
  } else {
    clearFieldError(emailInput);
  }
});
// /local/ajax/validate-email.php
\Bitrix\Main\Application::getInstance()->initializeExtended();
$email = json_decode(file_get_contents('php://input'), true)['email'] ?? '';
$result = \Local\Validation\EmailValidator::validate($email);
header('Content-Type: application/json');
echo json_encode(['valid' => $result->isValid(), 'error' => $result->getError()]);

ביצועים

חיפוש MX דרך namespace Local\Validation; class EmailValidator { public static function validate(string $email): ValidationResult { // Формат if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { return new ValidationResult(false, 'Неверный формат email'); } $domain = strtolower(substr(strrchr($email, '@'), 1)); // Одноразовые домены if (self::isDisposable($domain)) { return new ValidationResult(false, 'Временные email-адреса не принимаются'); } // Проверка MX-записи if (!self::hasMxRecord($domain)) { return new ValidationResult(false, 'Домен не принимает почту'); } return new ValidationResult(true, ''); } private static function isDisposable(string $domain): bool { $disposable = [ 'mailinator.com', 'guerrillamail.com', 'tempmail.com', 'throwam.com', 'yopmail.com', '10minutemail.com', 'trashmail.com', 'dispostable.com', 'fakeinbox.com', 'getairmail.com', 'sharklasers.com', ]; return in_array($domain, $disposable, true); } private static function hasMxRecord(string $domain): bool { return (bool)@getmxrr($domain, $mxHosts); } } אורך 50–500 אלפיות השנייה. עם פותר DNS איטי זה יכול להגיע ל-2 שניות. אם זה קריטי: שמרו במטמון את התוצאה לכל דומיין למשך שעה, ובצעו אימות אסינכרוני (לאחר הזנת הדוא"ל, לא בעת שליחת הטופס).

רשימה מלאה של דומיינים חד-פעמיים (מעל 20)
  • mailinator.com
  • guerrillamail.com
  • tempmail.com
  • throwam.com
  • yopmail.com
  • 10minutemail.com
  • trashmail.com
  • dispostable.com
  • fakeinbox.com
  • getairmail.com
  • sharklasers.com
  • ועוד...

כיצד לבחור את רמת האימות לחנות שלכם?

שקלו את נפח ההזמנות ואת הסל הממוצע. אם יש לכם סיכון גבוה להונאה (מוצרים יקרים או שירותים דיגיטליים) — יישמו מיד אימות מלא מבוסס קישור. לשוק המוני עם תנועה גבוהה, בדיקת תחביר + MX מספיקה. בכל מקרה, חסימת דומיינים חד-פעמיים היא תקן אבטחה.

בפרויקט אחד עם קטלוג של 50,000 מוצרים, יישמנו את הרמה המינימלית והשגנו הפחתה של 15% בהחזרות בתוך החודש הראשון — חיסכון ישיר בתקציב.

תהליך יישום האימות

  1. ניתוח טפסי ההזמנה והרישום הנוכחיים, זיהוי עומס שיא.
  2. בחירת הרמה — תחביר + MX או עם אישור.
  3. פיתוח מחלקת AddEventHandler('sale', 'OnBeforeOrderFinalAction', function(\Bitrix\Sale\Order $order) { if ($order->getId() > 0) return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS); $props = $order->getPropertyCollection(); $email = trim($props->getItemByOrderPropertyCode('EMAIL')?->getValue() ?? ''); if (empty($email)) { return new \Bitrix\Main\EventResult( \Bitrix\Main\EventResult::ERROR, new \Bitrix\Main\Error('Укажите email для получения подтверждения заказа') ); } $result = \Local\Validation\EmailValidator::validate($email); if (!$result->isValid()) { return new \Bitrix\Main\EventResult( \Bitrix\Main\EventResult::ERROR, new \Bitrix\Main\Error($result->getError()) ); } return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS); }); ומטפל האירועים.
  4. אינטגרציה עם עגלת הקניות, הוספת אימות בצד הלקוח.
  5. בדיקות — בדיקה עם דוא"לים אמיתיים (תקינים, לא תקינים, חד-פעמיים).
  6. פריסה — שחרור לייצור, ניטור שגיאות.

מה כלול בעבודה

  • קוד מקור של מודול האימות עם הערות.
  • הגדרת אירועי namespace Local\Validation; class EmailVerificationService { public static function sendVerification(int $userId, string $email): bool { $token = bin2hex(random_bytes(32)); $exp = time() + 86400; // 24 часа // Сохраняем токен $hlEntity = \Bitrix\Highloadblock\HighloadBlockTable::compileEntity( \Bitrix\Highloadblock\HighloadBlockTable::getById(EMAIL_VERIFY_HLBLOCK_ID)->fetch() ); $hlEntity->getDataClass()::add([ 'UF_USER_ID' => $userId, 'UF_EMAIL' => $email, 'UF_TOKEN' => $token, 'UF_EXPIRES' => \Bitrix\Main\Type\DateTime::createFromTimestamp($exp), 'UF_CONFIRMED' => false, ]); // Отправляем письмо $verifyUrl = 'https://' . SITE_SERVER_NAME . '/local/verify-email.php?token=' . $token; return \CEvent::Send('EMAIL_VERIFICATION', SITE_ID, [ 'EMAIL' => $email, 'VERIFY_URL' => $verifyUrl, 'EXPIRES_AT' => date('d.m.Y H:i', $exp), ]); } public static function confirmToken(string $token): bool { $hlEntity = \Bitrix\Highloadblock\HighloadBlockTable::compileEntity( \Bitrix\Highloadblock\HighloadBlockTable::getById(EMAIL_VERIFY_HLBLOCK_ID)->fetch() ); $dataClass = $hlEntity->getDataClass(); $row = $dataClass::getRow([ 'filter' => [ 'UF_TOKEN' => $token, 'UF_CONFIRMED' => false, '>=UF_EXPIRES' => new \Bitrix\Main\Type\DateTime(), ], 'select' => ['ID', 'UF_USER_ID'], ]); if (!$row) return false; $dataClass::update($row['ID'], ['UF_CONFIRMED' => true]); // Обновляем флаг в профиле пользователя \CUser::Update($row['UF_USER_ID'], ['UF_EMAIL_VERIFIED' => 'Y']); return true; } } ו-const emailInput = document.querySelector('[name="ORDER_EMAIL"]'); emailInput?.addEventListener('blur', async () => { const email = emailInput.value.trim(); if (!email) return; // Синтаксическая проверка на клиенте const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; if (!emailRegex.test(email)) { showFieldError(emailInput, 'Проверьте правильность email'); return; } // Проверка на сервере (MX + disposable) const res = await fetch('/local/ajax/validate-email.php', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ email }), }).then(r => r.json()); if (!res.valid) { showFieldError(emailInput, res.error); } else { clearFieldError(emailInput); } }); .
  • תיעוד לתחזוקה והרחבת רשימת הדומיינים החד-פעמיים.
  • ייעוץ בנושא שמירת שאילתות MX במטמון.

לוח זמנים

תצורה לוח זמנים
תחביר + דומיינים חד-פעמיים + MX 1–2 ימים
+ אימות קישור בדוא"ל +2–3 ימים
+ אימות AJAX בצד הלקוח +יום אחד

לצוות שלנו ניסיון בפיתוח 1C‑Bitrix, עם למעלה מ-150 אינטגרציות של מערכות תשלום ואימותים שהושלמו. אנו מבטיחים פעולה תקינה בפרויקטים בעלי עומס גבוה.

הזמינו יישום אימות דוא"ל לחנות המקוונת שלכם. קבלו ייעוץ בנושא התאמתו למשימות שלכם — נעזור לכם לבחור את הרמה האופטימלית וליישם אותה תוך 1–5 ימים.