2008-09-15 11 views
93

Я использую следующий метод для отправки почты с 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() 
+2

Убедитесь, что вы правильно указали дату и время. Я нашел следующую функцию весьма полезной, которая дает вам отлично отформатированное значение для Date-Header: http://docs.python.org/py3k/library/email.util.html#email.utils.formatdate – BastiBen 2010-07-30 06:11:21

+0

здесь пример кода, который позволяет [отправлять электронную почту с текстом Юникода в теме и/или в теле] (http://stackoverflow.com/a/20787826/4279) – jfs 2013-12-26 18:10:11

+0

вот пример кода, который демонстрирует, как [отправлять изображения inline (плюс электронная почта с html и частями обычного текста)] (http://stackoverflow.com/a/20485764/4279). Он также показывает, как настроить параметры ssl на старых версиях Python. – jfs 2013-12-26 18:11:00

ответ

94

Сценарий, который я использую, очень похож; Я размещаю его здесь в качестве примера использования модулей электронной почты. * Для генерации сообщений MIME; поэтому этот скрипт можно легко модифицировать, чтобы прикреплять изображения и т. д.

Я полагаюсь на своего провайдера, чтобы добавить заголовок времени даты.

Мой провайдер требует от меня, чтобы использовать защищенное соединение SMTP для отправки почты, я полагаюсь на модуле ssmtplib (загружаемые в http://www1.cs.columbia.edu/~db2501/ssmtplib.py)

Как в сценарии, имя пользователя и пароль, (учитывая фиктивные значения ниже), используемые для аутентификации на 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 
+1

@Vincent: mail failed; Объект 'module' не имеет атрибута 'SSLFakeSocket' - с помощью Gmail :( – RadiantHex 2010-04-26 09:08:21

+0

Это похоже на проблему с версией или импортом, чтобы помочь ее отслеживать: какая версия Python вы используете? - Вам нужно подключиться к вашему SMTP-серверу SSL (и если вы импортируете ssmtplib, как указано выше)? Можете ли вы импортировать smtplib непосредственно из python interactive, если да, то существует ли класс smtplib.SSLFakeSocket? Надеюсь, что смогу помочь – 2010-04-28 11:22:20

6

Главный Гоча я вижу, что вы не обрабатываете ошибку: .login() и .sendmail() оба документированного исключение, которые они могут бросить, и похоже, .Подключать() должен иметь каким-то образом указывать на то, что он не смог подключиться - возможно, это исключение, вызванное базовым кодом сокета.

3

Вы должны убедиться, что вы отформатировали дату в правильном формате - RFC2822.

5

Убедитесь, что у вас нет брандмауэров, блокирующих SMTP. В первый раз, когда я попытался отправить электронное письмо, он был заблокирован как брандмауэром Windows, так и McAfee - навсегда нашел их обоих.

20

Также, если вы хотите сделать smtp auth с помощью TLS, а не SSL, вам просто нужно изменить порт (используйте 587) и выполнить smtp.starttls(). Это сработало для меня:

... 
smtp.connect('YOUR.MAIL.SERVER', 587) 
smtp.ehlo() 
smtp.starttls() 
smtp.ehlo() 
smtp.login('[email protected]', 'PASSWORD') 
... 
5

Как насчет этого?

import smtplib 

SERVER = "localhost" 

FROM = "[email protected]m" 
TO = ["[email protected]"] # must be a list 

SUBJECT = "Hello!" 

TEXT = "This message was sent with Python's 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() 
67

Метод, который я обычно пользуюсь ... не сильно отличается, но немного

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() 

Вот это

5

следующий код работает отлично для меня:

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() 

Ref: http://www.mkyong.com/python/how-do-send-email-in-python-via-smtplib/

2

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

Импорт и Connect:

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') 

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

Для упаковки/установки, подсказок и трюки, пожалуйста, посмотрите на git или pip, доступный как для Python 2, так и 3.

Смежные вопросы