Postgres功能验证电子邮件地址

Nic*_*net 8 postgresql

调用函数来验证电子邮件地址的检查约束对我来说效果不佳.

CREATE OR REPLACE FUNCTION f_IsValidEmail(text) returns BOOLEAN AS 
'select $1 ~ ''^[^@\s]+@[^@\s]+(\.[^@\s]+)+$'' as result
' LANGUAGE sql;



SELECT f_IsValidEmail('myemail@address.com');
Run Code Online (Sandbox Code Playgroud)

该函数返回false,应为true.我尝试了其他几个正则表达式但是徒劳无功.任何人都可以指出这个功能有什么问题吗?

截图

Eva*_*oll 14

一堆这些答案接近正确的方式.这些是我提交的要点.

  • 您想使用域 - 而不是规则系统.
  • 不想使用正则表达式验证这些电子邮件地址.(2017年3月更新:不再是真的了)

在DBA.StackExchange.com上展示了如何正确执行此操作的两种方法.两者都要检查MX记录,还要使用HTML5规范.这是短暂而甜蜜的.

CREATE EXTENSION citext;
CREATE DOMAIN email AS citext
  CHECK ( value ~ '^[a-zA-Z0-9.!#$%&''*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$' );

SELECT 'foobar@bar.com'::email;
SELECT CAST('foobar@bar.com' AS email);
Run Code Online (Sandbox Code Playgroud)

有关更多信息,我强烈建议您完整阅读答案.在答案中,我还展示了如何创建一个DOMAIN结束Email::Valid,并解释为什么我不再使用该方法.


Sco*_*owe 10

在你付出很多努力之前,你要做的就是确保你没有踢出有效的电子邮件地址.可以或不能在电子邮件地址中存在各种疯狂规则,如果您错误地指出错误的方向,那么具有完全有效电子邮件地址的用户可能会被您的系统拒绝.

确定电子邮件地址是否有效的最佳方法是将其用作需要电子邮件的注册过程的一部分.其他任何事情都是很多工作,收获甚微.

  • 我不同意这个答案.对电子邮件地址进行硬性验证是最全面的电子邮件验证方法.这也是最不实用的.你想要的是一个自定义Postgres域,不会排除一个有效的电子邮件地址.那么你只想验证通过那个非常低的条的那些.这允许您立即丢弃垃圾,并请求用户澄清,而不会使用明显的垃圾邮件轰炸您的邮件服务器.演示:http://stackoverflow.com/a/22671557/124486 (4认同)

Pet*_*aut 5

我推荐使用 PL/Perl 和 Email::Address 模块的解决方案。像下面这样:

CREATE OR REPLACE FUNCTION email_valid(email text) RETURNS bool
LANGUAGE plperlu
AS $$
use Email::Address;
my @addresses = Email::Address->parse($_[0]);
return scalar(@addresses) > 0 ? 1 : 0;
$$;
Run Code Online (Sandbox Code Playgroud)

另请参阅http://wiki.postgresql.org/wiki/Email_address_parsing