Modifizierte E-Mails mit Python versenden

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
Antworten
XooHooX
User
Beiträge: 4
Registriert: Freitag 17. Mai 2019, 13:53

Hallo liebe Community,

auch wenn es schon viele Beiträge zu diesem Thema im Internet gibt, habe ich diesen Beitrag erstellt, um Hilfe bei einem spezifischeren Problem zu bekommen.

Hier das Problem: Ich muss von der (unten in html-Code angegebenen) Website aus die Daten, die die User in die dort vorhandenen Zeilen eintragen, an die auch dort eingetragene E-Mail-Adresse sowie auch an meine E-Mail aus senden lassen. Das heißt dass die User und ich, als Administrator, eine Art "Anmeldebestätigung" per Mail zugesendet bekommen (in der etwas steht wie "Danke für deine Anmeldung. Hier nochmal deine Daten im Überblick: Name: xy Phone: 1234 Chosen Event: blablabla") sobald sie ihre Daten in die html-Textfelder eingetragen haben.

Hier der Code:
SIGNUP =
"""<html>
<head>
<br>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<style>
body {margin: 0;}

ul.topnav {
list-style-type: none;
margin: 0;
padding: 0;
overflow: hidden;
background-color: #333;
}

ul.topnav li {float: left;}

ul.topnav li a {
display: block;
color: white;
text-align: center;
padding: 14px 16px;
text-decoration: none;
}

ul.topnav li a:hover:not(.active) {background-color: "black";}

ul.topnav li a.active {background-color: "black";}

ul.topnav li.right {float: right;}

@media screen and (max-width: 600px) {
ul.topnav li.right,
ul.topnav li {float: none;}
}
</style>

<ul class="topnav">
<li><a class="active" href="nicht wichtig">egal</a></li>
<li><a href="nicht wichtig">egal</a></li>
<li><a href="nicht wichtig">egal</a></li>
<li><a href="nicht wichtig">egal</a></li>
</ul>

<div style="padding:0 16px;">

</div>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<title>My Example</title>

<!-- CSS -->
<style>
.myForm {
font-family: "Lucida Sans Unicode", "Lucida Grande", sans-serif;
font-size: 0.8em;
width: 30em;
padding: 1em;
border: 1px solid #ccc;
}

.myForm * {
box-sizing: border-box;
}

.myForm fieldset {
border: none;
padding: 0;
}

.myForm legend,
.myForm label {
padding: 0;
font-weight: bold;
}

.myForm label.choice {
font-size: 0.9em;
font-weight: normal;
}

.myForm label {
text-align: left;
display: block;
}

.myForm input[type="text"],
.myForm input[type="tel"],
.myForm input[type="email"],
.myForm input[type="datetime-local"],
.myForm select,
.myForm textarea {
float: right;
width: 60%;
border: 1px solid #ccc;
font-family: "Lucida Sans Unicode", "Lucida Grande", sans-serif;
font-size: 0.9em;
padding: 0.3em;
}

.myForm textarea {
height: 100px;
}

.myForm input[type="radio"],
.myForm input[type="checkbox"] {
margin-left: 40%;
}

.myForm button {
padding: 1em;
border-radius: 0.5em;
background: #eee;
border: none;
font-weight: bold;
margin-left: 40%;
margin-top: 1.8em;
}

.myForm button:hover {
background: #ccc;
cursor: pointer;
}
</style>

</head>
<body>

<form class="myForm" method="post" enctype="application/x-www-form-urlencoded" action="/html/codes/html_form_handler.cfm">

<p>
<label>Name
<input type="text" name="customer_name" required>
</label>
</p>

<p>
<label>Phone
<input type="tel" name="phone_number">
</label>
</p>

<p>
<label>Email
<input type="email" name="email_address">
</label>
</p>

<p>
<label>Chosen events
<input type="events" name="event_names">
</label>
</p>

<!--
<fieldset>
<legend>Which event do you want to sign up for?</legend>
<p><label class="choice"> <input type="radio" name="taxi" required value="FAIRstrickt"> FAIRstrickt </label></p>
<p><label class="choice"> <input type="radio" name="taxi" required value="Soirée Cabaret"> Soirée Cabaret </label></p>
<p><label class="choice"> <input type="radio" name="taxi" required value="Move your idea"> Campusfest </label></p>
</fieldset>
-->


<style>
.button {
position: left;
background-color:#111;
border: none;
color: black;
padding: 15px 25px;
text-align:"left";
font-size: 15px;
cursor: pointer;
}

.button:hover {
background-color: '111';
}
</style>

<button class="button">Sign up</button>


</form>

</body>
</html>"""

Ich habe schon mehrmals versucht den Code selber zu schreiben, nur will er einfach nie funktionieren, deshalb wende ich mich jetzt an euch. :|
Bei fragen stehe ich euch natürlich gerne zur Verfügung. Sofern aber schon einmal vielen Dank für's Ansehen!

