Всем салют!
Стоит задача делать точечную рассылку по скромному списку компаний (до пяти компаний в неделю). Количество адресов 100-150 писем максимум на один корп. Майлы добываются OSINTом с разных мест. В том числе составлением адресов по известным именам сотрудников и формата построения логина в почтовом адресе.
Возник вопрос определения валидности таких адресов. Понятно что можно шерстить соцсети и вычленять активных сотрудников компании. Также можно воспользоваться специальными ресурсами вроде Hunter.io. Только анализ соц сетей это долго, а ресурсы осинта дают неточный результат. Может конечно я использую неверные сервисы. Пока остановился на результатах выдачи osintframework[.]com Буду рад если кто то поделится дельной ссылко по этому вопросу.
Изучение технической стороны вопроса в первом приближении показало что вся фишка в обращении непосредственно к почтовому серверу. Зная домен, мы спрашиваем у сервера есть ли у него интересующий нас почтовый адрес. Когда тебе надо проверить пяток почт - это нормально. А если на серв прилетает куча запросов с просьбой рассказать про все майлы корпа?)) Такое на мой вгляд может выглядеть подозрительно.
ЧатЖэПэТэ показал такой код на GO:
Тут метод conn.Rcpt(email) как раз и определяет валидность адреса. При работе метода происходит обращение на сервер получателя с вопросом, сможет ли он обработать данные для указанного пользователя. Использование этого метода несколько раз для разных адресов даже не возбраняется.
Правда серв может брехать про валидность адреса, если что то не понравится в запросе
Думаю поэтому сервисы и дают неточные результаты.
Подведу итог своей писанины.
Не подозрительно ли заваливать серв запросами валидности адресов? Или мои объёмы мизер для хостера типа мелкомягких? Существует ли какой то точный технический метод определения валидности адресов сопоставимый по точности с копанием соцсетей?
Стоит задача делать точечную рассылку по скромному списку компаний (до пяти компаний в неделю). Количество адресов 100-150 писем максимум на один корп. Майлы добываются OSINTом с разных мест. В том числе составлением адресов по известным именам сотрудников и формата построения логина в почтовом адресе.
Возник вопрос определения валидности таких адресов. Понятно что можно шерстить соцсети и вычленять активных сотрудников компании. Также можно воспользоваться специальными ресурсами вроде Hunter.io. Только анализ соц сетей это долго, а ресурсы осинта дают неточный результат. Может конечно я использую неверные сервисы. Пока остановился на результатах выдачи osintframework[.]com Буду рад если кто то поделится дельной ссылко по этому вопросу.
Изучение технической стороны вопроса в первом приближении показало что вся фишка в обращении непосредственно к почтовому серверу. Зная домен, мы спрашиваем у сервера есть ли у него интересующий нас почтовый адрес. Когда тебе надо проверить пяток почт - это нормально. А если на серв прилетает куча запросов с просьбой рассказать про все майлы корпа?)) Такое на мой вгляд может выглядеть подозрительно.
ЧатЖэПэТэ показал такой код на GO:
Код:
package main
import (
"fmt"
"net"
"net/smtp"
"regexp"
)
// Проверка формата адреса электронной почты
func isValidEmail(email string) bool {
re := regexp.MustCompile(^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,}$)
return re.MatchString(email)
}
// Получение MX-записей для домена
func getMXRecords(domain string) ([]*net.MX, error) {
return net.LookupMX(domain)
}
// Проверка существования адреса электронной почты
func checkEmail(email string) (bool, error) {
if !isValidEmail(email) {
return false, fmt.Errorf("недопустимый формат адреса электронной почты")
}
// Разделение адреса на локальную часть и домен
parts := regexp.MustCompile("@").Split(email, 2)
if len(parts) != 2 {
return false, fmt.Errorf("недопустимый формат адреса электронной почты")
}
localPart := parts[0]
domain := parts[1]
// Получение MX-записей
mxRecords, err := getMXRecords(domain)
if err != nil || len(mxRecords) == 0 {
return false, fmt.Errorf("не удалось получить MX-записи для домена %s", domain)
}
// Проверка наличия почтового ящика
for _, mx := range mxRecords {
// Установка соединения с SMTP-сервером
conn, err := smtp.Dial(fmt.Sprintf("%s:%d", mx.Host, 25))
if err != nil {
continue // Пропускаем, если не удалось подключиться
}
defer conn.Close()
// Установка идентификатора отправителя
if err := conn.Mail("test@example.com"); err != nil {
continue // Пропускаем, если ошибка при установке отправителя
}
// Установка получателя
if err := conn.Rcpt(email); err != nil {
return false, nil // Если возникла ошибка, адрес не существует
}
return true, nil // Если все прошло успешно, адрес существует
}
return false, fmt.Errorf("не удалось проверить адрес электронной почты")
}
func main() {
email := "test@example.com"
exists, err := checkEmail(email)
if err != nil {
fmt.Println("Ошибка:", err)
} else if exists {
fmt.Println("Адрес электронной почты существует.")
} else {
fmt.Println("Адрес электронной почты не существует.")
}
}
Тут метод conn.Rcpt(email) как раз и определяет валидность адреса. При работе метода происходит обращение на сервер получателя с вопросом, сможет ли он обработать данные для указанного пользователя. Использование этого метода несколько раз для разных адресов даже не возбраняется.
Правда серв может брехать про валидность адреса, если что то не понравится в запросе
Подведу итог своей писанины.
Не подозрительно ли заваливать серв запросами валидности адресов? Или мои объёмы мизер для хостера типа мелкомягких? Существует ли какой то точный технический метод определения валидности адресов сопоставимый по точности с копанием соцсетей?
Что делает Return-Path: <>?
Нет. Не рекомендуется.
Примеры: