michelusmweiler
Anmeldungsdatum: 8. Januar 2009
Beiträge: 15
|
Hi, ich versuche die PHP mail Funktion zum Laufen zu bekommen, welche wohl im Hintergrund SSMTP nutzt. Scheitere aktuell jedoch daran und finde auch kaum Dokumentation dazu. Webserver (Apache 2.4 mit PHP 7.3) und Mailserver laufen lokal, sind jedoch über Internet erreichbar und beides funktioniert generell wunderbar. sendmail_path der php.ini ist gesetzt auf /usr/bin/ssmtp -t und dort befindet sich auch tatsächlich ssmtp.
/etc/ssmtp/ssmtp.conf sieht aktuell so aus:
# The user that gets all mail for userids less than 1000.
# If blank, address rewriting is disabled.
Root=
# The host to send mail to, in the form host | IP_addr [: port ]
# The default port is 25.
Mailhub=<MYDNS>:465
# The domain from which mail seems to come.
# For user authentication.
RewriteDomain=
# The full qualified name of the host.
# If not specified, the host is queried for its hostname.
Hostname=<MYDNS>
# Specifies whether the From header of an email, if any,
# may override the default domain. The default is NO
FromLineOverride=NO
# Specifies whether ssmtp uses TLS to talk to the SMTP server.
# The default is NO
UseTLS=YES
# Specifies whether ssmtp does a EHLO/STARTTLS before starting SSL negotiation.
# See RFC 2487.
UseSTARTTLS=NO
# The file name of an RSA certificate to use for TLS, if required.
TLSCert=
# The file name of an RSA key to use for TLS, if required.
TLSKey=
# A file of trusted certificates for validating the server, if required.
TLS_CA_File=
# A directory of trusted certificates for validating the server, if required.
TLS_CA_Dir=
# The user name to use for SMTP AUTH.
# The default is blank, in which case SMTP AUTH is not used.
AuthUser=<USER>
# The password to use for SMTP AUTH.
AuthPass=<PASSWORD>
# The authorization method to use.
# If unset, plain text is used.
# May also be set to cram-md5
authmethod=LOGIN
Problem ist die mail funktion gibt false zurück, im PHP log erscheint kein Fehler und die zugehörige HTTP Anfrage, welche das PHP ausgeführt hat gibt HTTP 504 TIMEOUT zurück. Die Mail kommt auch nicht an. Angehängt die Funktionierende SMTP Einstellung in Thunderbird. Ich muss es nur irgendwie hinbekommen SSMTP genau so einzustellen oder übersehe ich hier etwas? Bin offen für jegliche Vorschläge... MfG
- Bilder
|
shiro
Anmeldungsdatum: 20. Juli 2020
Beiträge: Zähle...
|
So ganz verstehe ich deine ssmtp.conf nicht. Wenn dein Mail Provider z.B. 1&1 ist, dein PHP hostname z.B. localPHPhost.com lautet und dein Mail-Account user@mydomain.de wäre, dann sollte der Inhalt etwa so aussehen:
Root=user@mydomain.de
Mailhub=smtp.1und1.de:465
RewriteDomain=mydomain.de
Hostname=localPHPhost.com
FromLineOverride=NO
UseTLS=YES
AuthUser=user@mydomain.de
AuthPass=<PASSWORD>
authmethod=LOGIN
|
michelusmweiler
(Themenstarter)
Anmeldungsdatum: 8. Januar 2009
Beiträge: 15
|
Hi und danke schonmal für die schnelle Rückmeldung. Dein Vorschlag geht so in die Richtung von allem was ich auch online an Infos finde, ist jedoch nicht mein Anwendungsfall. Ich habe meine eigene public Domain mit entsprechendem MX record zu der DNS.
Ich hoste zu dieser Domain meinen eigenen Mailserver.
Ich will mich nicht mit irgendeinem Drittanbieter verbinden um Mails zu verschicken.
Plan ist SSMTP sollte sich direkt per SSL/TLS mit meinem Mailserver verbinden und von der in der config hinterlegten Mail Mails an beliebige (von PHP adressierte) Empfänger schicken. Der Mailserver läuft zufällig auf dem selben host wie auch SSMTP selbst, das sollte aber irrelevant sein, denn ich habe die öffentlich erreichbaren Zugangsdaten des Servers in der config eingetragen, nix mit localhost o.Ä. Vielleicht verstehe ich auch falsch was SSMTP tut und was ich vor habe ist so nicht mit SSMPT möglich? Würde jedoch schon erwarten, dass SSMTP das kann, Thunderbird bekommt es schließlich auch hin. Vielleicht noch der Hinweis: Mein SMTP Benutzername zur Authentifizierung ist abweichend und unabhängig von jeglicher Mailadresse des Mailservers - könnte das ein Problem sein?
|
shiro
Anmeldungsdatum: 20. Juli 2020
Beiträge: Zähle...
|
SSMTP ist ein ganz simples Programm. Das was das macht, kannst du ja auch manuell z.B. mit telnet (HELO / EHLO usw) interaktiv eingeben. Das würde ich an deiner Stelle sowieso mal machen, um zu schauen, was dein SMTP Service so für Meldungen liefert. Also Beispiel (was du eingibst, habe ich gelb markiert):
$ telnet smtp.deinedomain.xyz 465
Trying 123.456.780.123...
Connected to smtp.deinedomain.xyz.
Escape character is '^]'.
220 hier meldet sich dein smtp service
EHLO mydomain.de
250-hier wird die mail domäne deines users begüßt [...ID...]
...
250 STARTTLS
AUTH LOGIN
334 VXNlcm5hbWU6 # das ist base64 und heißt Username
dXNlckBteWRvbWFpbi5kZQo= # das ist base64 und heißt user@mydomain.de
334 UGFzc3dvcmQ6 # das ist base64 und heißt Password
PFBBU1NXT1JEPgo= # das ist base64 und heißt <PASSWORD>
235 Authentication succeeded
...
# nun kannst du deine Mail eingeben mit MAIL FROM/RCPT TO/DATA/./QUIT (alles kalter Kaffee)
Natürlich verwendest du deine Host/Username/Passwort Daten, die du mit base64 behandeln musst. Sollte der Ablauf inhaltlich nicht dem entsprechen, was ich im Codeblock skizziert habe, kannst du an den Fehlermeldungen sehen, wo du dein Problem hast.
|
michelusmweiler
(Themenstarter)
Anmeldungsdatum: 8. Januar 2009
Beiträge: 15
|
Manuell per telnet? Das scheint bei mir nicht so ganz der Fall zu sein... Wenn ich das in einem Windows Terminal tue erscheint nur ein blinkender Cursor in einem leeren Fenster und nichts passiert, kann auch nichts eingeben.
"Trying... " taucht bei mir schon gar nicht auf. In der linux shell auf welchem auch das SSMPT läuft scheint kein telnet installiert "command not found ". Muss AuthPass in der ssmtp.conf base64 kodiert sein? Ich hätte da mal eine generelle Verständnisfrage, welche vielleicht auch zur Ursache des Problems führt: Woher weiß denn SSMTP mit "FromLineOverride=NO " den Absender, welchen es verwenden soll? Ich habe in der gesamten "ssmtp.conf " nirgends eine Absendermailadresse angegeben... woher kommt denn die dann? Root hab ich leer gelassen, denn ich will keine Kopien aller gesendeten Mails irgendwo haben.
Mailhub ist bei mir identisch mit Hostname gleich der Domain.
AuthUser hat in meinem Fall nichts mit dem Name des Absenders zu tun.
RewriteDomain habe ich auch leer, denn ich wüsste nicht was es im meinem Fall zu rewriten gibt wenn schon Mailhub & Hostname identisch sind, wenn dann müsste ich hier ein drittes mal die identische Domain angeben?
Wenn SSMTP davon ausgehen würde, dass der Absender AuthUser @Mailhub o.Ä. wäre, wäre diese Annahme in meinem Fall falsch. Muss ich vielleicht dann zwingend FromLineOverride=YES verwenden?
|
shiro
Anmeldungsdatum: 20. Juli 2020
Beiträge: Zähle...
|
Wenn ich das in einem Windows Terminal tue erscheint nur ein blinkender Cursor in einem leeren Fenster und nichts passiert, kann auch nichts eingeben. "Trying..." taucht bei mir schon gar nicht auf.
Das ist sehr merkwürdig. Wenn der Host nicht erreichbar ist, erhältst du sonst einen "No route to host " Fehler. Wenn der Port nicht ansprechbar ist, einen "Connection refused " Fehler. Da in meinem Beispiel ein Zertifikatsaustausch für die Transportverschlüsselung (macht man mit "openssl s_client -connect smtp.deinedomain.xyz:465 -starttls smtp ") auch noch nicht beschrieben ist, fallen diese Probleme eigentlich auch weg. Falls telnet nicht funktioniert bzw nicht vorhanden ist, kannst du ja mal schauen, ob der Server dir ein Zertifikat mit dem obigen openssl Befehl schickt.
Muss AuthPass in der ssmtp.conf base64 kodiert sein?
Nein.
Woher weiß denn SSMTP mit "FromLineOverride=NO" den Absender, welchen es verwenden soll?
Mit "NO" wir die Mail Adresse vom SMTP Client generiert (das kann z.B. der Wert von "AuthUser" sein). Bei "YES" wird dies aus der "MAIL FROM:" Angabe der erzeugten Mail übernommen. Wenn du dich mit einem andern User anmeldest, solltest du den Parameter auf "YES" setzen und in deinem Mail-Text eine "From:" Angabe haben.
Mailhub ist bei mir identisch mit Hostname gleich der Domain.
Hier ist halt der Rechnername (oder IP) mit Port anzugeben, die auch als Service existieren. Ob der Service dann STARTTLS unterstützt oder nicht, meldet er dann mit einer 250 Message.
AuthUser hat in meinem Fall nichts mit dem Name des Absenders zu tun.
s.o. meine Bemerkung zu "FromLineOverride".
RewriteDomain habe ich auch leer
Da würde ich aufpassen. Es gibt SMTP Server, die über die Domain prüfen, ob die Mail akzeptiert oder verworfen wird (Verhinderung von SPAM über Domain Sperrlisten). Auch wird die Information verwendet, wenn bei Fehlen des From Eintrags im Mail-Text der From Eintrag generiert wird (z.B. LoginUsername@RewriteDomain). Hilft natürlich nur bei "FromLineOverride=YES". Aber zurück zum merkwürdigen telnet Verhalten. Hast du mal den host per nslookup aufgelöst und angepingt? Schau mal, ob "openssl s_client -connect" eine Reaktion zeigt.
|
michelusmweiler
(Themenstarter)
Anmeldungsdatum: 8. Januar 2009
Beiträge: 15
|
shiro schrieb: Wenn du dich mit einem andern User anmeldest, solltest du den Parameter auf "YES" setzen und in deinem Mail-Text eine "From:" Angabe haben.
Done. Gesetzt auf "YES ". "From " sollte schon gesetzt sein. shiro schrieb: Da würde ich aufpassen. [...] Hilft natürlich nur bei "FromLineOverride=YES".
Done. RewriteDomain = Mailhub = Hostname gesetzt. shiro schrieb: Schau mal, ob "openssl s_client -connect" eine Reaktion zeigt.
Sieht gut aus, ja.
openssl s_client -connect <SNIP>:465
CONNECTED(00000004)
depth=2 C = US, O = Internet Security Research Group, CN = ISRG Root X1
verify return:1
depth=1 C = US, O = Let's Encrypt, CN = R3
verify return:1
depth=0 CN = <SNIP>
verify return:1
---
Certificate chain
0 s:/CN=<SNIP>
i:/C=US/O=Let's Encrypt/CN=R3
1 s:/C=US/O=Let's Encrypt/CN=R3
i:/C=US/O=Internet Security Research Group/CN=ISRG Root X1
2 s:/C=US/O=Internet Security Research Group/CN=ISRG Root X1
i:/O=Digital Signature Trust Co./CN=DST Root CA X3
---
Server certificate
-----BEGIN CERTIFICATE-----
<SNIP>
-----END CERTIFICATE-----
subject=/CN=<SNIP>
issuer=/C=US/O=Let's Encrypt/CN=R3
---
No client certificate CA names sent
Peer signing digest: SHA512
Server Temp Key: ECDH, P-256, 256 bits
---
SSL handshake has read 4722 bytes and written 383 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-GCM-SHA384
Server public key is 2048 bit
Secure Renegotiation IS supported
No ALPN negotiated
SSL-Session:
Protocol : TLSv1.2
Cipher : ECDHE-RSA-AES256-GCM-SHA384
Session-ID: <SNIP>
Session-ID-ctx:
Master-Key: <SNIP>
Key-Arg : None
PSK identity: None
PSK identity hint: None
TLS session ticket lifetime hint: 7200 (seconds)
TLS session ticket:
0000 - <SNIP>
Start Time: 1647811130
Timeout : 300 (sec)
Verify return code: 0 (ok)
---
220 <SNIP> ESMTP Postfix Übrigends bringt folgender Befehl nach ca. 5 min folgende Rückmeldung:
$ /usr/bin/ssmtp -v contact@<SNIP> < /<SNIP>/mail.txt
[<-]
ssmtp: Invalid response SMTP server
mail.txt sieht folgendermaßen aus:
From: admin@<SNIP>
Subject: Test
Blablabla
|
shiro
Anmeldungsdatum: 20. Juli 2020
Beiträge: 613
|
Done. RewriteDomain = Mailhub = Hostname gesetzt.
Hostname? Das sollte doch die Domäne des Benutzers sein. Hat sich beispielsweise der User "contact" angemeldet, hat der normalerweise ja keine eMail-Adresse. Wenn du einen Hostname einträgst, wird die FROM Mail-Adresse dieses Accounts zu "contact@Hostname". Bist du sicher das dies das ist, was du erreichen willst? Wenn du "RewriteDomain=mydomain.de" einträgst, hat der Account die Return-Mail-Adresse "contact@mydomain.de".
ssmtp: Invalid response SMTP server
Aha, das könnte schon ein Verweis auf deine Probleme sein. Ich würde aber gern systematisch bei dem manuellen Versenden einer Mail über STARTTLS weiter machen um zu sehen, welche detaillierteren Rückmeldungen vom Server kommen. Starte daher bitte die Verbindung noch mal aber diesmal für eine manuelle Interaktion, da dies mit Telnet ja nicht so erfolgreich war. Für die Authentifizierung habe ich im Unterschied zu vorher nur einen base64-String verwendet. Deine tatsächlich verwendete Mail-Adresse und das Passwort solltest du in den Variablen natürlich anpassen. Die Optionen "-starttls smtp" und "-crlf" sind wichtig. Die von dir einzugebenden Daten habe ich gelb markiert. Wie du sicher weißt, wird das Ende des Mail-Textes mit einem Punkt (".") in der ersten Spalte markiert. In dieser Zeile darf kein weiteres Zeichen mehr auftauchen.
$ mailAddr="contact@mydomain.de"
$ passWort="p@55w0rt"
$ echo -ne "\0$mailAddr\0$passWort" | base64
AGNvbnRhY3RAbXlkb21haW4uZGUAcEA1NXcwcnQ=
$ openssl s_client -connect smtp.meinedomain.xyz -port 465 -starttls smtp -crlf
CONNECTED(00000003)
...
220 ... ESMTP Postfix
250 STARTTLS
ehlo mydomain.de
250-meinedomain.xyz Hello mydomain.de [...IP...]
250-8BITMIME
250-AUTH LOGIN PLAIN
250 SIZE 140000000
AUTH PLAIN AGNvbnRhY3RAbXlkb21haW4uZGUAcEA1NXcwcnQ=
235 Authentication succeeded
mail from: <contact@mydomain.de>
250 Requested mail action okay, completed
rcpt to: <userexists@mydomain.de>
250 OK
data
354 Start mail input; end with <CRLF>.<CRLF>
From: "Willy Winzig" <contact@mydomain.de>
To: "Existierender User" <userexists@mydomain.de>
Subject: Ein Test mit STARTTSL
Hello world,
Das wurde transportverschlüsselt mit STARTTSL übertragen.
.
250 Requested mail action okay, completed: id=111111-2222222222-000000
quit
221 meinedomain.xyz Service closing transmission channel
closed
Sollten andere Meldungen vom Server kommen, so wären diese interessant. Die Meldungstexte können je nach verwendetem SMTP Service abweichen. Ich habe die Befehle übrigens in Kleinbuchstaben eingegeben, da ein großes "R" in bestimmten Fällen einen hier störenden einen ReConnect-Request auslöst (hängt von deinem SMTP Service ab und was du da konfiguriert hast).
|
michelusmweiler
(Themenstarter)
Anmeldungsdatum: 8. Januar 2009
Beiträge: 15
|
shiro schrieb: Bist du sicher das dies das ist, was du erreichen willst?
Ich glaube ja. Im ersten Schritt will ich per eines PHP Web-Kontaktformulars eine Mail von contact an contact schicken, sowohl Webserver als auch Mailserver laufen auf selben host.
$ openssl s_client -connect <SNIP> -port 465 -starttls smtp -crlf
no port defined
usage: s_client args
-host host - use -connect instead
-port port - use -connect instead
-connect host:port - who to connect to (default is localhost:4433)
-port scheint es nicht mehr zu geben... also hab ich den Port an den host angehängt:
$ openssl s_client -connect <SNIP>:465 -starttls smtp -crlf
CONNECTED(00000004)
ehlo <SNIP>
AUTH PLAIN <SNIP>
mail from: <contact@<SNIP>>
rcpt to: <admin@<SNIP>>
data
From: "Testabsender" <contact@<SNIP>>
To: "Testempfaenger" <admin@<SNIP>>
Subject: Testmail
Test
.
quit
# TIMEOUT - nichts passierte, keine Rückmeldung jeglicher Form bisher...
# Hatte einfach alles nacheinander eingegeben... DANN:
didn't found starttls in server response, try anyway...
write:errno=32
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 0 bytes and written 35 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
No ALPN negotiated
SSL-Session:
Protocol : TLSv1.2
Cipher : 0000
Session-ID:
Session-ID-ctx:
Master-Key:
Key-Arg : None
PSK identity: None
PSK identity hint: None
Start Time: 1647886650
Timeout : 300 (sec)
Verify return code: 0 (ok)
---
$ ehlo <SNIP>
-sh: ehlo: command not found
$ AUTH PLAIN <SNIP>
-sh: AUTH: command not found
$ mail from: <contact@<SNIP>>
-sh: syntax error near unexpected token `newline'
$ rcpt to: <admin@<SNIP>>
-sh: syntax error near unexpected token `newline'
$ data
-sh: data: command not found
$ From: "Testabsender" <contact@<SNIP>>
-sh: syntax error near unexpected token `newline'
$ To: "Testempfaenger" <admin@<SNIP>>
-sh: syntax error near unexpected token `newline'
$ Subject: Testmail
-sh: Subject:: command not found
$
$ Test
-sh: Test: command not found
$
$ .
-sh: .: filename argument required
.: usage: . filename [arguments]
$ quit
-sh: quit: command not found
$
Das Terminal scheint sich schon direkt nach "CONNECTED(00000004) " aufgehangen zu haben, sodass alles was ich danach eigegeben habe gepuffert wurde und keine Auswirkung hatte. Bis dann "didn't found starttls in server response, try anyway... " etc. kam und anschließend alles was ich eingegeben hatte als Terminalbefehl abgeschickt wurde (per SSH mit dem terminal verbunden).
didn't found starttls in server response
STARTTLS ? Ich bin mir ziemlich sicher kein STARTTLS zu nutzen. Ich hatte bereits im ersten Beitrag die funktionierende Thunderbird Konfiguration angehangen, dort zu sehen der Mailserver nutzt SSL/TLS , nicht STARTTLS , ging das irgendwie unter?
https://media-cdn.ubuntu-de.org/forum/attachments/14/11/9306014-SmtpConf.png P.S.: Danke auf jeden Fall schon mal für den offenbar fachkundingen Support...
|
shiro
Anmeldungsdatum: 20. Juli 2020
Beiträge: 613
|
STARTTLS? Ich bin mir ziemlich sicher kein STARTTLS zu nutzen.
Oh jeh ... Wer lesen kann ist klar im Vorteil. Mea culpa ... Hätte ich ja auch bereits an deinem Port erkennen müssen. Aber man ist manchmal blind. Ok, dann der neue Anlauf mit SSL/TLS:
$ mailAddr="contact@mydomain.de"
$ passWort="p@55w0rt"
$ echo -ne "\0$mailAddr\0$passWort" | base64
AGNvbnRhY3RAbXlkb21haW4uZGUAcEA1NXcwcnQ=
$ openssl s_client -connect smtp.meinedomain.xyz:465 -crlf
CONNECTED(00000003)
...
220 ... ESMTP Service ready
ehlo mydomain.de
250-meinedomain.xyz Hello mydomain.de [...IP...]
250-8BITMIME
250-AUTH LOGIN PLAIN
250 SIZE 140000000
AUTH PLAIN AGNvbnRhY3RAbXlkb21haW4uZGUAcEA1NXcwcnQ=
235 Authentication succeeded
mail from: <contact@mydomain.de>
250 Requested mail action okay, completed
rcpt to: <admin@mydomain.de>
250 OK
data
354 Start mail input; end with <CRLF>.<CRLF>
From: "Testabsender" <contact@mydomain.de>
To: "Testempfaenger" <admin@mydomain.de>
Subject: Testmail
Hello world,
Das wurde nun mit SSL/TLS übertragen.
.
250 Requested mail action okay, completed: id=111111-2222222222-000000
quit
221 meinedomain.xyz Service closing transmission channel
closed
$
Bitte füge die gelb markierte Eingabe erst ein, wenn seitens des SMTP Servers eine Meldung erschienen ist (z.B. 200 - 399). Erst wenn diese Meldung erschienen ist, ist der SMTP Service bereit eine Eingabe zu akzeptieren. Der gemeldete Status sagt auch aus, was/ob ein Problem mit der vorherigen Eingabe aufgetreten ist.
|
michelusmweiler
(Themenstarter)
Anmeldungsdatum: 8. Januar 2009
Beiträge: 15
|
Eine neue E-Mail im Posteingang! Frage ist nun wie setze ich das Folgende in SSMTP um?
$ authName="Administrator"
$ authPass="<SNIP>"
$ echo -ne "\0$authName\0$authPass" | base64
<SNIP>
$ openssl s_client -connect <SNIP>:465 -crlf
CONNECTED(00000004)
depth=2 C = US, O = Internet Security Research Group, CN = ISRG Root X1
verify return:1
depth=1 C = US, O = Let's Encrypt, CN = R3
verify return:1
depth=0 CN = <SNIP>
verify return:1
---
Certificate chain
0 s:/CN=<SNIP>
i:/C=US/O=Let's Encrypt/CN=R3
1 s:/C=US/O=Let's Encrypt/CN=R3
i:/C=US/O=Internet Security Research Group/CN=ISRG Root X1
2 s:/C=US/O=Internet Security Research Group/CN=ISRG Root X1
i:/O=Digital Signature Trust Co./CN=DST Root CA X3
---
Server certificate
-----BEGIN CERTIFICATE-----
<SNIP>
-----END CERTIFICATE-----
subject=/CN=<SNIP>
issuer=/C=US/O=Let's Encrypt/CN=R3
---
No client certificate CA names sent
Peer signing digest: SHA512
Server Temp Key: ECDH, P-256, 256 bits
---
SSL handshake has read 4722 bytes and written 383 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-GCM-SHA384
Server public key is 2048 bit
Secure Renegotiation IS supported
No ALPN negotiated
SSL-Session:
Protocol : TLSv1.2
Cipher : <SNIP>
Session-ID: <SNIP>
Session-ID-ctx:
Master-Key: <SNIP>
Key-Arg : None
PSK identity: None
PSK identity hint: None
TLS session ticket lifetime hint: 7200 (seconds)
TLS session ticket:
0000 - <SNIP>
Start Time: 1647977774
Timeout : 300 (sec)
Verify return code: 0 (ok)
---
220 <SNIP> ESMTP Postfix
ehlo <SNIP>
250-<SNIP>
250-PIPELINING
250-SIZE 10485760
250-ETRN
250-AUTH PLAIN LOGIN
250-AUTH=PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
auth plain <SNIP>
235 2.7.0 Authentication successful
mail from: <contact@<SNIP>>
250 2.1.0 Ok
rcpt to: <admin@<SNIP>>
250 2.1.5 Ok
data
354 End data with <CR><LF>.<CR><LF>
From: "Testabsender" <contact@<SNIP>>
To: "Testempfaenger" <admin@<SNIP>>
Subject: Testmail
Text
.
250 2.0.0 Ok: queued as 1F13D12A00B3
quit
221 2.0.0 Bye
closed
Ich vermute das Problem / Missverständnis ist die variable mailAddr zur Authentifizierung. Das ist in meinem Fall keine Mailadresse, sondern ein Benutzername (deshalb habe ich es oben authName genannt). Welche Variable ist dies in der ssmtp.conf ? AuthUser ? Diesen habe ich bereits korrekt gesetzt.
|
shiro
Anmeldungsdatum: 20. Juli 2020
Beiträge: 613
|
Eine neue E-Mail im Posteingang!
Na, da ist doch erst mal eine erfreuliche Nachricht.
... variable mailAddr zur Authentifizierung ... Welche Variable ist dies in der ssmtp.conf? AuthUser? Diesen habe ich bereits korrekt gesetzt.
Ja, zur Authentifizierung wird die Variable "AuthUser" aus der ssmtp.conf verwendet
Frage ist nun wie setze ich das Folgende in SSMTP um?
Du kannst natürlich "ssmtp" nutzen, aber mit dem gewonnenen Wissen auch dies alles mit gawk realisieren. Ich mal mal nur so aus Spaß das folgende kleine Bash script "smtp.sh" beigefügt:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107 | #!/bin/bash
# --- smtp.sh --- Dieses Script sendet die Datei $1 als eMail über SSL/TLS Transportverschlüsselung
# $1: Mail-Datei (wenn kein $1 angegeben, wird der Datei-Inhalt von stdin gelesen)
# Beispiel einer Mail Datei:
# From: "Testabsender" <absender@mydomain.de>
# To: "Testempfaenger" <empfaenger@mydomain.de>
# Subject: Testmail
#
# Mail Message Text
#
#
#set -x
# --- Konfigurationsdaten des SMTP-Clients ------------------------------------------
SMTPhostName="smtp.meinedomaene.xyz"
SMTPhostPort="465"
#SMTPauthUser="admin@mydomain.de"
SMTPauthUser="Administrator"
SMTPauthPass="p@55W0rt"
#logfile="/dev/null"
logfile="smtp.log"
#logfile="/dev/stdout"
#------------------------------------------------------------------------------------
authPlain=$(echo -ne "\0$SMTPauthUser\0$SMTPauthPass" | base64)
SMTPservice="openssl s_client -connect $SMTPhostName:$SMTPhostPort -crlf"
SMTPclient="$(hostname)"
mailFile="$1"
mailFileDel=false
if [ -z "$mailFile" ]; then
mailFile="/tmp/mailFile.$$"
cat - >"$mailFile"
mailFileDel=true
fi
SMTPfrom="$(grep -i '^from: ' ""$mailFile"" | sed 's/^from: //i')"
SMTPto="$(grep -i '^to: ' ""$mailFile"" | sed 's/^to: //i')"
if [ -n "$SMTPfrom" ] && [ -n "$SMTPto" ]; then
cat "$mailFile" | gawk \
-v smtp="$SMTPservice" \
-v domain="$SMTPclient" \
-v auth="$authPlain" \
-v from="$SMTPfrom" \
-v to="$SMTPto" \
'function rdline(code, msg){
$1=""
while ( $1 != code ){
if ( (strtonum($1) == substr($0,1,3)) && (substr($0,4,1) == " ") ) {
print "ABBRUCH: Unerwartete Antwort"
abort=1
exit
}
smtp |& getline
print $0
}
if ( msg != "") {
print msg
print msg |& smtp
}
}
BEGIN{
n=match(from,"([^<]*)<*([^>]*)",a)
if ( a[2] == "" ){
from=a[1]
} else {
from=a[2]
}
n=match(to,"([^<]*)<*([^>]*)",a)
if ( a[2] == "" ){
to=a[1]
} else {
to=a[2]
}
PROCINFO[smtp,"READ_TIMEOUT"]=6000 # 6 sek Read-Timeout
abort=0
$1=""
rdline("220","ehlo " domain)
rdline("250","auth plain " auth)
rdline("235","mail from: " from)
rdline("250","rcpt to: " to)
rdline("250","data")
rdline("354","")
}
{
print $0
print $0 |& smtp
}
END{
if ( abort ) exit
printf "\n.\n"
printf "\n.\n" |& smtp
rdline("250","quit")
smtp |& getline
print $0
if ( $1 == "221") {
print "closed"
}
}' >"$logfile" 2>&1
else
echo "*** ERROR ***: From:>$SMTPfrom<, To:>$SMTPto<"
fi
$mailFileDel && [ -e "$mailFile" ] && rm "$mailFile"
set +x
|
Das obige Script kann dann entweder mit einer Mail-Datei als Parameter aufgerufen werden oder wie im folgenden Beispiel über eine Pipe versorgt werden:
| $ chmod 755 smtp.sh
$ echo "From: "Kontakt Testuser" <contact@mydomain.de>
To: admin@mydomain.de
Subject: Testmail
Diese ist über ein Bash-Script als SSMTP Ersatz versendet worden.
Ende" | ./smtp.sh
$ cat smtp.log
|
|
michelusmweiler
(Themenstarter)
Anmeldungsdatum: 8. Januar 2009
Beiträge: 15
|
shiro schrieb: Ich mal mal nur so aus Spaß das folgende kleine Bash script "smtp.sh" beigefügt
Danke dafür, sieht auf jeden Fall brauchbar aus, behalte ich mal in der Hinterhand. Da ich jedoch das ganze (in diesem Fall) per PHP ansprechen will würde ich wahrscheinlich eher zu so etwas wie https://github.com/PHPMailer/PHPMailer tendieren. shiro schrieb: Du kannst natürlich "ssmtp" nutzen
Das..... bringt mich zurück zur eigentlichen Frage dieses Beitrags... wie??? michelusmweiler schrieb: ich versuche die PHP mail Funktion zum Laufen zu bekommen, welche wohl im Hintergrund SSMTP nutzt.
Scheitere aktuell jedoch daran und finde auch kaum Dokumentation dazu.
Ich bekomme es ja nicht hin! Mit allen Erkenntnissen bisher - funktioniert die PHP mail Funktion immer noch nicht.
|
shiro
Anmeldungsdatum: 20. Juli 2020
Beiträge: 613
|
Ich bekomme es ja nicht hin!
Hmm, es sind sehr viele Jahre her, dass ich mal im Rahmen der LAMP Hype mit PHP Mails versendet habe. Ob das bei den heute gängigen Versionen noch funktioniert weiß ich nicht. Damals brauchte man nur die interne PHP mail() Funktion aufrufen:
| <?php
mail($emailTO, $subject, $emailBODY, "From: Kontakt <contact@mydomain.de>");
?>
|
Mittlerweile nehmen die Leute wohl das PHPmailer Objekt, was wohl ähnlich funktioniert aber mehr Einstellmöglichkeiten hat. Kann sein, dass die PGP mail() Funktion diese Security Randbedingungen nicht mehr liefert. Welche Version von PHP nutzt du denn? Verwendest du PHPMailer? Welche Meldungen erhältst du im /var/log Verzeichnis, wenn du eine Mail versenden willst?
Mein Versuch, per PHP mail() eine Mail zu versenden schlug mit Fehlermeldung 554 fehl. Mein Provider blockt den Mail-Versand, da er SPAM zu erkennen glaubt. Was sagen denn deine Fehlermeldungen bei "/var/log/mail*" ? Wenn alle Stricke reissen, kannst du ja auch mal testen, ob es mit der PHP exec() Funktion besser klappt, z.B.:
| <?php
$output = shell_exec('sendmail admin@mydomain.de < /tmp/email.txt');
echo "$output";
?>
|
|
michelusmweiler
(Themenstarter)
Anmeldungsdatum: 8. Januar 2009
Beiträge: 15
|
shiro schrieb: Welche Version von PHP nutzt du denn?
michelusmweiler schrieb: Webserver (Apache 2.4 mit PHP 7.3) und Mailserver laufen lokal, sind jedoch über Internet erreichbar und beides funktioniert generell wunderbar.
shiro schrieb: Verwendest du PHPMailer?
Aktuell noch nicht, das wäre mein Plan B.
Welche Meldungen erhältst du im /var/log Verzeichnis, wenn du eine Mail versenden willst?
In dem Verzeichnis gibt es weder Ordner noch Dateien mit mail*. Das funktioniert:
| $ sendmail contact@<SNIP>
From: admin@<SNIP>
To: contact@<SNIP>
Subject: test
text
.
|
Das funktioniert fast. Es kommt eine leere Mail an von http@<SNIP> (http ist wahrscheinlich der PHP user), jedoch ohne Empfänger, ohne Betreff und ohne Inhalt.
| $mailCmd = "sendmail contact@<SNIP>\n" .
"From: admin@<SNIP>\n" .
"To: contact@<SNIP>\n" .
"Subject: Kontaktformular: " . $_POST["topic"] . "\n\n" .
"Client: " . $_SERVER['REMOTE_ADDR'] . "\nSender: " . $_POST["sender"] . "\n---\n\n" . $_POST["message"] .
"\n\n.\n";
shell_exec($mailCmd);
);
|
Um auszuschließen, dass der PHP Variablenzugriff ein Problem ist habe ich mir $mailCmd auch ausgegeben, sieht gut aus. Möglicherweise ein Problem weil Mehrzeilig? So oder so - sendmail funktioniert generell, PHP mail jedoch nicht (nach wie vor HTTP504). Kann das noch falsch sein? michelusmweiler schrieb: sendmail_path der php.ini ist gesetzt auf /usr/bin/ssmtp -t und dort befindet sich auch tatsächlich ssmtp.
|