Vérifier la validité d’une adresse e-mail

Voici un petit snippet pour vérifier la validité d’une adresse mail, histoire d’assurer un minimum d’intégrité à l’aide d’une contrainte de domaine vérifiée par cette fonction :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
-------------------------------
-- Nicolas SOUQUET - 09/11/2009
-------------------------------
CREATE FUNCTION Fn_CheckMail
  (@_mail VARCHAR(320))
  RETURNS BIT
  WITH SCHEMABINDING
AS
BEGIN
  RETURN CASE
        WHEN CHARINDEX(' ', LTRIM(RTRIM(@_mail))) = 0 -- Pas d'espaces
        AND LEFT(LTRIM(@_mail), 1)  '@'  -- '@' ne peut pas être le premier caractère de l'adresse
        AND RIGHT(RTRIM(@_mail), 1)  '.' -- '.' ne peut pas être le dernier caractère de l'adresse
        AND LEN(LTRIM(RTRIM(@_mail))) - LEN(REPLACE(LTRIM(RTRIM(@_mail)), '@', '')) = 1 -- Un seul '@'
        AND CHARINDEX('.', @_mail, CHARINDEX('@', @_mail)) - CHARINDEX('@', @_mail) > 1 -- Il doit y avoir un '.' après l'@        
        AND CHARINDEX('.', REVERSE(LTRIM(RTRIM(@_mail)))) >= 3 -- le nom de domaine doit se terminer avec au moins 2 caractères
        AND CHARINDEX('.@', @_mail) = 0 -- pas de '.@'
        AND CHARINDEX('..', @_mail) = 0 -- pas de '..'
        AND LEN(LEFT(@_mail, CHARINDEX('@', @_mail) - 1)) <= 64 -- la partie locale ne peut excéder 64 caractères
        AND LEN(RIGHT(@_mail, LEN(@_mail) - CHARINDEX('@', @_mail))) <= 250 -- la partie nom de domaine ne peut excéder 250 caractères
          THEN CAST(1 AS BIT)
        ELSE CAST(0 AS BIT)
      END
END

Et voici comment ajouter la contrainte à la table-exemple suivante :

1
2
3
4
5
6
7
8
9
10
11
CREATE TABLE TbClient
(
  IDClient INT NOT NULL CONSTRAINT PK_TbClient PRIMARY KEY,
  NumeroClient INT NOT NULL CONSTRAINT UQ_TbClient_NumeroClient UNIQUE,
  NomClient VARCHAR(32) NOT NULL,
  PrenomClient VARCHAR(32) NOT NULL,
  mailClient VARCHAR(320) NOT NULL
)
 
ALTER TABLE dbo.TbClient
ADD CONSTRAINT CHK_TbClient_mailClient CHECK (dbo.Fn_CheckMail(mailClient) = 1)

ElSuket

3 réflexions au sujet de « Vérifier la validité d’une adresse e-mail »

  1. Il y a une petite erreur dans la fonction : il manque la fonction LEN dans la dernière condition du CASE.

    Ce qui donne donc :

    CREATE FUNCTION Fn_CheckMail
    (@_mail VARCHAR(320))
    RETURNS BIT
    WITH SCHEMABINDING
    AS
    BEGIN
    RETURN CASE
    WHEN CHARINDEX(‘ ‘, LTRIM(RTRIM(@_mail))) = 0 — Pas d’espaces
    AND LEFT(LTRIM(@_mail), 1) ‘@’ — ‘@’ ne peut pas être le premier caractère de l’adresse
    AND RIGHT(RTRIM(@_mail), 1) ‘.’ — ‘.’ ne peut pas être le dernier caractère de l’adresse
    AND LEN(LTRIM(RTRIM(@_mail))) – LEN(REPLACE(LTRIM(RTRIM(@_mail)), ‘@’,  »)) = 1 — Un seul ‘@’
    AND CHARINDEX(‘.’, @_mail, CHARINDEX(‘@’, @_mail)) – CHARINDEX(‘@’, @_mail) > 1 — Il doit y avoir un ‘.’ après l’@
    AND CHARINDEX(‘.’, REVERSE(LTRIM(RTRIM(@_mail)))) >= 3 — le nom de domaine doit se terminer avec au moins 2 caractères
    AND CHARINDEX(‘.@’, @_mail) = 0 — pas de ‘.@’
    AND CHARINDEX(‘..’, @_mail) = 0 — pas de ‘..’
    AND LEN(LEFT(@_mail, CHARINDEX(‘@’, @_mail) – 1))

Laisser un commentaire