it-swarm-eu.dev

Senden von E-Mails von Python mit SMTP

Ich verwende die folgende Methode, um E-Mails von Python= mit SMTP zu senden. Ist dies die richtige Methode oder fehlen mir die Fallstricke?

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()
106
Eli Bendersky

Das Skript, das ich verwende, ist ziemlich ähnlich. Ich poste es hier als Beispiel für die Verwendung der email. * -Module zum Generieren von MIME-Nachrichten. So kann dieses Skript einfach geändert werden, um Bilder usw. anzuhängen.

Ich verlasse mich darauf, dass mein ISP den Date-Time-Header hinzufügt.

Mein ISP verlangt, dass ich eine sichere SMTP-Verbindung verwende, um E-Mails zu senden. Ich verlasse mich auf das SMTPLIB-Modul (herunterladbar unter http://www1.cs.columbia.edu/~db2501/ssmtplib.py )

Wie in Ihrem Skript sind der Benutzername und das Kennwort (mit den unten angegebenen Dummy-Werten) für die Authentifizierung auf dem SMTP-Server in der Quelle im Klartext angegeben. Dies ist eine Sicherheitsschwäche; Die beste Alternative hängt jedoch davon ab, wie sorgfältig Sie darauf achten müssen (wollen?), diese zu schützen.

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

#! /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:
    sys.exit( "mail failed; %s" % "CUSTOM_ERROR" ) # give an error message
106

Die Methode, die ich normalerweise benutze ... nicht viel anders, aber ein bisschen

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

Das ist es

81
madman2890

Auch wenn Sie SMTP-Authentifizierung mit TLS im Gegensatz zu SSL ausführen möchten, müssen Sie nur den Port ändern (verwenden Sie 587) und SMTP.STARTTLS () ausführen. Das hat bei mir funktioniert:

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

Das wichtigste, was ich sehe, ist, dass Sie keine Fehler behandeln: .login () und .sendmail () haben beide dokumentierte Ausnahmen, die sie auslösen können, und es scheint, als ob .connect () eine Möglichkeit haben muss, dies anzuzeigen Verbindung nicht möglich - wahrscheinlich eine Ausnahme, die vom zugrunde liegenden Socket-Code ausgelöst wird.

6
pjz

der folgende Code funktioniert einwandfrei für mich:

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/

5
Abdul Majeed

Was ist damit?

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

Stellen Sie sicher, dass keine Firewalls SMTP blockieren. Das erste Mal, dass ich versuchte, eine E-Mail zu senden, wurde diese sowohl von der Windows-Firewall als auch von McAfee blockiert - es dauerte ewig, bis ich beide gefunden hatte.

5
Mark Ransom

Sie sollten sicherstellen, dass Sie das Datum im richtigen Format formatieren - RFC2822 .

3
Douglas Leeder

Der Beispielcode, den ich für das Senden der Post unter Verwendung von SMTP tat.

import smtplib, ssl

smtp_server = "smtp.gmail.com"
port = 587  # For starttls
sender_email = "[email protected]"
receiver_email = "[email protected]"
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
Hariharan AR

Sehen Sie all diese langen Antworten? Bitte erlauben Sie mir, mich selbst zu promoten, indem Sie alles in ein paar Zeilen tun.

Importieren und verbinden:

import yagmail
yag = yagmail.SMTP('[email protected]', Host = 'YOUR.MAIL.SERVER', port = 26)

Dann ist es nur ein Einzeiler:

yag.send('[email protected]bar.com', 'hello', 'Hello\nThis is a mail from your server\n\nBye\n')

Es wird tatsächlich geschlossen, wenn es den Gültigkeitsbereich verlässt (oder manuell geschlossen werden kann). Außerdem können Sie so Ihren Benutzernamen in Ihrem Schlüsselbund registrieren, dass Sie Ihr Passwort nicht in Ihr Skript schreiben müssen (es hat mich wirklich gestört, bevor Sie yagmail geschrieben haben!)

Tipps und Tricks zum Paket/zur Installation finden Sie unter git oder pip , verfügbar für Python 2 und 3.

2
PascalVKooten

Hier ist ein funktionierendes Beispiel für 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)))
0
Mark

das kannst du so machen

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)
0
Skiller Dz