Frage

Ich verwende die folgende Methode Mail von Python senden SMTP. Ist es die richtige Methode zu verwenden, oder gibt es Fallstricke, ich bin fehlt?

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()
War es hilfreich?

Lösung

Das Skript Ich benutze ist ganz ähnlich; Ich poste es hier als ein Beispiel dafür, wie die E-Mail verwenden * Module MIME-Nachrichten zu generieren. so kann dieses Skript einfach Bilder modifiziert werden zu befestigen, etc.

ich auf meinem ISP angewiesen, um das Datum Zeit Header hinzuzufügen.

Ihr ISP erfordert mich eine sichere SMTP-Verbindung zu verwenden, um Mail zu schicken, verlasse ich mich auf dem smtplib Modul (herunterladbar unter http://www1.cs.columbia.edu/~db2501/ssmtplib.py )

Wie in Ihrem Skript, der Benutzername und das Passwort, (Dummy-Wert weiter unten), verwendete auf dem SMTP-Server zu authentifizieren, ist im Klartext in der Quelle. Dies ist eine Sicherheitsschwäche; aber die beste Alternative hängt davon ab, wie vorsichtig man braucht (will?) zu schützen diese zu sein.

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

#! /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

Andere Tipps

Die Methode, die ich häufig verwenden ... nicht viel anders, aber ein wenig

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

Das ist es

Auch wenn Sie die SMTP-Authentifizierung mit TLS tun wollen im Gegensatz zu SSL dann müssen Sie nur noch den Port ändern (verwenden 587) und tun smtp.starttls (). Dieser arbeitete für mich:

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

Der Haupt Gotcha ich sehe, ist, dass Sie keine Fehler Handhabung: .login () und .sendmail () haben beide Ausnahmen dokumentiert, dass sie werfen können, und es scheint, wie .Connect () muss eine Möglichkeit haben, um anzuzeigen, zu verbinden, dass es nicht in der Lage -. vermutlich durch den zugrunde liegenden Socket Code ausgelöst eine Ausnahme

Stellen Sie sicher, Sie haben keinen Firewalls blockiert SMTP. Das erste Mal habe ich versucht, eine E-Mail zu schicken, es wurde sowohl durch die Windows-Firewall und McAfee blockiert -. Dauerte ewig, sie beide zu finden

Was ist das?

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

folgender Code funktioniert gut für mich:

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

Ref: http: // www .mkyong.com / python / wie-do-send-E-Mail-in-python-via-smtplib /

Sie sollten Sie das Datum im richtigen Format formatiert werden sicher - RFC2822 .

Alle diese lenghty Antworten? Gestatten Sie mir selbst zu fördern, indem sie alle in ein paar Zeilen zu tun.

Import und Verbindung:

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

Dann ist es nur ein Einzeiler:

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

Es wird tatsächlich zu schließen, wenn es den Bereich verlässt (oder kann manuell geschlossen). Darüber hinaus ermöglicht es Ihnen Ihre Benutzername in Ihrem Schlüsselbund zu registrieren, so dass Sie müssen Ihr Passwort in Ihrem Skript nicht schreiben (es wirklich störte mich vor dem Schreiben yagmail!)

Für die Verpackung / Montage, Tipps und Tricks finden Sie in git oder pip , verfügbar sowohl für Python 2 und 3

Der Beispielcode, die ich für Sende Mail tat 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()

Sie können wie das tun

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 = 'me@servername.com'
to = 'mygfriend@servername.com'
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)

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 = 'your_email_address@gmail.com'
password = getpass('Enter Gmail password: ')

sender = 'your_email_address@gmail.com'
destination = 'recipient_email_address@gmail.com'
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)))
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top