Отправка почты с 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.