Назад | Перейти на главную страницу

Отправлять почту без MTA, GMail и т. Д.

Почему не представляется возможным отправлять письма из командной строки без какого-либо SMTP-сервера? Все найденные мной решения либо используют sendmail, postfix и т. Д. (Это SMTP-серверы, насколько я понимаю), либо отправляют их через GMail или какого-либо другого провайдера (который требует аутентификации). Почему приложение не может напрямую подключиться к целевому почтовому серверу? Например, если я хочу отправить письмо на адрес user@test.com, почему приложение не может просто подключиться к test.com и доставить почту напрямую без участия какого-либо другого сервера? Конечно, он будет отмечен как спам, но меня это не волнует. Я неправильно понял протокол SMTP, просто не нашел нужного приложения или действительно просто никто не потрудился написать такое приложение?

Вам нужен пользовательский агент для простой почты, но при этом вы задаетесь вопросом о назначении агента передачи почты. У обоих есть свое место.

Некоторые приложения, отправляющие почту, подключаются через SMTP, некоторые используют mailx или sendmail совместимые команды. Некоторым клиентам (MUA) действительно нужен SMTP-сервер, который будет ретранслировать за вас, но стоит понимать, что существует MTA.

Ваш назначенный MTA для ретрансляции вашей почты имеет некоторые преимущества. Изменить smtp.example.com на что-то еще проще, чем обновлять конфигурацию каждого приложения. Это обеспечивает лучшую безопасность, когда не каждый хост отправляет почту в Интернете, и, возможно, вы сканируете исходящую почту централизованно. Вероятность доставки почты выше, если ее можно поставить в очередь и отправить снова автоматически.

Обычно используется один из популярных MTA или сторонний сервис, поскольку MTA общего назначения сложен. Почта, отправляемая по разным адресатам, является обычным явлением, равно как и необходимость в псевдонимах и других функциях. Возможна простая отправка в пункт назначения, но это причины для инфраструктуры посередине.

Я не уверен, удосужился ли кто-нибудь написать такое приложение. Но это определенно возможно и будет довольно легко. Я уверен, что это может сделать скрипт на Python. Приложению потребуется использовать DNS для поиска записей MX для домена получателя. Таким образом, для recipient@domain.com должны быть получены записи MX для domain.com. Затем просто подключитесь к серверу, указанному в результатах DNS, с наивысшим приоритетом MX (наименьшим числом!) И попробуйте доставку. Если это не удается, попробуйте перейти к следующему приоритету и так далее.

Почему бы не научить себя питону, написав скрипт для выполнения этой работы! Я бы начал с того, что просто принял параметры командной строки для одного получателя, темы и единственной строки текста, чтобы все было очень просто. Затем усложните его, добавив возможность для нескольких получателей, копии, скрытой копии, многострочного текста, вложений и т. Д.

Отправные точки:

http://www.dnspython.org/examples.html https://www.tutorialspoint.com/python/python_sending_email.htm

неужели просто никто не удосужился написать такое приложение?

Теперь они сделали!

В продолжение моего другого ответа, в котором я предлагаю написать сценарий Python, я написал очень простой сценарий Python 3, который может сделать это за вас. Я тестировал его как на Linux (2 разных дистрибутива), так и на Windows, и он определенно отправляет почту с обоих на мою учетную запись gmail, которая, да, действительно попадает в папку спама!

Он немного обманывает, используя nslookup -type=mx <recipient_domain_name> 8.8.8.8 сделать nslookup (8.8.8.8 является общедоступным DNS-сервером Google), но скрипт по-прежнему работает как в Windows, так и в Linux - результаты просто анализируются немного по-другому. Причина этого "читерства" в том, чтобы уберечь вас от установки сторонней библиотеки python, хотя предполагается, что у вас есть nslookup команда, доступная на вашем пути - обычно это так.

Было бы довольно легко добавить дополнительные функции для вложений, понятных имен в заголовках сообщений To: From: и т. Д. Кроме того, все серверы mx, которые обнаруживает DNS, хранятся в списке в порядке приоритета, но сценарий пытается только отправить первому. Было бы довольно легко улучшить сценарий, чтобы он проверял остальные в порядке приоритета на случай, если не удастся достичь первого.

Использование: direct_mail_sender.py recipient@domain.com from@originator.com "тема сообщения" "тело сообщения"

Заключение темы и текста в "двойные кавычки" гарантирует, что вы можете включать пробелы между словами.

#!/usr/bin/python3
import subprocess, sys, smtplib

mx_records = []
mx_values = {'pref' : 0, 'serv' : ''}

if len(sys.argv) < 5:
    print('\nUsage:\ndirect_mail_sender.py recipient@domain.com from@originator.com "msg subject" "msg body"\n')
    exit()

recipient = sys.argv[1]
domain = recipient.split("@")[1]
originator = sys.argv[2]
subject = sys.argv[3]
body = sys.argv[4]

print("From:   " + originator)
print("To:     " + recipient)
print("Subject " + subject)
print("Body    " + body)

p = subprocess.Popen('nslookup -type=mx ' + domain + ' 8.8.8.8', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
for line in p.stdout.readlines():
    line = line.decode().lower()
    if line.find("mail exchanger") !=-1 :
        for char in line:
            if str(char) in "\r\n\t":
                line = line.replace(char, '')
        if line.find("mx preference") !=-1 :
            mx_parse = line.replace(' ', '').split(",")
            mx_values['pref'] = int(mx_parse[0].split("=")[1])
            mx_values['serv'] = mx_parse[1].split("=")[1]
        else:
            mx_parse = line.split(" = ")[1].split(" ")
            mx_values['pref'] = int(mx_parse[0])
            mx_values['serv'] = mx_parse[1]
        mx_records.append(mx_values.copy())

retval = p.wait()

def mx_pref_sortvalue(record):
    return record['pref']
mx_records=sorted(mx_records, key=mx_pref_sortvalue)

server = mx_records[0]['serv']

print("\nSending mail to: " + recipient + " via first priority MX server: " + server)

smtp_send = smtplib.SMTP(server, 25)
smtp_send.sendmail(originator, recipient, "From: " + originator + "\nTo: " + recipient + "\nSubject:" + subject + "\n\n" + body)
smtp_send.quit()