368 Stimmen

Wie sende ich E-Mail-Anhänge?

Ich habe Probleme, zu verstehen, wie man eine Anlage mit Python per E-Mail versendet. Ich habe erfolgreich einfache Nachrichten mit dem smtplib verschickt. Könnte mir bitte jemand erklären, wie man eine Anlage in einer E-Mail versendet. Ich weiß, dass es andere Beiträge online gibt, aber als Python-Anfänger fällt es mir schwer, sie zu verstehen.

6 Stimmen

Hier ist eine einfache Implementierung, die mehrere Dateien anhängen kann und sogar in Bezug auf Bilder eingebettet werden kann. datamakessense.com/…

0 Stimmen

Ich fand das nützlich drupal.org/project/mimemail/issues/911612 stellt sich heraus, dass Bilddateianhänge an einen damit verbundenen Typ-Kindteil angehängt werden müssen. Wenn Sie das Bild an den Wurzel-MIME-Teil anhängen, können die Bilder in der Liste der angehängten Elemente angezeigt und in Clienten wie Outlook365 vorab angezeigt werden.

15voto

Sudarshan Punkte 830

Ein weiterer Weg mit Python 3 (Wenn jemand danach sucht):

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders

fromaddr = "Absender E-Mail-Adresse"
toaddr = "Empfänger E-Mail-Adresse"

msg = MIMEMultipart()

msg['From'] = fromaddr
msg['To'] = toaddr
msg['Subject'] = "BETREFF DER E-MAIL"

body = "DER TEXT, DEN SIE SENDEN MÖCHTEN"

msg.attach(MIMEText(body, 'plain'))

filename = "Dateiname"
attachment = open("Dateipfad", "rb")

part = MIMEBase('application', 'octet-stream')
part.set_payload((attachment).read())
encoders.encode_base64(part)
part.add_header('Content-Disposition', "attachment; filename= %s" % filename)

msg.attach(part)

server = smtplib.SMTP('smtp.gmail.com', 587)
server.starttls()
server.login(fromaddr, "Absender E-Mail-Passwort")
text = msg.as_string()
server.sendmail(fromaddr, toaddr, text)
server.quit()

Stellen Sie sicher, dass Sie "weniger sichere Apps" in Ihrem Gmail-Konto zulassen

0 Stimmen

Vielen Dank für diese Antwort @Sudarshan, aber kann der "Dateipfad" entweder relativ/absolut sein? Muss er einem bestimmten Muster folgen? Könnte jemand bitte mehr Informationen dazu geben?

11voto

Ferrarezi Punkte 683

Version von Gmail, funktioniert mit Python 3.6 (beachten Sie, dass Sie Ihre Gmail-Einstellungen ändern müssen, um E-Mails über SMTP senden zu können:

import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication
from os.path import basename

def send_mail(send_from: str, subject: str, text: str, 
send_to: list, files= None):

    send_to= default_address if not send_to else send_to

    msg = MIMEMultipart()
    msg['From'] = send_from
    msg['To'] = ', '.join(send_to)  
    msg['Subject'] = subject

    msg.attach(MIMEText(text))

    for f in files or []:
        with open(f, "rb") as fil: 
            ext = f.split('.')[-1:]
            attachedfile = MIMEApplication(fil.read(), _subtype = ext)
            attachedfile.add_header(
                'content-disposition', 'attachment', filename=basename(f) )
        msg.attach(attachedfile)

    smtp = smtplib.SMTP(host="smtp.gmail.com", port= 587) 
    smtp.starttls()
    smtp.login(username,password)
    smtp.sendmail(send_from, send_to, msg.as_string())
    smtp.close()

Verwendung:

username = 'meine-adresse@gmail.com'
password = 'top-secret'
default_address = ['meine-adresse2@gmail.com'] 

send_mail(send_from= username,
subject="test",
text="text",
send_to= None,
files= # geben Sie hier eine Liste mit den vollständigen Dateipfaden ein...
)

Um mit einem anderen E-Mail-Anbieter zu verwenden, ändern Sie einfach die SMTP-Konfigurationen.

6voto

Andrade Punkte 1131

Der einfachste Code, den ich bekommen konnte, ist:

# für E-Mail-Anhang
from django.core.mail import EmailMessage

    def attachment_email(request):
            email = EmailMessage(
            'Hallo', # Betreff
            'Hier steht der Text', # Text
            'MeineEmail@MeineEmail.com', # von
            ['AnSenden@AnSenden.com'], # an
            ['bcc@example.com'], # bcc
            reply_to=['other@example.com'],
            headers={'Message-ID': 'foo'},
            )

            email.attach_file('/mein/pfad/datei')
            email.send()

Es basierte auf der offiziellen Django-Dokumentation

3 Stimmen

Im Ihrem Fall müssen Sie Django installieren, um eine E-Mail zu senden... es antwortet nicht richtig auf die Frage

1 Stimmen

@comte 'weil Python nur für Django verwendet wird, oder?

6 Stimmen

@Auspex das ist mein Punkt ;-) es ist wie das Installieren von LibreOffice, um eine Konfigurationsdatei zu bearbeiten...

