如果用户提供电子邮件,让我们说类似hello.world@example.com,是否有公共数据库,我可以通过编程方式查找其邮件服务器的连接信息(我的服务会让用户提供一封电子邮件,然后允许我的软件从它发送自动电子邮件。)
如何以编程方式查看其服务器是pop3,Imap还是smtp。那么端口和安全协议(tls还是ssl)呢?
如何判断邮件服务器是否与电子邮件的后缀不同。 (即用户正在使用共享主机。)
此服务是否只有付费选项?
注意:解决方案最好是使用PHP,甚至更好的是http REST服务。
答案 0 :(得分:0)
这不可能以编程方式进行。我不知道任何维护良好的API提供此服务,但您可以通过使用主要电子邮件提供程序(gmail,hotmail等)设置预填充数据库表来生成自己的使用。有一个列表,例如在这里:https://domar.com/smtp_pop3_server
如果您的用户有不同的提供商,您可以尝试一些有根据的猜测,例如: smtp.domain.com
,mail.domain.com
或您可以使用PHP函数getmxrr并尝试连接到MX服务器,因为一些较小的提供商将使用相同的服务器用于MX和SMTP(这不是保证但是,首先尝试其他人。)
当我说“尝试”时,我的意思是使用PHP sockets连接到例如正在检查的域上的端口25(用于SMTP),并检查您是否收到有效的响应。
您的最终后备将要求用户自己提供详细信息。
答案 1 :(得分:0)
是的,你可以这样做。至少对于SMTP。并且......您可以轻松地以特定用户身份发送电子邮件....
当电子邮件客户端发送电子邮件时,执行以下步骤:
它提取电子邮件的域部分部分,例如" gmail.com"给出" bob@gmail.com"
检查是否发布了名为Mail Exchange或MX记录的DNS记录。 MX记录包含以下信息:
生存时间,即记录对
权重,即客户端应尝试连接的顺序。从最低到最高
服务器A记录或IP地址。
您可以使用dig
或nslookup
命令查询为域发布的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.
gmail-smtp-in.l.google.com
。快速测试是检查连接时是否显示横幅。 使用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
部分。
STARTTLS
命令。示例:
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。
"是否有公共数据库,我可以编程方式查找其邮件服务器的连接信息"
Domain Name System
。有很多方法可以做到;但是,PHP有一个漂亮的内置功能。它是getmxrr()
。示例:
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>
基本上,如果你想知道这样的事情;协议,密码,证书颁发机构等...您需要使用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 方邮件提供商