【问题标题】:Validate email address will be accepted by sp_send_dbmail?验证电子邮件地址是否会被 sp_send_dbmail 接受?
【发布时间】:2021-03-05 06:42:16
【问题描述】:

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

我查看了诸如this one 之类的其他问题,这是非常有效的,直到用户从 Outlook 复制他们的电子邮件地址并通过像 Jane Doe <DoeJ@xdomain.com> 这样的问题,但无法通过系统进程发送。

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

【问题讨论】:

    标签: tsql


    【解决方案1】:

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

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

    来源:Valid Email Address Check with TSQL

    【讨论】:

    • 很遗憾,我的服务器上没有 STRING_SPLIT。
    • @dya,你使用的是什么 SQL Server?
    • SQL Server 2017
    • 兼容级别 110。我无法更改(DBA 也不允许更改)。
    • 呵呵,我找到了办法。您的解决方案似乎很有效,谢谢!
    【解决方案2】:

    @tontonsevilla 很棒的解决方案,我只是对其进行了一些修改以删除中间表并替换可能出现的任何换行符(就像复制您的解决方案一样):

    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';
    
    DECLARE @ValidEmailList VARCHAR(MAX);
    
    SELECT  @ValidEmailList = COALESCE(@ValidEmailList + ';', '') + [x].[Email]
    FROM    (
                SELECT  TRIM(REPLACE(REPLACE([value], CHAR(10), ''), CHAR(13), '')) [Email]
                FROM    STRING_SPLIT(@EmailList, ';')
                WHERE   LEN([value]) > 4
                        AND CHARINDEX(' ', TRIM([value])) = 0
                        AND TRIM([value])NOT LIKE ('%["(),:;<>\]%')
                        AND SUBSTRING(TRIM([value]), CHARINDEX('@', TRIM([value])), LEN(TRIM([value])))NOT LIKE ('%[!#$%&*+/=?^`_{|]%')
                        AND LEFT(TRIM([value]), 1)NOT LIKE ('[-_.+]')
                        AND RIGHT(TRIM([value]), 1)NOT LIKE ('[-_.+]')
                        AND TRIM([value])NOT LIKE '%[%'
                        AND TRIM([value])NOT LIKE '%]%'
                        AND TRIM([value])NOT LIKE '%@%@%'
                        AND TRIM([value]) LIKE '_%@_%._%'
            ) [x];
    
    SELECT  @ValidEmailList;
    

    【讨论】:

      猜你喜欢
      • 2016-06-24
      • 2012-10-30
      • 2011-08-22
      • 2014-06-12
      • 1970-01-01
      • 2012-07-27
      • 2011-03-04
      • 2011-02-14
      相关资源
      最近更新 更多