Как программно искать информацию о почтовом сервере - PullRequest
0 голосов
/ 14 мая 2018

Если пользователь отправляет электронное письмо, скажем, что-то вроде hello.world@example.com, есть ли общедоступная база данных, где я могу программно искать информацию о соединении для своего почтового сервера (мой сервис позволил бы пользователю предоставить электронное письмо, котороезатем позволил бы моему программному обеспечению отправлять автоматические электронные письма с него.)

Как я могу узнать, является ли их сервер программным pop3, Imap или smtp.Как насчет порта и протокола безопасности (tls или ssl)?

Как узнать, является ли почтовый сервер другим доменом, чем суффикс электронной почты?(Т. Е. Пользователь использует виртуальный хостинг.)

Есть ли только платные опции для этой услуги?

Примечание: предпочтительно, чтобы решение было на PHP или, что еще лучше, на http RESTсервис.

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Да, вы можете сделать это.По крайней мере, для SMTP.И ... вы можете легко отправить электронное письмо конкретному пользователю ....

Объяснение того, как клиент отправляет электронное письмо

Когда клиент электронной почты отправляется, чтобы отправить электронное письмо,следующие шаги:

  1. Извлекает часть сообщения электронной почты, относящуюся к домену, например, "gmail.com" и "bob@gmail.com"

  2. Он проверяет, есть ли опубликованная запись 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

  1. "существует ли общедоступная база данных, где я могу программно искать информацию о соединении для своего почтового сервера"

    • Да, база данных - это 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.Это очень распространенная практика, однако некоторые почтовые серверы блокируют пародию.Есть вещи, которые вы можете сделать, чтобы повысить вероятность получения ваших писем.

0 голосов
/ 14 мая 2018

Это не возможно программно. Я не знаю ни одного хорошо поддерживаемого API-интерфейса, предоставляющего эту услугу, но вы можете создать свое собственное использование, предварительно заполнив таблицу базы данных настройками основного поставщика электронной почты (gmail, hotmail и т. Д.). Есть список, например здесь: https://domar.com/smtp_pop3_server

Если у вашего пользователя есть другой провайдер, вы можете попробовать некоторые обоснованные предположения, например, smtp.domain.com, mail.domain.com или вы можете использовать функцию PHP getmxrr и попытаться подключиться к серверу MX, поскольку некоторые более мелкие провайдеры будут использовать один и тот же сервер для MX и SMTP (хотя это не является гарантией, следовательно, сначала попробую другие).

Когда я говорю «попробуй», я имею в виду использование PHP-сокетов для подключения, например, к. порт 25 (для SMTP) в исследуемом домене и проверка, если вы получаете правильный ответ.

Ваш последний запасной вариант - попросить пользователей самим сообщить подробности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...