2009-04-29 8 views

Odpowiedz

114
SELECT * FROM people WHERE email NOT LIKE '%[email protected]__%.__%' 

Wszystko, co bardziej złożone, prawdopodobnie zwróci fałszywe negatywy i będzie działać wolniej.

Sprawdzanie poprawności adresów e-mail w kodzie jest praktycznie niemożliwe.

EDIT: Podobne pytania

+4

Użyłem tego i nie zawiodło mnie od lat. Uważam się za całkiem dobry w regexach, ale myślę, że cylon napisał ten http://ex-parrot.com/~pdw/Mail-RFC822-Address.html –

+0

Dzięki, to jest niesamowite! Zrobiłem przeszukiwanie stackoverflow, ale powinienem użyć wyszukiwarki google:/ Pozdrawiam! – campo

+1

Zbyt skomplikowane i złe. foo @ bar to legalny adres e-mail (pod warunkiem, że TLD ".bar" istnieje i ma adres lub rekord MX). – bortzmeyer

16

Oto szybkie i proste rozwiązanie:

CREATE FUNCTION dbo.vaValidEmail(@EMAIL varchar(100)) 

RETURNS bit as 
BEGIN  
    DECLARE @bitRetVal as Bit 
    IF (@EMAIL <> '' AND @EMAIL NOT LIKE '_%@__%.__%') 
    SET @bitRetVal = 0 -- Invalid 
    ELSE 
    SET @bitRetVal = 1 -- Valid 
    RETURN @bitRetVal 
END 

Następnie można znaleźć wszystkie wiersze za pomocą funkcji:

SELECT * FROM users WHERE dbo.vaValidEmail(email) = 0 

Jeżeli nie jesteś zadowolony z tworzenia funkcję w swojej bazie danych, można użyć podobnych klauzuli bezpośrednio w zapytaniu:

SELECT * FROM users WHERE email NOT LIKE '_%@__%.__%' 

Source

+0

+1 dla UDF. – Tomalak

