smtplib и gmail - проблемы со скриптом python
Вопрос
Вот мой сценарий:
#!/usr/bin/python
import smtplib
msg = 'Hello world.'
server = smtplib.SMTP('smtp.gmail.com',587) #port 465 or 587
server.ehlo()
server.starttls()
server.ehlo()
server.login('myname@gmail.com','mypass')
server.sendmail('myname@gmail.com','somename@somewhere.com',msg)
server.close()
Я просто пытаюсь отправить электронное письмо из своей учетной записи gmail.Скрипт использует starttls из-за требований gmail.Я пробовал это на двух веб-хостингах, 1and1 и webfaction.1and1 выдает мне ошибку "отказано в подключении", а webfaction не сообщает об ошибке, но просто не отправляет электронное письмо.Я не вижу ничего плохого в скрипте, поэтому я думаю, что это может быть связано с веб-хостингами.Будем очень признательны за любые мысли и комментарии.
Редактировать:Я включил режим отладки.Судя по результатам, похоже, что сообщение было отправлено успешно...Я просто никогда его не получаю.
send: 'ehlo web65.webfaction.com\r\n'
reply: '250-mx.google.com at your service, [174.133.21.84]\r\n'
reply: '250-SIZE 35651584\r\n'
reply: '250-8BITMIME\r\n'
reply: '250-STARTTLS\r\n'
reply: '250-ENHANCEDSTATUSCODES\r\n'
reply: '250 PIPELINING\r\n'
reply: retcode (250); Msg: mx.google.com at your service, [174.133.21.84]
SIZE 35651584
8BITMIME
STARTTLS
ENHANCEDSTATUSCODES
PIPELINING
send: 'STARTTLS\r\n'
reply: '220 2.0.0 Ready to start TLS\r\n'
reply: retcode (220); Msg: 2.0.0 Ready to start TLS
send: 'ehlo web65.webfaction.com\r\n'
reply: '250-mx.google.com at your service, [174.133.21.84]\r\n'
reply: '250-SIZE 35651584\r\n'
reply: '250-8BITMIME\r\n'
reply: '250-AUTH LOGIN PLAIN\r\n'
reply: '250-ENHANCEDSTATUSCODES\r\n'
reply: '250 PIPELINING\r\n'
reply: retcode (250); Msg: mx.google.com at your service, [174.133.21.84]
SIZE 35651584
8BITMIME
AUTH LOGIN PLAIN
ENHANCEDSTATUSCODES
PIPELINING
send: 'AUTH PLAIN *****\r\n'
reply: '235 2.7.0 Accepted\r\n'
reply: retcode (235); Msg: 2.7.0 Accepted
send: 'mail FROM:<myname@gmail.com> size=12\r\n'
reply: '250 2.1.0 OK 4sm652580yxq.48\r\n'
reply: retcode (250); Msg: 2.1.0 OK 4sm652580yxq.48
send: 'rcpt TO:<myname@gmail.com>\r\n'
reply: '250 2.1.5 OK 4sm652580yxq.48\r\n'
reply: retcode (250); Msg: 2.1.5 OK 4sm652580yxq.48
send: 'data\r\n'
reply: '354 Go ahead 4sm652580yxq.48\r\n'
reply: retcode (354); Msg: Go ahead 4sm652580yxq.48
data: (354, 'Go ahead 4sm652580yxq.48')
send: 'Hello world.\r\n.\r\n'
reply: '250 2.0.0 OK 1240421143 4sm652580yxq.48\r\n'
reply: retcode (250); Msg: 2.0.0 OK 1240421143 4sm652580yxq.48
data: (250, '2.0.0 OK 1240421143 4sm652580yxq.48')
Решение
Я думаю, что SMTP-сервер GMail выполняет обратный DNS-поиск по IP-адресу, с которого вы подключаетесь, и отклоняет подключение, если домен не может быть найден.Это делается для того, чтобы спамеры не использовали свой SMTP-сервер в качестве открытого ретранслятора.
Другие советы
Вы пробовали создать корректное сообщение?
from email.MIMEText import MIMEText
msg = MIMEText('body')
msg['Subject'] = 'subject'
msg['From'] = "..."
msg['Reply-to'] = "..."
msg['To'] = "..."
Я не знаю, волнует ли OP по-прежнему этот ответ, но, оказавшись здесь в попытке устранить подобную проблему, надеюсь, кто-то еще может счесть это полезным.Как оказалось, Google изменила способ, которым они разрешают использовать свой SMTP-сервер.Вы захотите проверить пару вещей:
Что вы используете тот же адрес, который вы использовали для аутентификации в качестве адреса "от".Если я не ошибаюсь, раньше в поле from можно было указывать практически все, что угодно, но в целях безопасности многие сайты SMTP-хостинга (включая Google) теперь ограничивают это адресом, с помощью которого была проведена аутентификация.
Разрешить доступ к вашей учетной записи "менее защищенным приложениям" (читать:приложения, от которых мы не получаем дохода).Чтобы сделать это, войдите в свою учетную запись и перейдите сюда:https://www.google.com/settings/security/lesssecureapps
Используйте порт 587 с tls.Не совсем уверен, почему, но я никогда не мог заставить порт 465 работать нормально.
Надеюсь, это поможет кому-нибудь еще.
Некоторая самореклама здесь, но я чувствую себя на веской почве.
Вам буквально понадобится этот код только для того, чтобы делать именно то, что вы написали:
import yagmail
yag = yagmail.SMTP('myname@gmail.com')
yag.send('somename@somewhere.com', subject = None, contents = 'Hello')
Или однострочник:
yagmail.SMTP('myname@gmail.com').send('somename@somewhere.com', None, 'Hello world.')
Что приятно, так это то, что я предлагаю использовать связку ключей для хранения вашего пароля, так что у вас никогда не будет риска, что люди увидят ваш пароль в вашем скрипте.
Вы можете настроить это, запустив один раз в своем интерпретаторе:
import yagmail
yagmail.register("my@gmail.com", "mypassword")
и выходите.Тогда вы можете просто использовать:
import yagmail
yagmail.SMTP("my@gmail.com") # without password
Если вы добавите .yagmail с "my@gmail.com" в свой домашний каталог, тогда вы можете просто сделать: yagmail.SMTP()
, но сейчас это довольно бессмысленно.
Предупреждение:Если вы серьезно относитесь к отправке большого количества сообщений, лучше настройте OAuth2, yagmail может помочь с этим.
yagmail.SMTP("my@gmail.com", oauth2_file="/path/to/save/creds.json")
При первом запуске он проведет вас через процесс получения учетных данных OAuth2 и сохранит их в файле, чтобы в следующий раз вам не нужно было ничего с ним делать.Вы подозреваете, что кто-то нашел ваши учетные данные?У них будут ограниченные разрешения, но вам лучше аннулировать их учетные данные через gmail.
Для получения информации о пакете / установке, пожалуйста, ознакомьтесь с мерзавец или прочитанные документы, доступен как для Python 2, так и для 3.
избавьте себя от лишней головной боли и используйте это:
http://mynthon.net/howto/-/python/python%20-%20logging .SMTPHandler-how-to-use-gmail-smtp-server.txt
Сс
Вам нужно будет проверить свою папку "Отправленные" в GMail, так как именно там, скорее всего, будет отображаться сообщение, отправленное из вашей учетной записи в вашу учетную запись.
Я перешел по вышеупомянутой ссылке, и у меня было 3 разных адреса для отправки, но я получил три электронных письма на один и тот же адрес, и это был адрес # 3.
http://mynthon.net/howto/-/python/python%20-%20logging .SMTPHandler-how-to-use-gmail-smtp-server.txt
import logging
import logging.handlers
class TlsSMTPHandler(logging.handlers.SMTPHandler):
def emit(self, record):
"""
Emit a record.
Format the record and send it to the specified addressees.
"""
try:
import smtplib
import string # for tls add this line
try:
from email.utils import formatdate
except ImportError:
formatdate = self.date_time
port = self.mailport
if not port:
port = smtplib.SMTP_PORT
smtp = smtplib.SMTP(self.mailhost, port)
msg = self.format(record)
msg = "From: %s\r\nTo: %s\r\nSubject: %s\r\nDate: %s\r\n\r\n%s" % (
self.fromaddr,
string.join(self.toaddrs, ","),
self.getSubject(record),
formatdate(), msg)
if self.username:
smtp.ehlo() # for tls add this line
smtp.starttls() # for tls add this line
smtp.ehlo() # for tls add this line
smtp.login(self.username, self.password)
smtp.sendmail(self.fromaddr, self.toaddrs, msg)
smtp.quit()
except (KeyboardInterrupt, SystemExit):
raise
except:
self.handleError(record)
logger = logging.getLogger()
gm = TlsSMTPHandler(("smtp.gmail.com", 587), 'myusername@gmail.com', ['address1@gmail.com', 'address2@gmail.com', 'address3@gmail.com'], 'unable to find Error!', ('myusername@gmail.com', 'mypassword'))
gm.setLevel(logging.ERROR)
logger.addHandler(gm)
try:
1/0
except:
logger.exception('It NO work for me!!-')
Это работает
'''
Created on 2017/11/27
@author: devuser
'''
import smtplib
from email.mime.text import MIMEText
from email.utils import formatdate
FROM_ADDRESS = 'sender@gmail.com'
MY_PASSWORD = 'password'
TO_ADDRESS = 'receiver@test.co.jp'
BCC = 'receiver2@test.net'
SUBJECT = 'GmailのSMTPサーバ経由'
BODY = 'pythonでメール送信'
def create_message(from_addr, to_addr, bcc_addrs, subject, body):
msg = MIMEText(body)
msg['Subject'] = subject
msg['From'] = from_addr
msg['To'] = to_addr
msg['Bcc'] = bcc_addrs
msg['Date'] = formatdate()
return msg
def send(from_addr, to_addrs, msg):
smtpobj = smtplib.SMTP('smtp.gmail.com', 587)
smtpobj.ehlo()
smtpobj.starttls()
smtpobj.ehlo()
smtpobj.login(FROM_ADDRESS, MY_PASSWORD)
smtpobj.sendmail(from_addr, to_addrs, msg.as_string())
smtpobj.close()
if __name__ == '__main__':
to_addr = TO_ADDRESS
subject = SUBJECT
body = BODY
msg = create_message(FROM_ADDRESS, to_addr, BCC, subject, body)
send(FROM_ADDRESS, to_addr, msg)