5voto

Antony Fuentes Punkte 885

Andere Antworten sind ausgezeichnet, obwohl ich immer noch eine andere Herangehensweise teilen wollte, falls jemand nach Alternativen sucht.

Der Hauptunterschied hier ist, dass Sie mit diesem Ansatz HTML/CSS verwenden können, um Ihre Nachricht zu formatieren, sodass Sie kreativ werden und Ihrem E-Mail etwas Stil geben können. Sie sind jedoch nicht dazu verpflichtet, HTML zu verwenden, Sie können auch nur reinen Text verwenden.

Beachten Sie, dass diese Funktion das Senden der E-Mail an mehrere Empfänger akzeptiert und auch das Anhängen mehrerer Dateien ermöglicht.

Ich habe dies nur in Python 2 ausprobiert, aber ich denke, es sollte auch in 3 gut funktionieren:

import os.path
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication

def send_email(subject, message, from_email, to_email=[], attachment=[]):
    """
    :param subject: E-Mail-Betreff
    :param message: Inhalt des E-Mail-Body (String), kann HTML/CSS oder reiner Text sein
    :param from_email: E-Mail-Adresse, von der die E-Mail gesendet wird
    :param to_email: Liste der E-Mail-Empfänger, Beispiel: ["a@a.com", "b@b.com"]
    :param attachment: Liste von Anhängen, Beispiel: ["file1.txt", "file2.txt"]
    """
    msg = MIMEMultipart()
    msg['Subject'] = subject
    msg['From'] = from_email
    msg['To'] = ", ".join(to_email)
    msg.attach(MIMEText(message, 'html'))

    for f in attachment:
        with open(f, 'rb') as a_file:
            basename = os.path.basename(f)
            part = MIMEApplication(a_file.read(), Name=basename)

        part['Content-Disposition'] = 'attachment; filename="%s"' % basename
        msg.attach(part)

    email = smtplib.SMTP('Ihr-SMTP-Host-Name.com')
    email.sendmail(from_email, to_email, msg.as_string())

Ich hoffe, das hilft! :-)

4voto

miksus Punkte 396

Ich weiß, dass dies eine alte Frage ist, aber ich dachte, es muss einen einfacheren Weg geben, dies zu tun als die anderen Beispiele, deshalb habe ich eine Bibliothek erstellt, die dies sauber löst, ohne Ihren Code zu verschmutzen. Das Einbinden von Anhängen ist super einfach:

from redmail import EmailSender
from pathlib import Path

# Konfigurieren eines E-Mail-Senders
email = EmailSender(
    host="", port=0,
    user_name="me@example.com", password=""
)

# Sende eine E-Mail
email.send(
    sender="me@example.com",
    receivers=["you@example.com"],
    subject="Eine Beispiel-E-Mail"
    attachments={
        "myfile.txt": Path("path/to/a_file.txt"),
        "myfile.html": "Inhalt eines HTML-Anhangs"
    }
)

Sie können auch direkt bytes anhängen, ein Pandas DataFrame (das je nach Dateierweiterung im Schlüssel konvertiert wird), ein Matplotlib Figure oder ein Pillow Image. Die Bibliothek bietet höchstwahrscheinlich alle Funktionen, die Sie für einen E-Mail-Sender benötigen (hat viel mehr als Anhänge).

Zur Installation:

pip install redmail

Verwenden Sie es, wie Sie möchten. Ich habe auch umfangreiche Dokumentation verfasst: https://red-mail.readthedocs.io/en/latest/

0 Stimmen

port=0 sieht aus wie ein lahmer Witz. Du solltest erwarten, dass einer der Ports 587, 465 oder 25 verwendet wird. Es ist wahrscheinlich besser, den E-Mail-Administrator oder die öffentliche Dokumentation des Dienstes zu konsultieren, den du verwenden möchtest.

0 Stimmen

@tripleee es ist nicht einmal ein Witz. Smtplib hat standardmäßig port=0. Unabhängig von Ihrer Meinung über den Port, wie man eine Verbindung zu einem bestimmten SMTP-Server herstellt, liegt außerhalb des Rahmens dieser Frage.

0 Stimmen

Hm, das habe ich heute gelernt. Danke, dass du mich darauf hingewiesen hast. Ich frage mich, was die Dokumentation von smtplib mit "OS default" meint; Ich vermute, dass es überall 25 sein muss?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X