Отправка почты с Python с помощью SMTP
Я использую следующий метод для отправки почты с Python с помощью SMTP. Правильно ли это метод или нет, я пропал без вести?
from smtplib import SMTP
import datetime
debuglevel = 0
smtp = SMTP()
smtp.set_debuglevel(debuglevel)
smtp.connect('YOUR.MAIL.SERVER', 26)
smtp.login('[email protected]', 'PASSWORD')
from_addr = "John Doe <[email protected]>"
to_addr = "[email protected]"
subj = "hello"
date = datetime.datetime.now().strftime( "%d/%m/%Y %H:%M" )
message_text = "Hello\nThis is a mail from your server\n\nBye\n"
msg = "From: %s\nTo: %s\nSubject: %s\nDate: %s\n\n%s"
% ( from_addr, to_addr, subj, date, message_text )
smtp.sendmail(from_addr, to_addr, msg)
smtp.quit()
Ответы
Ответ 1
script Я использую очень похоже; Я размещаю его здесь в качестве примера использования модулей электронной почты. * Для генерации сообщений MIME; поэтому этот script можно легко модифицировать для прикрепления изображений и т.д.
Я полагаюсь на своего провайдера, чтобы добавить заголовок даты даты.
Мой интернет-провайдер требует, чтобы я использовал безопасное smtp-соединение для отправки почты, я полагаюсь на модуль ssmtplib (можно загрузить в http://www1.cs.columbia.edu/~db2501/ssmtplib.py)
Как и в вашем script, имя пользователя и пароль (с учетом фиктивных значений ниже), используемые для аутентификации на SMTP-сервере, находятся в открытом тексте в источнике. Это слабость в плане безопасности; но лучшая альтернатива зависит от того, насколько вы осторожны (хотите?), чтобы защитить их.
=======================================
#! /usr/local/bin/python
SMTPserver = 'smtp.att.yahoo.com'
sender = '[email protected]_email_domain.net'
destination = ['[email protected]_email_domain.com']
USERNAME = "USER_NAME_FOR_INTERNET_SERVICE_PROVIDER"
PASSWORD = "PASSWORD_INTERNET_SERVICE_PROVIDER"
# typical values for text_subtype are plain, html, xml
text_subtype = 'plain'
content="""\
Test message
"""
subject="Sent from Python"
import sys
import os
import re
from smtplib import SMTP_SSL as SMTP # this invokes the secure SMTP protocol (port 465, uses SSL)
# from smtplib import SMTP # use this for standard SMTP protocol (port 25, no encryption)
# old version
# from email.MIMEText import MIMEText
from email.mime.text import MIMEText
try:
msg = MIMEText(content, text_subtype)
msg['Subject']= subject
msg['From'] = sender # some SMTP servers will do this automatically, not all
conn = SMTP(SMTPserver)
conn.set_debuglevel(False)
conn.login(USERNAME, PASSWORD)
try:
conn.sendmail(sender, destination, msg.as_string())
finally:
conn.quit()
except Exception, exc:
sys.exit( "mail failed; %s" % str(exc) ) # give a error message
Ответ 2
Метод, который я обычно использую... не сильно отличается, но немного
import smtplib
from email.MIMEMultipart import MIMEMultipart
from email.MIMEText import MIMEText
msg = MIMEMultipart()
msg['From'] = '[email protected]'
msg['To'] = '[email protected]'
msg['Subject'] = 'simple email in python'
message = 'here is the email'
msg.attach(MIMEText(message))
mailserver = smtplib.SMTP('smtp.gmail.com',587)
# identify ourselves to smtp gmail client
mailserver.ehlo()
# secure our email with tls encryption
mailserver.starttls()
# re-identify ourselves as an encrypted connection
mailserver.ehlo()
mailserver.login('[email protected]', 'mypassword')
mailserver.sendmail('[email protected]','[email protected]',msg.as_string())
mailserver.quit()
Что он
Ответ 3
Также, если вы хотите сделать smtp auth с TLS, а не SSL, вам просто нужно изменить порт (используйте 587) и сделать smtp.starttls(). Это сработало для меня:
...
smtp.connect('YOUR.MAIL.SERVER', 587)
smtp.ehlo()
smtp.starttls()
smtp.ehlo()
smtp.login('[email protected]', 'PASSWORD')
...
Ответ 4
Основная проблема, которую я вижу, заключается в том, что вы не обрабатываете никаких ошибок:.login() и .sendmail() имеют задокументированные исключения, которые могут быть выбраны, и кажется, что .connect() должен иметь некоторый способ указать что он не смог подключиться - возможно, исключение, вызванное базовым кодом сокета.
Ответ 5
Убедитесь, что у вас нет брандмауэров, блокирующих SMTP. В первый раз, когда я попытался отправить электронное письмо, он был заблокирован как брандмауэром Windows, так и McAfee - навсегда нашел их обоих.
Ответ 6
Как насчет этого?
import smtplib
SERVER = "localhost"
FROM = "[email protected]"
TO = ["[email protected]"] # must be a list
SUBJECT = "Hello!"
TEXT = "This message was sent with Python smtplib."
# Prepare actual message
message = """\
From: %s
To: %s
Subject: %s
%s
""" % (FROM, ", ".join(TO), SUBJECT, TEXT)
# Send the mail
server = smtplib.SMTP(SERVER)
server.sendmail(FROM, TO, message)
server.quit()
Ответ 7
следующий код работает отлично для меня:
import smtplib
to = '[email protected]'
gmail_user = '[email protected]'
gmail_pwd = 'yourpassword'
smtpserver = smtplib.SMTP("smtp.gmail.com",587)
smtpserver.ehlo()
smtpserver.starttls()
smtpserver.ehlo() # extra characters to permit edit
smtpserver.login(gmail_user, gmail_pwd)
header = 'To:' + to + '\n' + 'From: ' + gmail_user + '\n' + 'Subject:testing \n'
print header
msg = header + '\n this is test msg from mkyong.com \n\n'
smtpserver.sendmail(gmail_user, to, msg)
print 'done!'
smtpserver.quit()
Ссылка: http://www.mkyong.com/python/how-do-send-email-in-python-via-smtplib/
Ответ 8
Вы должны убедиться, что вы отформатируете дату в правильном формате - RFC2822.
Ответ 9
Посмотрите все эти подробные ответы? Пожалуйста, позвольте мне самостоятельно продвигать, сделав все это в нескольких строках.
Импорт и подключение:
import yagmail
yag = yagmail.SMTP('[email protected]', host = 'YOUR.MAIL.SERVER', port = 26)
Тогда это всего лишь однострочный:
yag.send('[email protected]', 'hello', 'Hello\nThis is a mail from your server\n\nBye\n')
Он фактически закрывается, когда он выходит из области видимости (или может быть закрыт вручную). Кроме того, он позволит вам зарегистрировать свое имя пользователя в вашем ключевом ключе, чтобы вам не нужно было записывать свой пароль в script (это действительно беспокоило меня до написания yagmail
!)
Для пакета/установки, советов и трюков посмотрите git или pip, доступный как для Python 2, так и для 3.