Да, вы можете сделать это.По крайней мере, для SMTP.И ... вы можете легко отправить электронное письмо конкретному пользователю ....
Объяснение того, как клиент отправляет электронное письмо
Когда клиент электронной почты отправляется, чтобы отправить электронное письмо,следующие шаги:
Извлекает часть сообщения электронной почты, относящуюся к домену, например, "gmail.com" и "bob@gmail.com"
Он проверяет, есть ли опубликованная запись DNS, называемая Mail Exchange или MX.Запись 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.
Если существует запись MX, клиент пытается установить соединение порта 25 с указанным сервером.В этом примере мы будем использовать
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
.
Большинство почтовых клиентов используют оппортунистический TLS, то есть, если сервер предлагает TLS, он будет использовать его, если нет, то не будет.Чтобы определить, предлагает ли сервер TLS, нам нужно выполнить команду EHLO.Это расширенный SMTP Hello.Нам нужна команда
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.
Мы видим, что SMTP-серверы для домена gmail.com
действительно предлагаютTLS.
Я не собираюсь объяснять оставшуюся часть SMTP-разговора, но вы можете найти его в Google ...:)
Решение для ответа на эти вопросы с помощью PHP
"существует ли общедоступная база данных, где я могу программно искать информацию о соединении для своего почтового сервера"
- Да, база данных - это
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"
}
Вы можете просмотреть результаты и ответить на вопрос "Как я могу узнать, еслипочтовый сервер - это домен, отличный от суффикса электронной почты ".
«А как насчет порта и протокола безопасности?»Порт всегда 25. Вот почему у нас есть определения протоколов.Протокол безопасности немного сложнее ...
В основном, если вы хотите знать такие вещи, как;протокол, шифр, центр сертификации и т. д. ... вам нужно использовать библиотеку OpenSSL ... или просто разобрать open для openssl s_client
... Это сделало бы это очень длинным ответом, если бы я здесь также рассмотрел бит TLS... но ... запустите это в оболочке и проверьте вывод:
openssl s_client -connect gmail-smtp-in.l.google.com:25 -starttls smtp
Это в основном просто обрабатывает рукопожатие TLS с сервером и выплевывает всю необходимую информацию,PHP имеет библиотеки OpenSSL, так что вы можете использовать их из PHP ...
Отправка электронной почты другому пользователю
По сути, если сервер электронной почты не реализует SPF чего-то подобного, вы можете«подделать» отправителя, т.е. положить все, что вы хотите, в команду mail from
.Это очень распространенная практика, однако некоторые почтовые серверы блокируют пародию.Есть вещи, которые вы можете сделать, чтобы повысить вероятность получения ваших писем.