V našem IS narážím prakticky neustál na to, že uživatelé zadávají emailové adresy ve špatném formátu, používají špatné oddělovače mezi adresama, nebo tam zadávají úplně jiná data (telefonní čísla, webové stránky atd)

Chyba se samozřejmě ukáže vždy, když už se řeší proč dotyčný zákazník nedostal mail s fakturou, avízo, dokumentace atd tedy maily, které generuje povětšinou systém. A tak nezbývá než kontrolovat tyto údaje buď přímo při zadávání nebo při nějaké další operaci.

 

Dlouho jsem testoval různé scripty až jsem si postupně vykradl to nejlepší a přizpůsobil to nějak univerzálněji. Třeba se vám to hodí ;-)

 

Okomentování:

Procedura vrací v proměnné @Valid hodnotu 0 = chyba 1 = adresy jsou v pořádku

Vše je zpracováno kurzorem. Ten nejprve oddělí jednotlivé emailové adresy oddělené středníkem a použije je jako vstupní proměnnou @EmailAddress. K tomu je použita funkce STRING_SPLIT. Pozor, tato funkce je podporovaná až od SQL 2016, takže si krom verze SQL zkontrolujte i v jaké kompatibility levelu máte spuštěnu databázi. Ten by měl být minimálně 130, jinak nebude tato funkce funkční.

SELECT value FROM STRING_SPLIT(@Email, ';')  

Poté kurzor vyhodnotí jednotlivé adresy a pokud nalezne chybu, povýší počítadlo @CountError +1. Nakonec je vyhodnoceno, zda je nějaká chyba a dle toho je nastavena výstupní proměnná @Valid

 

CREATE PROC [dbo].[KontrolaEmailAdresy] 
@Email NVARCHAR(200),
@Valid BIT OUTPUT

AS

BEGIN


DECLARE 
@EmailAddress NVARCHAR (200),
@CountError INT = 0
 



DECLARE cur_mail CURSOR FOR					

-- kurzor rozdělí emailové adresy oddělené středníkem a zpracuje je postupně

SELECT value FROM STRING_SPLIT(@Email, ';')  

OPEN cur_mail
FETCH NEXT FROM cur_mail INTO @EmailAddress
WHILE @@FETCH_STATUS=0						
 
  BEGIN
    

	SET @EmailAddress = LTRIM(RTRIM(ISNULL(@EmailAddress,'')))

	SET @CountError = @CountError + 
					  CASE WHEN @EmailAddress LIKE '% %' THEN 1
		              WHEN @EmailAddress LIKE ('%["(),:<>\]%') THEN 1
		              WHEN SUBSTRING(@EmailAddress,CHARINDEX('@',@EmailAddress),LEN(@EmailAddress)) LIKE ('%[!#$%&*+/=?^`_{|]%') THEN 1
		              WHEN (left(@EmailAddress,1) LIKE ('[-_.+]') or right(@EmailAddress,1) LIKE ('[-_.+]')) THEN 1                                                                                    
		              WHEN (@EmailAddress LIKE '%[%' or @EmailAddress LIKE '%]%') THEN 1
		              WHEN @EmailAddress LIKE '%@%@%' THEN 1
		              WHEN @EmailAddress NOT LIKE '_%@_%._%' THEN 1
		              ELSE 0 
		              END
					  
    FETCH NEXT FROM cur_mail INTO @EmailAddress
  END   


CLOSE cur_mail
DEALLOCATE cur_mail

-- výstup procedury 0 = chyba, 1 = OK
IF @CountError > 0
	SET @Valid = 0
	ELSE SET @Valid = 1


END

 

Tak snad se to hodí i vám ;-)