tsql - 验证电子邮件地址是否会被 sp_send_dbmail 接受?
问题描述
如何验证文本字符串是 sp_send_dbmail 函数接受的有效电子邮件地址?
我已经查看了类似这个的其他问题,这很好,直到用户从 Outlook 复制他们的电子邮件地址并通过 like Jane Doe <DoeJ@xdomain.com>
,它无法通过系统 proc 发送。
我还希望用户能够在一个用分号分隔的字符串中提供多封电子邮件,这些电子邮件被 sp_send_dbmail 接受。谢谢!
解决方案
你可以试试这个(还有其他方法),
--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
推荐阅读
- c# - C#(视觉工作室 2019)。通过单击按钮动态创建的对象。该对象必须在另一个 usercontrol.cs 中创建
- python - Python通过在数组中循环逐一插入值
- git - 将现有项目添加到 github 并获得“* [新分支] master -> master”
- javascript - 尝试将 Vue 组件集成到我的 React 应用程序中
- python - 循环列表并根据字符串条件返回新的整数值
- python - 从零开始的神经网络 X = P(X)
- angular - Angular 11异步验证器触发真实响应的无限循环请求
- python - 全局变量 vs getter 函数 vs 函数变量
- python - python条件检查中的str(None)
- windows - 使用命令行从一系列图像创建视频