【问题标题】:How to check if a received email is legit?如何检查收到的电子邮件是否合法?
【发布时间】:2024-04-28 14:25:05
【问题描述】:

我正在开发一个从 PIPE 获取电子邮件的系统,验证从电子邮件发送的电子邮件地址是否在客户端数据库中,并将其写入数据库。

问题是我不想有安全问题,如果有人用 PHP 向系统发送电子邮件,它也会记录下来。那么,如何检查电子邮件是否由正确的邮件服务器发送?我正在考虑获取域的邮件服务器的 IP,并在电子邮件标头中验证它是否是从这些服务器发送的。因此,如果我收到来自 test@hotmail.com 的电子邮件,它会 ping mail.hotmail.com 并检查电子邮件是否来自这些 IP 地址。

无论如何,如果有人有一个像 yourdomain.com 这样的自定义域,在共享的 cPanel 服务器中运行,这些服务器中的其他人可以使用 PHP 发送电子邮件并通过 IP 验证。因此,我正在考虑检查电子邮件是使用 PHP 发送还是从邮件服务器发送的,但我不知道该怎么做。

你有什么建议?

【问题讨论】:

  • Sender Policy Framework (SPF)DomainKeys Identified Mail (DKIM) 浮现在脑海中。您还需要更多建议吗?
  • 我去看看,让你知道。感谢您的帮助。
  • 如果您的问题是针对两个 mail() 和邮件服务器之间的特定问题,请参阅下面的回答。最好使用 SPF 和 DKIM,并根据这些进行一些评级。您的邮件服务器也可能在这里做一些工作,为传入的消息添加标题,这样您就不需要重新发明*了。

标签: php email pipe


【解决方案1】:

我正在考虑检查电子邮件是使用 PHP 发送的还是从邮件服务器发送的

您将无法正常找出这两者之间的区别。并且使用 PHP 发送的电子邮件看起来与来自邮件服务器的电子邮件完全相同,并且使用 PHP 发送的电子邮件很可能也是来自邮件服务器的电子邮件。

您可以尝试根据您所做的监控编写自己的检测(您自己的过滤器)并找出错误邮件(或者如果您因法律法规而无法深入监控电子邮件,则从您的用户那里报告的邮件) )。

【讨论】:

    【解决方案2】:

    我为你找到了http://verify-email.org/。他们有一个 API,因此您可以通过该服务检查电子邮件地址。

    编辑

    当您在网站上查看电子邮件地址时,您会看到以下结果:

    MX record about gmail.com exists.
    Connection succeeded to alt3.gmail-smtp-in.l.google.com SMTP.
    220 mx.google.com ESMTP tz3si2159695bkb.62 - gsmtp
    
    > HELO verify-email.org 
    250 mx.google.com at your service
    
    > MAIL FROM: <check@verify-email.org>
    =250 2.1.0 OK tz3si2159695bkb.62 - gsmtp
    
    > RCPT TO: <test@gmail.com>
    =550-5.1.1 The email account that you tried to reach does not exist. Please try
    
    550-5.1.1 double-checking the recipient's email address for typos or
    
    550-5.1.1 unnecessary spaces. Learn more at
    
    550 5.1.1 http://support.google.com/mail/bin/answer.py?answer=6596 tz3si2159695bkb.62 - gsmtp
    

    您可以通过登录 smtp 服务器并发送您在上面看到的命令来构建自己的检查:

    > HELO verify-email.org
    > MAIL FROM: <check@verify-email.org>
    > RCPT TO: <test@gmail.com>
    

    您可以在获得的输出中检查错误或成功消息。我觉得用php构建并不难。

    【讨论】:

    • API俗称DNS和SMTP。如果您考虑回答这个问题,您应该更好地解释如何使用 PHP 代码自己执行此操作。另请参阅meta.stackexchange.com/questions/8231/…
    • 我不能使用付费服务,因为我不会是唯一使用它的人,我也不能要求使用它的人购买它。不过谢谢你的帮助。
    • 通过添加关于我认为该网站如何检查电子邮件的解释来编辑我的答案。
    【解决方案3】:

    呃,如果我误解了,这是我第一次回答任何非常抱歉的问题。无论如何,如果您正在使用 PHP 检查电子邮件,我有一些可以提供帮助的东西;

    If($_POST['email']){
        $Email = $_POST['email'];
        $Allowed = array('gmail.com', 'yahoo.com', 'ymail.com', etc..);
        If(filter_var($Email, FILTER_VALIDATE_EMAIL)){
            $Domain = array_pop(explode('@', $Email));
            If(!In_Array($Domain, $Allowed)){
                Echo 'Your response here...'; 
    }}}
    

    或者为了检查邮件的字符,你可以调用一个函数或者自己检查;

    Function checkEmail($Email){
        return preg_match("/^[\.A-z0-9_\-\+]+[@][A-z0-9_\-]+([.][A-z0-9_\-]+)+[A-z]{1,4}$/", $Email);
    }
    

    所以应该是这样的;

    checkEmail('email@domain.com');
    

    检查输入,如果没有电子邮件字符,你可以选择做什么。

    希望这有帮助!

    【讨论】:

      【解决方案4】:

      是的,市面上有很多电子邮件验证工具。我个人喜欢www.verifyemailaddress.org

      但是有很多这样的工具可以找到。

      【讨论】:

        最近更新 更多