E-Mail per Mail-Befehl im Python-Skript senden

Ich versuche, Text mit mehreren Zeilen zu senden:

text = "This is a line 1
This is a line 2
This is a line 3"

in einem Python-Skript mit:

cmd = "echo {} | mail -s 'Test email' [email protected]".format(text)
os.system(cmd) 

aber ich erhalte eine Fehlermeldung, weil neue Zeilen als Befehle interpretiert werden:

sh: line 1: This: command not found

ausdrucken, es ergibt sich:

echo This is line 1
This is line 2
This is line 3 | mail -s 'Test email' [email protected]

Ich denke, die Lösung ist einfach, aber ich habe keine nützliche Lösung gefunden.

🤔 А знаете ли вы, что...
Python позволяет создавать сценарии для автоматизации задач и обработки данных.


22
1

Antwort:

Gelöst

Das unmittelbare Problem besteht darin, dass Zeichenfolgen in der Shell in Anführungszeichen gesetzt werden müssen, wenn sie Zeilenumbrüche usw. enthalten. Siehe Wann eine Shell-Variable in Anführungszeichen gesetzt werden muss.

Aber im Grunde genommen willst du os.system hier wirklich nicht so verwenden. Wie die Dokumentation Ihnen bereits sagt, möchten Sie im Allgemeinen subprocess bevorzugen.

import subprocess

subprocess.run(
    ["mail", "-s", "Test email", "[email protected]"], 
    input=text, text=True, check=True)

oder verwenden Sie smtplib, um E-Mails nativ zu senden (oder verwenden Sie umgekehrt Python überhaupt nicht, wenn Sie nur ein einfaches Shell-Skript benötigen, obwohl Sie dann immer noch die Anführungszeichen korrigieren müssten).

mail ist schlecht portierbar. Wenn Sie dies also noch nicht auf Ihrem System getestet haben, kann es zu zusätzlichen Problemen kommen. Siehe vielleicht auch Wie sende ich eine Datei als E-Mail-Anhang über die Linux-Befehlszeile?