如何以编程方式查找电子邮件服务器信息

时间:2018-05-13 22:39:18

标签: php email

如果用户提供电子邮件,让我们说类似hello.world@example.com,是否有公共数据库,我可以通过编程方式查找其邮件服务器的连接信息(我的服务会让用户提供一封电子邮件,然后允许我的软件从它发送自动电子邮件。)

如何以编程方式查看其服务器是pop3,Imap还是smtp。那么端口和安全协议(tls还是ssl)呢?

如何判断邮件服务器是否与电子邮件的后缀不同。 (即用户正在使用共享主机。)

此服务是否只有付费选项?

注意:解决方案最好是使用PHP,甚至更好的是http REST服务。

3 个答案:

答案 0 :(得分:0)

这不可能以编程方式进行。我不知道任何维护良好的API提供此服务,但您可以通过使用主要电子邮件提供程序(gmail,hotmail等)设置预填充数据库表来生成自己的使用。有一个列表,例如在这里:https://domar.com/smtp_pop3_server

如果您的用户有不同的提供商,您可以尝试一些有根据的猜测,例如: smtp.domain.commail.domain.com或您可以使用PHP函数getmxrr并尝试连接到MX服务器,因为一些较小的提供商将使用相同的服务器用于MX和SMTP(这不是保证但是,首先尝试其他人。)

当我说“尝试”时,我的意思是使用PHP sockets连接到例如正在检查的域上的端口25(用于SMTP),并检查您是否收到有效的响应。

您的最终后备将要求用户自己提供详细信息。

答案 1 :(得分:0)

是的,你可以这样做。至少对于SMTP。并且......您可以轻松地以特定用户身份发送电子邮件....

客户端如何发送电子邮件的说明

当电子邮件客户端发送电子邮件时,执行以下步骤:

  1. 它提取电子邮件的域部分部分,例如" gmail.com"给出" bob@gmail.com"

  2. 检查是否发布了名为Mail Exchange或MX记录的DNS记录。 MX记录包含以下信息:

    • 生存时间,即记录对

    • 有效的时间
    • 权重,即客户端应尝试连接的顺序。从最低到最高

    • 服务器A记录或IP地址。

  3. 您可以使用dignslookup命令查询为域发布的MX记录。

    示例:

    root@dib:~# nslookup -querytype=mx gmail.com
    Server:         172.31.0.2
    Address:        172.31.0.2#53
    
    Non-authoritative answer:
    gmail.com       mail exchanger = 10 alt1.gmail-smtp-in.l.google.com.
    gmail.com       mail exchanger = 20 alt2.gmail-smtp-in.l.google.com.
    gmail.com       mail exchanger = 30 alt3.gmail-smtp-in.l.google.com.
    gmail.com       mail exchanger = 40 alt4.gmail-smtp-in.l.google.com.
    gmail.com       mail exchanger = 5 gmail-smtp-in.l.google.com.
    
    Authoritative answers can be found from:
    
    root@dib:~# dig +short MX gmail.com
    40 alt4.gmail-smtp-in.l.google.com.
    5 gmail-smtp-in.l.google.com.
    10 alt1.gmail-smtp-in.l.google.com.
    20 alt2.gmail-smtp-in.l.google.com.
    30 alt3.gmail-smtp-in.l.google.com.
    
    1. 如果有MX记录,客户端会尝试与列出的服务器建立端口25连接。在此示例中,我们将使用gmail-smtp-in.l.google.com。快速测试是检查连接时是否显示横幅。
    2. 使用telnet的示例:

      root@dib:~# telnet gmail-smtp-in.l.google.com 25
      Trying 74.125.197.27...
      Connected to gmail-smtp-in.l.google.com.
      Escape character is '^]'.
      220 mx.google.com ESMTP m8-v6si7680016plt.29 - gsmtp
      quit
      221 2.0.0 closing connection m8-v6si7680016plt.29 - gsmtp
      Connection closed by foreign host.
      

      横幅是220 mx.google.com ESMTP b8-v6si8705269pls.261 - gsmtp部分。

      1. 大多数电子邮件客户端使用机会性TLS,即,如果服务器提供TLS,它将使用它,如果不是,它就不会使用它。要确定服务器是否提供TLS,我们需要发出EHLO命令。这是扩展的SMTP Hello。我们要找的是提供STARTTLS命令。
      2. 示例:

        root@dib:~# telnet gmail-smtp-in.l.google.com 25
        Trying 74.125.197.27...
        Connected to gmail-smtp-in.l.google.com.
        Escape character is '^]'.
        220 mx.google.com ESMTP s83-v6si8350062pfg.175 - gsmtp
        ehlo stackoverflow.com
        250-mx.google.com at your service, [123.123.123.123]
        250-SIZE 157286400
        250-8BITMIME
        250-STARTTLS
        250-ENHANCEDSTATUSCODES
        250-PIPELINING
        250-CHUNKING
        250 SMTPUTF8
        quit
        221 2.0.0 closing connection s83-v6si8350062pfg.175 - gsmtp
        Connection closed by foreign host.
        

        我们可以看到域gmail.com的SMTP服务器确实提供了TLS。

        1. 我不打算解释其余的SMTP会话,但你可以谷歌......:)
        2. 使用PHP

          回答这些问题的解决方案
          1. "是否有公共数据库,我可以编程方式查找其邮件服务器的连接信息"

            • 是的,数据库是Domain Name System。有很多方法可以做到;但是,PHP有一个漂亮的内置功能。它是getmxrr()
          2. 示例:

            root@dib:~# cat mxrecord.php
            <?php
            $email_addr = "bob@gmail.com";
            list($local, $domain) = explode('@', $email_addr);
            
            getmxrr($domain, $mxrecords); // http://php.net/manual/en/function.getmxrr.php
            
            var_dump($mxrecords);
            ?>
            root@dib:~# php mxrecord.php
            array(5) {
              [0]=>
              string(26) "gmail-smtp-in.l.google.com"
              [1]=>
              string(31) "alt1.gmail-smtp-in.l.google.com"
              [2]=>
              string(31) "alt2.gmail-smtp-in.l.google.com"
              [3]=>
              string(31) "alt3.gmail-smtp-in.l.google.com"
              [4]=>
              string(31) "alt4.gmail-smtp-in.l.google.com"
            }
            

            您可以循环搜索结果并回答问题&#34;如何判断邮件服务器是否与电子邮件的后缀不同?#/ p>

            1. &#34;端口和安全协议怎么样?&#34;端口始终为25.这就是我们有协议定义的原因。安全协议有点棘手......
            2. 基本上,如果你想知道这样的事情;协议,密码,证书颁发机构等...您需要使用OpenSSL库...或者只需解析开放的openssl s_client ...如果我在这里覆盖TLS位,这将使这个答案真的很长也......但是...在shell中运行并检查输出:

              openssl s_client -connect gmail-smtp-in.l.google.com:25 -starttls smtp

              这基本上只处理与服务器的TLS握手并吐出您想要的所有信息。 PHP有OpenSSL库,因此您可以使用PHP中的那些...

              以其他用户身份发送电子邮件

              基本上,除非电子邮件服务器实现某种类似的SPF,否则你可以欺骗&#34;发件人,即在mail from命令中放置您想要的任何内容。这是一种非常常见的做法,但是,某些电子邮件服务器会阻止欺骗。您可以采取一些措施来使您的电子邮件更容易被接收。

答案 2 :(得分:0)

false,这些答案适用于传入 smtp 服务器,对于传出 smtp 服务器,您需要检查邮件提供商设置 *可能是您的同一托管服务提供商或第 3 方邮件提供商