MfG XooHooX
Benutzeravatar
sparrow
User
Beiträge: 4144
Registriert: Freitag 17. April 2009, 10:28

Bitte setze Code in Code-Tags (der </> Button im vollständigen Editor.

Ich sehe hier im Moment keinen Bezug zu Python. Wo genau besteht der denn?
Benutzeravatar
__blackjack__
User
Beiträge: 12984
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Sparrow: Naja, das ist schon fast gültiger Python-Code. Da wird eine HTML-Seite in einem Zeichenkettenliteral an den Namen SIGNUP gebunden. Man muss halt nur dafür sorgen dass da nach dem ``=`` am Anfang entweder ein Zeilenumbruch ist, die Zeichenkette in Klammern gesetzt wird (mit der öffnenden auf der gleichen Zeile wie die Zuweisung), oder das ein \ dafür sorgt das die Zeile ”logisch” noch nicht beendet ist. :-)

@XooHooX: Mal angenommen Du würdest diese Seite per Python ausliefern, dann sendet der Browser seine Antwort aber anscheinend an etwas das in ColdFusion geschrieben ist‽

Einerseits ist das mit dem ganzen für das Problem unnötigen Zeug im HTML zu umfangreich, andererseits fehlen die wichtigen Informationen. Und E-Mails mit Python versenden ist dann auch wieder ziemlich unabhängig davon wo denn die Werte für die Mail her kommen.

Und `/html/codes/html_form_handler.cfm` sieht auch verdächtig nach einem Pfad auf Deinem Rechner aus und nicht nach einer URL mit der der Webserver etwas anfangen könnte.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
XooHooX
User
Beiträge: 4
Registriert: Freitag 17. Mai 2019, 13:53

Erst einmal vielen Dank für die schnellen Antworten!

Um möglicherweise etwas Klarheit zu schaffen sende ich euch einmal den Link zu meinem Projekt:
xoohoox.pythonanywhere.com/SIGNUP

Das verdeutlicht vielleicht nochmal die Ausgangslage.
Wie gesagt sollen nach der Eingabe der Daten Anmelde-Bestätigungs-Emails an die eingetragenen Adressen versendet werden.

