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 ;-)