Отправка почты из 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('USERNAME@DOMAIN', '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 = "HellonThis is a mail from your servernnByen"

msg = "From: %snTo: %snSubject: %snDate: %snn%s"
% ( from_addr, to_addr, subj, date, message_text )

smtp.sendmail(from_addr, to_addr, msg)
smtp.quit()
1152   11  

11 ответов:

скрипт, который я использую, очень похож; я публикую его здесь в качестве примера того, как использовать электронную почту.* модули для создания 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

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

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

вот это

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

...
smtp.connect('YOUR.MAIL.SERVER', 587)
smtp.ehlo()
smtp.starttls()
smtp.ehlo()
smtp.login('USERNAME@DOMAIN', 'PASSWORD')
...

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

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

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

import smtplib

SERVER = "localhost"

FROM = "[email protected]"
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()

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

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/

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

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

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

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 или Пип, доступно для Python 2 и 3.

вы можете сделать так

import smtplib
from email.mime.text import MIMEText
from email.header import Header


server = smtplib.SMTP('mail.servername.com', 25)
server.ehlo()
server.starttls()

server.login('username', 'password')
from = '[email protected]'
to = '[email protected]'
body = 'That A Message For My Girl Friend For tell Him If We will go to eat Something This Nigth'
subject = 'Invite to A Diner'
msg = MIMEText(body,'plain','utf-8')
msg['Subject'] = Header(subject, 'utf-8')
msg['From'] = Header(from, 'utf-8')
msg['To'] = Header(to, 'utf-8')
message = msg.as_string()
server.sendmail(from, to, message)

вот рабочий пример для Python 3.x

#!/usr/bin/env python3

from email.message import EmailMessage
from getpass import getpass
from smtplib import SMTP_SSL
from sys import exit

smtp_server = 'smtp.gmail.com'
username = '[email protected]'
password = getpass('Enter Gmail password: ')

sender = '[email protected]'
destination = '[email protected]'
subject = 'Sent from Python 3.x'
content = 'Hello! This was sent to you via Python 3.x!'

# Create a text/plain message
msg = EmailMessage()
msg.set_content(content)

msg['Subject'] = subject
msg['From'] = sender
msg['To'] = destination

try:
    s = SMTP_SSL(smtp_server)
    s.login(username, password)
    try:
        s.send_message(msg)
    finally:
        s.quit()

except Exception as E:
    exit('Mail failed: {}'.format(str(E)))

Comments

    Ничего не найдено.