@Sparrow : Der Bezug zu Python liegt daran, dass mein Professor an der Uni (ESB Business School: siehe Link) uns Studierende in Gruppen eingeteilt hat in denen wir eine Web-Anwendung programmieren müssen (als BWL'ler nach einer Blockwoche programmieren...). In dieser Gruppe bin ich für Python zuständig.
Fernab dessen habe ich aber kein Problem damit die E-mails auch durch andere Sprachen verschicken zu lassen. Hauptsache es funktioniert!

@__blackjack__ : ColdFusion ist mir nicht bekannt. Aufgrund meiner mangelnden Programmierkenntnisse kann ich da leider nicht weiterhelfen. Deshalb habe ich den Link jetzt mit in die Antwort gepackt, vielleicht kann dieser weiterhelfen.
Benutzeravatar
__blackjack__
User
Beiträge: 12984
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@XooHooX: ColdFusion ist mir auch nur dem Namen nach bekannt, aber *Du* hast beim `action`-Attribut von dem <form> den Wert "/html/codes/html_form_handler.cfm" angegeben und *.cfm ist soweit ich weiss die Dateiendung von ColdFusion.

Die HTML-Seiten sind übrigens alle mehr oder weniger kaputt. Das solltest Du mindestens in so weit reparieren das Umlaute und andere Sonderzeichen richtig angezeigt werden. Mach da ordentliche HTML5-Seiten draus, dann ist schon mal halbwegs sichergestellt das die meisten Browser kaputtes HTML in der Seite gleich interpretieren, und das mit <head> und <body> sollte doch nicht so schwer sein, damit ein <meta> das die Zeichenkodierung angibt, auch ausgewertet werden kann.

Dann verstehe ich nicht so recht warum am Anfang CSS definiert wird, dann aber doch bei gefühlt jedem Element noch mal irgendwas mit `style`-Attributen gemacht wird. Und dann auch zusätzlich noch `align`-Attribute – was man heutzutage auch eher über CSS lösen würde.

Bilder die lokal bei Dir auf dem Rechner liegen kannst Du auch nicht per ``file://``-URL einbinden. Also nicht wenn das ausser Dir auf Deinem Rechner jemand sehen können soll. ;-) Du solltest das auch beim entwickeln lokal über einen lokalen Webserver testen, damit so etwas nicht passiert.

Was ungünstig ist, ist das in allen HTML-Seiten der gleiche Code für die Navigationsleiste steht, und auch das CSS dafür ist in jeder Datei vorhanden. Das CSS kann und sollte man einfach in eine Datei auslagern. Und bei der Navigationsleiste sollte man sich mindestens lokal überlegen das zu trennen und per Skript zusammen zu bauen, so dass man bei Veränderungen in dem Teil der für alle Seiten gleich ist, jede Datei ändern muss, und das dann auch immer gleich. Das ist mühsam und fehleranfällig.

Und nun zum Problem mit den Mails: Du musst halt irgendwas hinter der `action`-URL haben was keine statische HTML-Seite ist, sondern ein Programm das die Formulardaten entgegen nimmt und eine Mail verschickt. Da ist dann die Frage über welches Rahmenwerk Du das machen willst. Mal so übliche Verdächtige von klein bis gross: Bottle, Flask, oder Django. Wenn da wirklich nur eine Mail verschickt werden soll, dann ist Django natürlich Overkill. Da würde ich wahrscheinlich zu Bottle greifen.

Zum Mail verschicken kann man sich etwas mit `smptlib` und `email` aus der Standardbibliothek basteln. Ich persönlich mach das externe `marrow.mailer` ganz gern, aber das ist vielleicht auch schon wieder Overkill für Deine Zwecke.

Andererseits: Wenn Du sowieso ein Web-Rahmenwerk verwendets, und wenn es nur Bottle ist, könnte man die anderen Seiten auch gleich darüber ausliefern lassen und das Problem mit den Codewiederholungen im HTML durch Templates lösen.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
XooHooX
User
Beiträge: 4
Registriert: Freitag 17. Mai 2019, 13:53

@__blackjack__ Den html-Code hat ein anderes Gruppenmitglied verfasst (deren Bilder-Pfade auch im Code noch zu finden sind, worauf ich sie aber schon angesprochen habe). Danke aber für die Tipps, ich werde sie darauf ansprechen.

Nachher wird sich unsere Gruppe noch einmal treffen um eine SQL-Database (auch Bestand unsere Aufgabe) zu erstellen und damit dann die Mails versenden zu können. Ist SQL in deinen Augen auch hilfreich im Vergleich zu Bottle, Flask oder Django?

Aufgrund der eigentlich so simpel klingenden Aufgabe dachte ich es wäre einfacher dieses Problem zu lösen, jetzt warte ich aber erstmal unsere Gruppenarbeit später ab.
Benutzeravatar
__blackjack__
User
Beiträge: 12984
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@XooHooX: SQL im Vergleich zu Bottle, Flask, oder Django ist im Grund Äpfel und Birnen. Und mit E-Mails versenden hat SQL auch nichts zu tun. Wobei man sich beim Webrahmenwerk vielleicht schon vorher schon Gedanken machen sollte welches man wählt. Denn zumindest Django hat als eierlegende Wollmilchsau ja bereits ein ORM dabei, was einen nicht mehr so ganz frei im Datenbankentwurf sein lässt und damit will/wird man auch keine eigenen SQL-Abfragen mehr schreiben, sondern eben das ORM verwenden. Das muss man beim Entwurf der Datenbank aber halt auch im Auge behalten.

Und auch bei Bottle oder Flask würde man sich in der Regel ein ORM dazu nehmen. SQLAlchemy beispielsweise.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
XooHooX
User
Beiträge: 4
Registriert: Freitag 17. Mai 2019, 13:53

@__blackjack__: In Ordnung, dann werde ich mir die von dir angesprochenen Verbesserungsvorschläge zu Herzen nehmen und schauen ob ich selber eine Lösung finde.
Vielen Dank für deinen/euren Einsatz!
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

__blackjack__ hat geschrieben: Sonntag 19. Mai 2019, 11:21Denn zumindest Django hat als eierlegende Wollmilchsau ja bereits ein ORM dabei, was einen nicht mehr so ganz frei im Datenbankentwurf sein lässt und damit will/wird man auch keine eigenen SQL-Abfragen mehr schreiben, sondern eben das ORM verwenden.
Naja, bei Queries die sich schlecht zu models mappen lassen wie Aggregationen oder einfach Queries die eine Gewisse Komplexität überschreiten ist es doch wesentlich einfacher SQL direkt zu nutzen. Wenn man größeren Datenmengen (100k Zeilen und mehr) möglichst schnell in eine Datenbank schreiben möchte ist man auch gut geraten damit das ORM soweit wie möglich zu umgehen.
Benutzeravatar
__blackjack__
User
Beiträge: 12984
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@DasIch: Das ändert aber nichts daran das man beim DB-Entwurf das ORM berücksichtigen sollte, sonst kann man das am Ende gar nicht verwenden. Und wenn man das Django-ORM nicht verwendet, stellt sich fast schon die Frage ob/warum man Django verwenden will/sollte. Und die Aufgabenbeschreibung klingt nicht so als wenn das keinen Sinn machen würde das mit dem ORM zu machen.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Antworten