Как отправить почту напрямую на SMTP-сервер без аутентификации? - PullRequest
17 голосов
/ 19 марта 2012

Я хотел бы отправить электронное письмо непосредственно из сценария на учетную запись электронной почты Gmail, подключившись напрямую к smtp.gmail.com.

Однако я бы предпочел не указывать пароль gmail в скрипте.Из того, что я прочитал, видно, что Gmail требует аутентификации, прежде чем он будет доставлять почту, в том числе и своим пользователям.

Мой вопрос: как доставляется почта с другого SMTP-сервера, поскольку этот SMTP-сервер не будет иметь учетных данных Gmail.Требуется ли для Gmail только проверка подлинности для отправителей " анонимный ", и, поскольку мой сценарий выполняется на персональном компьютере, он более защищен?Вот скрипт Python, который я запускаю:

import smtplib
import email
msg = email.message.Message()
msg["From"] = "user@gmail.com"
msg["To"] = "user@gmail.com"
msg["Subject"] = "Test message"
server = smtplib.SMTP("smtp.gmail.com",587)
server.starttls()
server.ehlo_or_helo_if_needed()
try:
    failed = server.sendmail("user@gmail.com","user@gmail.com", msg.as_string())
    server.close()
except Exception as e:
    print(e)

Когда я запускаю этот скрипт, вывод:

(530, b'5.5.1 Authentication Required. Learn more at
5.5.1 http://support.google.com/mail/bin/answer.py?answer=14257 fw5sm21125889wib.0', 'user@gmail.com')

Мой вопрос: как внешние SMTP-серверы избегают этой проблемы?И все ли они реплицируются в локальном скрипте или требуют правильных обратных записей DNS, записей SPF и т. Д .?

Ответы [ 3 ]

31 голосов
/ 23 апреля 2015

Это действительно хороший вопрос, и я отвечаю на него.

Я хотел бы отправить электронное письмо непосредственно из сценария на учетную запись электронной почты Gmail, подключившись напрямую к smtp.gmail.com..

Прежде всего smtp.gmail.com не является почтовым сервером, который принимает почту (от других почтовых серверов), но разрешает Gmail пользователям вход в системуи, следовательно, отправьте или проверьте электронную почту.Если мы хотим узнать почтовые серверы Gmail, которые принимают почту от других почтовых серверов.Мы можем запустить следующий cmd на терминале:

dig mx gmail.com +short

output:

10 alt1.gmail-smtp-in.l.google.com.
40 alt4.gmail-smtp-in.l.google.com.
5 gmail-smtp-in.l.google.com.
30 alt3.gmail-smtp-in.l.google.com.
20 alt2.gmail-smtp-in.l.google.com. 

Так как gmail-smtp-in.l.google.com. имеет наименьшее значениеиз 5 мы используем его как предпочтительный почтовый сервер

Однако я бы предпочел не указывать пароль gmail в скрипте.Из того, что я прочитал, видно, что Gmail требует аутентификации, прежде чем он будет доставлять почту, в том числе и своим пользователям.

Точно один использует smtp.gmail.com для входаи отправлять / проверять электронные письма в соответствующие учетные записи, поэтому нам требуются учетные данные пользователя.Однако нам не нужны учетные данные для отправки электронной почты на его почтовый сервер, например gmail-smtp-in.l.google.com (пример ниже)

Мой вопрос: какявляется ли почта, приходящая с другого SMTP-сервера, когда-либо доставленной, поскольку этот SMTP-сервер не будет иметь учетных данных Gmail.Требуется ли для Gmail только аутентификация для «анонимных» отправителей, и, поскольку мой сценарий выполняется на персональном компьютере, он более защищен?Вот скрипт Python, который я запускаю:

Как я уже понял из обсуждения выше, нам не нужны учетные данные Gmail для подключения к почтовым серверам Gmail , однако, если мыподключайтесь к почтовым серверам Gmail с помощью персональных компьютеров, и мы можем избежать отправки нескольких электронных писем, но чтобы отправлять больше электронных писем, нам нужно создать репутацию домена и подотчетность, используя DKIM, SPF и т. д. (это совершенно другой спектр).

Следующий скрипт python отправляет электронную почту на учетную запись gmail без аутентификации.

import smtplib

fromaddr = 'sending@example.com'
toaddrs  = ['receiving@gmail.com']
msg = '''
    From: {fromaddr}
    To: {toaddr}
    Subject: testin'     
    This is a test 
    .
'''

msg = msg.format(fromaddr =fromaddr, toaddr = toaddrs[0])
# The actual mail send
server = smtplib.SMTP('gmail-smtp-in.l.google.com:25')
server.starttls()
server.ehlo("example.com")
server.mail(fromaddr)
server.rcpt(toaddrs[0])
server.data(msg)
server.quit()  

Или попробуйте следующий фрагмент Telnet

telnet gmail-smtp-in.l.google.com 25

HELO sendingdomain.com

MAIL FROM:<user@sending.com>

RCPT TO:<playingwithtelnet@gmail.com>

DATA
From: <user@sending.com>
To: <playingwithtelnet@gmail.com>
Subject: Just a test email

The body of the mail goes here.          
.

QUIT
10 голосов
/ 20 марта 2012

Вы можете использовать некоторые внешние SMTP-серверы без аутентификации (или локального SMTP), но отправленное сообщение будет перехвачено спам-фильтром Google, поскольку msg ["From"] равно @ google.com , в то время как фактический SMTP не smtp.gmail.com .

Эти SMTP-серверы также должны иметь правильную обратную зону в DNS провайдера, в противном случае этот smtp будет заблокированGoogle.

1 голос
/ 19 марта 2012

Вы не можете использовать SMTP-сервер Gmail без аутентификации. Это политика Google. Вам необходимо ввести пароль своей учетной записи. Но есть и другой способ. Вы можете использовать GAE (Google App Engine) с Gmail API. Таким образом, вы можете отправлять сообщения напрямую.

...