首页 > 解决方案 > 验证电子邮件地址是否会被 sp_send_dbmail 接受?

问题描述

如何验证文本字符串是 sp_send_dbmail 函数接受的有效电子邮件地址?

我已经查看了类似这个的其他问题,这很好,直到用户从 Outlook 复制他们的电子邮件地址并通过 like Jane Doe <DoeJ@xdomain.com>,它无法通过系统 proc 发送。

我还希望用户能够在一个用分号分隔的字符串中提供多封电子邮件,这些电子邮件被 sp_send_dbmail 接受。谢谢!

标签: tsql

解决方案


你可以试试这个(还有其他方法),

--PARAM:START
DECLARE @EmailList varchar(max);

SET @EmailList = 'Jane Doe <DoeJ@xdomain.com>;info.support@mssqltips.com;.info@mssqltips.com;
info..@mssqltips.com;info@mssqltips.c;info@support@mssqltips.com;info.support@mssql_tips.com;
+info@mssqltips.com;info Support@mssqltips.com;info@mssql tips.com;NULL;22@mssqltips.com;@mssqltips.com';
--PARAM:END

--VALIDATION:START
DECLARE @EmailTable TABLE
(
    Email varchar(max),
    IsValid bit
);

INSERT INTO @EmailTable(Email, IsValid)
SELECT LTRIM(RTRIM(value))
,CASE WHEN LTRIM(RTRIM(value)) = '' THEN 0
        WHEN LTRIM(RTRIM(value)) LIKE '% %' THEN 0
        WHEN LTRIM(RTRIM(value)) LIKE ('%["(),:;<>\]%') THEN 0
        WHEN SUBSTRING(LTRIM(RTRIM(value)),CHARINDEX('@',LTRIM(RTRIM(value))),LEN(LTRIM(RTRIM(value)))) LIKE ('%[!#$%&*+/=?^`_{|]%') THEN 0
        WHEN (LEFT(LTRIM(RTRIM(value)),1) LIKE ('[-_.+]') OR RIGHT(LTRIM(RTRIM(value)),1) LIKE ('[-_.+]')) THEN 0                                                                                    
        WHEN (LTRIM(RTRIM(value)) LIKE '%[%' or LTRIM(RTRIM(value)) LIKE '%]%') THEN 0
        WHEN LTRIM(RTRIM(value)) LIKE '%@%@%' THEN 0
        WHEN LTRIM(RTRIM(value)) NOT LIKE '_%@_%._%' THEN 0
        ELSE 1 
    END
FROM STRING_SPLIT(@EmailList, ';');
--VALIDATION:END

--GET VALID EMAIL
DECLARE @ValidEmailList varchar(max);

SELECT @ValidEmailList = COALESCE(@ValidEmailList + ', ', '') + Email
FROM @EmailTable
WHERE IsValid = 1;

--DO SENDING OF EMAIL USING ValidEmailList

来源:使用 TSQL 进行有效电子邮件地址检查


推荐阅读