-1
select * from users 
WHERE NOT 
( CHARINDEX(' ',LTRIM(RTRIM([Email]))) = 0 
AND LEFT(LTRIM([Email]),1) <> '@' 
AND RIGHT(RTRIM([Email]),1) <> '.' 
AND CHARINDEX('.',[Email],CHARINDEX('@',[Email])) - CHARINDEX('@',[Email]) > 1 
AND LEN(LTRIM(RTRIM([Email]))) - LEN(REPLACE(LTRIM(RTRIM([Email])),'@','')) = 1 
AND CHARINDEX('.',REVERSE(LTRIM(RTRIM([Email])))) >= 3 
AND (CHARINDEX('[email protected]',[Email]) = 0 AND CHARINDEX('..',[Email]) = 0) 
2
select 
    email 
from loginuser where 
patindex ('%[ &'',":;!+=\/()<>]*%', email) > 0 -- Invalid characters 
or patindex ('[@.-_]%', email) > 0 -- Valid but cannot be starting character 
or patindex ('%[@.-_]', email) > 0 -- Valid but cannot be ending character 
or email not like '%@%.%' -- Must contain at least one @ and one . 
or email like '%..%'  -- Cannot have two periods in a row 
or email like '%@%@%'  -- Cannot have two @ anywhere 
or email like '%[email protected]%' or email like '%@.%' -- Cant have @ and . next to each other 
or email like '%.cm' or email like '%.co' -- Unlikely. Probably typos 
or email like '%.or' or email like '%.ne' -- Missing last letter 

To zadziałało dla mnie. Musiał zastosować rtrim i ltrim, aby uniknąć fałszywych trafień.

Źródło: http://sevenwires.blogspot.com/2008/09/sql-how-to-find-invalid-email-in-sql.html

Postgres wersja:

select user_guid, user_guid email_address, creation_date, email_verified, active 
from user_data where 
length(substring (email_address from '%[ &'',":;!+=\/()<>]%')) > 0 -- Invalid characters 
or length(substring (email_address from '[@.-_]%')) > 0 -- Valid but cannot be starting character 
or length(substring (email_address from '%[@.-_]')) > 0 -- Valid but cannot be ending character 
or email_address not like '%@%.%' -- Must contain at least one @ and one . 
or email_address like '%..%'  -- Cannot have two periods in a row 
or email_address like '%@%@%'  -- Cannot have two @ anywhere 
or email_address like '%[email protected]%' or email_address like '%@.%' -- Cant have @ and . next to each other 
or email_address like '%.cm' or email_address like '%.co' -- Unlikely. Probably typos 
or email_address like '%.or' or email_address like '%.ne' -- Missing last letter 
; 
+0

@Manishm wypróbuj wersję PostgreSQL z wiadomością e-mail 'myname @ gmail'. dlatego ode mnie skorzystałem - ogromna złożoność, ale nie działa. – 1ac0

+0

[email protected] jest prawidłowym adresem mailowym –

+0

Bądź ostrożny przy nazwach domen, ponieważ [email protected] jest ważne (zwróć uwagę na część ".co") – kurdtpage

3

MySQL

SELECT * FROM `emails` WHERE `email` 
NOT REGEXP '[-a-z0-9~!$%^&*_=+}{\\\'?]+(\\.[-a-z0-9~!$%^&*_=+}{\\\'?]+)*@([a-z0-9_][-a-z0-9_]*(\\.[-a-z0-9_]+)*\\.(aero|arpa|biz|com|coop|edu|gov|info|int|mil|museum|name|net|org|pro|travel|mobi|[a-z][a-z])|([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}))(:[0-9]{1,5})?' 
+1

To doesn działa na MS SQL Server. Proszę podać dostawcę DB, na którym działa powyższa składnia. – Neolisk

-7
DELETE 
FROM `contatti` 
WHERE `EMail` NOT LIKE "%.it" 
    AND `EMail` NOT LIKE "%.com" 
    AND `EMail` NOT LIKE "%.fr" 
    AND `EMail` NOT LIKE "%.net" 
    AND `EMail` NOT LIKE "%.ru" 
    AND `EMail` NOT LIKE "%.eu" 
    AND `EMail` NOT LIKE "%.org" 
    AND `EMail` NOT LIKE "%.edu" 
    AND `EMail` NOT LIKE "%.uk" 
    AND `EMail` NOT LIKE "%.de" 
    AND `EMail` NOT LIKE "%.biz" 
    AND `EMail` NOT LIKE "%.ch" 
    AND `EMail` NOT LIKE "%.bg" 
    AND `EMail` NOT LIKE "%.info" 
    AND `EMail` NOT LIKE "%.br" 
    AND `EMail` NOT LIKE "%.pt" 
    AND `EMail` NOT LIKE "%.za" 
    AND `EMail` NOT LIKE "%.vn" 
    AND `EMail` NOT LIKE "%.es" 
    AND `EMail` NOT LIKE "%.in" 
    AND `EMail` NOT LIKE "%.dk" 
    AND `EMail` NOT LIKE "%.ni" 
    AND `EMail` NOT LIKE "%.ar" 

i umieścić wszystkie rozszerzenia chcesz

+0

Edytuj odpowiedź i sformatuj kod, aby był czytelny. – kleopatra

+0

Świetnie. Spowoduje to usunięcie wszystkich ważnych adresów e-mail z Austrii, Liechtensteinu lub innych ważnych domen TLD. (Nie można zgodzić, nie ma wystarczającej reputacji). – urbanhusky

-1
select *  
from MailList.dbo.tblMailID 
where  
    patindex ('%[ &'',":;!+=\/()<>]%', mailid) > 0 -- Invalid characters 
    or patindex ('[@.-_]%', mailid) > 0  -- Valid but cannot be starting character 
    or patindex ('%[@.-_]', mailid) > 0  -- Valid but cannot be ending character 
    or mid not like '%@%.%'     -- Must contain at least one @ and one . 
    or mid like '%..%'      -- Cannot have two periods in a row 
    or mid like '%@%@%'      -- Cannot have two @ anywhere 
    or mid like '%[email protected]%' or mailid like '%@.%' -- Cannot have @ and . next to each other 
    or mid like '%.cm' or mailid like '%.co' -- Camaroon or Colombia? Unlikely. Probably typos  
    or mid like '%.or' or mailid like '%.ne' -- Missing last letter 
-2

Wiem, że post jest stary, ale po upływie 3 miesięcy i przy różnych kombinacjach wiadomości e-mail natknąłem się, w stanie uczynić ten sql do sprawdzania poprawności identyfikatorów e-mail.

CREATE FUNCTION [dbo].[isValidEmailFormat] 
(
    @EmailAddress varchar(500) 
) 
RETURNS bit 
AS 
BEGIN 
    DECLARE @Result bit 

    SET @EmailAddress = LTRIM(RTRIM(@EmailAddress)); 
    SELECT @Result = 
    CASE WHEN 
    CHARINDEX(' ',LTRIM(RTRIM(@EmailAddress))) = 0 
    AND LEFT(LTRIM(@EmailAddress),1) <> '@' 
    AND RIGHT(RTRIM(@EmailAddress),1) <> '.' 
    AND LEFT(LTRIM(@EmailAddress),1) <> '-' 
    AND CHARINDEX('.',@EmailAddress,CHARINDEX('@',@EmailAddress)) - CHARINDEX('@',@EmailAddress) > 2  
    AND LEN(LTRIM(RTRIM(@EmailAddress))) - LEN(REPLACE(LTRIM(RTRIM(@EmailAddress)),'@','')) = 1 
    AND CHARINDEX('.',REVERSE(LTRIM(RTRIM(@EmailAddress)))) >= 3 
    AND (CHARINDEX('[email protected]',@EmailAddress) = 0 AND CHARINDEX('..',@EmailAddress) = 0) 
    AND (CHARINDEX('[email protected]',@EmailAddress) = 0 AND CHARINDEX('..',@EmailAddress) = 0) 
    AND (CHARINDEX('[email protected]',@EmailAddress) = 0 AND CHARINDEX('..',@EmailAddress) = 0) 
    AND ISNUMERIC(SUBSTRING(@EmailAddress, 1, 1)) = 0 
    AND CHARINDEX(',', @EmailAddress) = 0 
    AND CHARINDEX('!', @EmailAddress) = 0 
    AND CHARINDEX('-.', @EmailAddress)=0 
    AND CHARINDEX('%', @EmailAddress)=0 
    AND CHARINDEX('#', @EmailAddress)=0 
    AND CHARINDEX('$', @EmailAddress)=0 
    AND CHARINDEX('&', @EmailAddress)=0 
    AND CHARINDEX('^', @EmailAddress)=0 
    AND CHARINDEX('''', @EmailAddress)=0 
    AND CHARINDEX('\', @EmailAddress)=0 
    AND CHARINDEX('/', @EmailAddress)=0 
    AND CHARINDEX('*', @EmailAddress)=0 
    AND CHARINDEX('+', @EmailAddress)=0 
    AND CHARINDEX('(', @EmailAddress)=0 
    AND CHARINDEX(')', @EmailAddress)=0 
    AND CHARINDEX('[', @EmailAddress)=0 
    AND CHARINDEX(']', @EmailAddress)=0 
    AND CHARINDEX('{', @EmailAddress)=0 
    AND CHARINDEX('}', @EmailAddress)=0 
    AND CHARINDEX('?', @EmailAddress)=0 
    AND CHARINDEX('<', @EmailAddress)=0 
    AND CHARINDEX('>', @EmailAddress)=0 
    AND CHARINDEX('=', @EmailAddress)=0 
    AND CHARINDEX('~', @EmailAddress)=0 
    AND CHARINDEX('`', @EmailAddress)=0 
    AND CHARINDEX('.', SUBSTRING(@EmailAddress, CHARINDEX('@', @EmailAddress)+1, 2))=0 
    AND CHARINDEX('.', SUBSTRING(@EmailAddress, CHARINDEX('@', @EmailAddress)-1, 2))=0 
    AND LEN(SUBSTRING(@EmailAddress, 0, CHARINDEX('@', @EmailAddress)))>1 
    AND CHARINDEX('.', REVERSE(@EmailAddress)) > 2 
    AND CHARINDEX('.', REVERSE(@EmailAddress)) < 5 
    THEN 1 ELSE 0 END 


    RETURN @Result 
END 

Wszelkie sugestie są mile widziane!

5

Uważam to proste zapytanie T-SQL przydatna powrocie prawidłowych adresów e-mail

SELECT email 
FROM People 
WHERE email LIKE '%[email protected]__%.__%' 
    AND PATINDEX('%[^a-z,0-9,@,.,_]%', REPLACE(email, '-', 'a')) = 0 

Bit PATINDEX eliminuje wszystkie adresy e-mail zawierających znaki, które nie są w dozwolonym AZ, 0-9, '@', '.', '_' & '-' zestaw znaków.

To może być odwrócone, aby robić to, co chcesz tak:

SELECT email 
FROM People 
WHERE NOT (email LIKE '%[email protected]__%.__%' 
    AND PATINDEX('%[^a-z,0-9,@,.,_]%', REPLACE(email, '-', 'a')) = 0) 
+0

Możesz wyeliminować funkcję REPLACE, usuwając myślnik w następujący sposób: 'AND PATINDEX ('% [^ az, 0-9, @,., _, \ -]%', email) = 0' – Splendor

-1
go 

create proc GetEmail 

@name varchar(22), 
@gmail varchar(22) 

as 

begin 

declare @a varchar(22) 

set select @a=substring(@gmail,charindex('@',@gmail),len(@gmail)-charindex('@',@gmail)+1) 

if (@a = 'gmail.com) 

insert into table_name values(@name,@gmail) 

else 

print 'please enter valid email address' 

end 
+0

Proszę sformatować swój kod i dodaj jakiś opis !! –

0

Na serwerze SQL 2016 lub sup

CREATE FUNCTION [DBO].[F_IsEmail] (
@EmailAddr varchar(360) -- Email address to check 
) RETURNS BIT -- 1 if @EmailAddr is a valid email address 

AS BEGIN 
DECLARE @AlphabetPlus VARCHAR(255) 
     , @Max INT -- Length of the address 
     , @Pos INT -- Position in @EmailAddr 
     , @OK BIT -- Is @EmailAddr OK 
-- Check basic conditions 
IF @EmailAddr IS NULL 
    OR @EmailAddr NOT LIKE '[0-9a-zA-Z]%@__%.__%' 
    OR @EmailAddr LIKE '%@%@%' 
    OR @EmailAddr LIKE '%..%' 
    OR @EmailAddr LIKE '%[email protected]' 
    OR @EmailAddr LIKE '%@.' 
    OR @EmailAddr LIKE '%@%.-%' 
    OR @EmailAddr LIKE '%@%-.%' 
    OR @EmailAddr LIKE '%@-%' 
    OR CHARINDEX(' ',LTRIM(RTRIM(@EmailAddr))) > 0 
     RETURN(0) 



declare @AfterLastDot varchar(360); 
declare @AfterArobase varchar(360); 
declare @BeforeArobase varchar(360); 
declare @HasDomainTooLong bit=0; 

--Control des longueurs et autres incoherence 
set @AfterLastDot=REVERSE(SUBSTRING(REVERSE(@EmailAddr),0,CHARINDEX('.',REVERSE(@EmailAddr)))); 
if len(@AfterLastDot) not between 2 and 17 
RETURN(0); 

set @AfterArobase=REVERSE(SUBSTRING(REVERSE(@EmailAddr),0,CHARINDEX('@',REVERSE(@EmailAddr)))); 
if len(@AfterArobase) not between 2 and 255 
RETURN(0); 

select top 1 @BeforeArobase=value from string_split(@EmailAddr, '@'); 
if len(@AfterArobase) not between 2 and 255 
RETURN(0); 

--Controle sous-domain pas plus grand que 63 
select top 1 @HasDomainTooLong=1 from string_split(@AfterArobase, '.') where LEN(value)>63 
if @HasDomainTooLong=1 
return(0); 

--Control de la partie locale en detail 
SELECT @AlphabetPlus = 'abcdefghijklmnopqrstuvwxyz!#$%&‘*+-/=?^_`.{|}~' 
    , @Max = LEN(@BeforeArobase) 
    , @Pos = 0 
    , @OK = 1 


WHILE @Pos < @Max AND @OK = 1 BEGIN 
    SET @Pos = @Pos + 1 
    IF @AlphabetPlus NOT LIKE '%' + SUBSTRING(@BeforeArobase, @Pos, 1) + '%' 
     SET @OK = 0 
END 

if @OK=0 
RETURN(0); 

--Control de la partie domaine en detail 
SELECT @AlphabetPlus = 'abcdefghijklmnopqrstuvwxyz-.' 
    , @Max = LEN(@AfterArobase) 
    , @Pos = 0 
    , @OK = 1 

WHILE @Pos < @Max AND @OK = 1 BEGIN 
    SET @Pos = @Pos + 1 
    IF @AlphabetPlus NOT LIKE '%' + SUBSTRING(@AfterArobase, @Pos, 1) + '%' 
     SET @OK = 0 
END 

if @OK=0 
RETURN(0); 







return(1); 



END 
0

znajdę to podejście bardziej intuicyjny:

CREATE FUNCTION [dbo].[ContainsVailidEmail] (@Input varchar(250)) 
RETURNS bit 
AS 
BEGIN 
    RETURN CASE 
    WHEN @Input LIKE '%[email protected]__%.__%' THEN 1 
    ELSE 0 
    END 
END 

Nazywam to za pomocą następujących:

SELECT [dbo].[ContainsVailidEmail] (Email) FROM [dbo].[User] 

LUB

Jeśli zamierzasz tylko dlaczego nie go używać to raz a następnie jako komputerowej Kolumna o następującej specyfikacji:

(case when [Email] like '%[email protected]__%.__%' then (1) else (0) end) 

Następnie można po prostu używać go bez konieczności aby wywołać funkcję.

0

proponuję mój funkcji:

CREATE FUNCTION [REC].[F_IsEmail] (
@EmailAddr varchar(360) -- Email address to check 
) RETURNS BIT -- 1 if @EmailAddr is a valid email address 

AS BEGIN 
DECLARE @AlphabetPlus VARCHAR(255) 
     , @Max INT -- Length of the address 
     , @Pos INT -- Position in @EmailAddr 
     , @OK BIT -- Is @EmailAddr OK 
-- Check basic conditions 
IF @EmailAddr IS NULL 
    OR @EmailAddr NOT LIKE '[0-9a-zA-Z]%@__%.__%' 
    OR @EmailAddr LIKE '%@%@%' 
    OR @EmailAddr LIKE '%..%' 
    OR @EmailAddr LIKE '%[email protected]' 
    OR @EmailAddr LIKE '%@.' 
    OR @EmailAddr LIKE '%@%.-%' 
    OR @EmailAddr LIKE '%@%-.%' 
    OR @EmailAddr LIKE '%@-%' 
    OR CHARINDEX(' ',LTRIM(RTRIM(@EmailAddr))) > 0 
     RETURN(0) 



declare @AfterLastDot varchar(360); 
declare @AfterArobase varchar(360); 
declare @BeforeArobase varchar(360); 
declare @HasDomainTooLong bit=0; 

--Control des longueurs et autres incoherence 
set @AfterLastDot=REVERSE(SUBSTRING(REVERSE(@EmailAddr),0,CHARINDEX('.',REVERSE(@EmailAddr)))); 
if len(@AfterLastDot) not between 2 and 17 
RETURN(0); 

set @AfterArobase=REVERSE(SUBSTRING(REVERSE(@EmailAddr),0,CHARINDEX('@',REVERSE(@EmailAddr)))); 
if len(@AfterArobase) not between 2 and 255 
RETURN(0); 

select top 1 @BeforeArobase=value from string_split(@EmailAddr, '@'); 
if len(@AfterArobase) not between 2 and 255 
RETURN(0); 

--Controle sous-domain pas plus grand que 63 
select top 1 @HasDomainTooLong=1 from string_split(@AfterArobase, '.') where LEN(value)>63 
if @HasDomainTooLong=1 
return(0); 

--Control de la partie locale en detail 
SELECT @AlphabetPlus = 'abcdefghijklmnopqrstuvwxyz!#$%&‘*+-/=?^_`.{|}~' 
    , @Max = LEN(@BeforeArobase) 
    , @Pos = 0 
    , @OK = 1 


WHILE @Pos < @Max AND @OK = 1 BEGIN 
    SET @Pos = @Pos + 1 
    IF @AlphabetPlus NOT LIKE '%' + SUBSTRING(@BeforeArobase, @Pos, 1) + '%' 
     SET @OK = 0 
END 

if @OK=0 
RETURN(0); 

--Control de la partie domaine en detail 
SELECT @AlphabetPlus = 'abcdefghijklmnopqrstuvwxyz-.' 
    , @Max = LEN(@AfterArobase) 
    , @Pos = 0 
    , @OK = 1 

WHILE @Pos < @Max AND @OK = 1 BEGIN 
    SET @Pos = @Pos + 1 
    IF @AlphabetPlus NOT LIKE '%' + SUBSTRING(@AfterArobase, @Pos, 1) + '%' 
     SET @OK = 0 
END 

if @OK=0 
RETURN(0); 

return(1); 

END 
Powiązane problemy