Отправка почты из Python с использованием SMTP - PullRequest
105 голосов
/ 15 сентября 2008

Я использую следующий метод для отправки почты из Python с использованием SMTP. Это правильный метод или есть ошибки, которые мне не хватает?

from smtplib import SMTP
import datetime

debuglevel = 0

smtp = SMTP()
smtp.set_debuglevel(debuglevel)
smtp.connect('YOUR.MAIL.SERVER', 26)
smtp.login('USERNAME@DOMAIN', 'PASSWORD')

from_addr = "John Doe <john@doe.net>"
to_addr = "foo@bar.com"

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

Ответы [ 12 ]

105 голосов
/ 15 сентября 2008

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

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

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

Как и в вашем скрипте, имя пользователя и пароль (с учетом фиктивных значений ниже), используемые для аутентификации на SMTP-сервере, находятся в текстовом формате в источнике. Это слабость безопасности; но лучшая альтернатива зависит от того, насколько тщательно вы хотите (хотите?) защищать их.

=======================================

#! /usr/local/bin/python


SMTPserver = 'smtp.att.yahoo.com'
sender =     'me@my_email_domain.net'
destination = ['recipient@her_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:
    sys.exit( "mail failed; %s" % "CUSTOM_ERROR" ) # give an error message
79 голосов
/ 11 июля 2013

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

import smtplib
from email.MIMEMultipart import MIMEMultipart
from email.MIMEText import MIMEText

msg = MIMEMultipart()
msg['From'] = 'me@gmail.com'
msg['To'] = 'you@gmail.com'
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('me@gmail.com', 'mypassword')

mailserver.sendmail('me@gmail.com','you@gmail.com',msg.as_string())

mailserver.quit()

Вот и все

21 голосов
/ 08 ноября 2008

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

...
smtp.connect('YOUR.MAIL.SERVER', 587)
smtp.ehlo()
smtp.starttls()
smtp.ehlo()
smtp.login('USERNAME@DOMAIN', 'PASSWORD')
...
6 голосов
/ 15 сентября 2008

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

5 голосов
/ 04 октября 2014

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

import smtplib

to = 'mkyong2002@yahoo.com'
gmail_user = 'mkyong2002@gmail.com'
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/

5 голосов
/ 27 июня 2012

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

import smtplib

SERVER = "localhost"

FROM = "sender@example.com"
TO = ["user@example.com"] # 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()
5 голосов
/ 15 сентября 2008

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

3 голосов
/ 15 сентября 2008

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

2 голосов
/ 02 апреля 2019

Пример кода, который я сделал для отправки почты по SMTP.

import smtplib, ssl

smtp_server = "smtp.gmail.com"
port = 587  # For starttls
sender_email = "sender@email"
receiver_email = "receiver@email"
password = "<your password here>"
message = """ Subject: Hi there

This message is sent from Python."""


# Create a secure SSL context
context = ssl.create_default_context()

# Try to log in to server and send email
server = smtplib.SMTP(smtp_server,port)

try:
    server.ehlo() # Can be omitted
    server.starttls(context=context) # Secure the connection
    server.ehlo() # Can be omitted
    server.login(sender_email, password)
    server.sendmail(sender_email, receiver_email, message)
except Exception as e:
    # Print any error messages to stdout
    print(e)
finally:
    server.quit()
2 голосов
/ 18 апреля 2015

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

Импорт и подключение:

import yagmail
yag = yagmail.SMTP('john@doe.net', host = 'YOUR.MAIL.SERVER', port = 26)

Тогда это всего лишь одна строка:

yag.send('foo@bar.com', 'hello', 'Hello\nThis is a mail from your server\n\nBye\n')

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

Для получения информации о пакете / установке, советах и ​​рекомендациях см. git или pip , доступные как для Python 2, так и для 3.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...