Отправка почты из 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()
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