[PHP]Mail senden per SMTP über Socket

DJPaschi

Digenis Progger
ID: 49867
L
19 Juni 2006
103
6
Moin,
ich habe ein Script geschrieben welches über Socket zu einem Mail-Server verbindet und das ganze dann rüber schickt.
Ich habe gerade allerdings das problem das er mir zurückmeldet:
550 relay not permitted
Allerdings kommt dieser Fehler nur wenn ich Mails schicke die praktisch außerhalb des Mailservers liegen.
Jetzt kommt sicherlich von einigen die Frage du darfst vielleicht einfach keine Mails nach Außerhalb schicken.

Allerdings kann ich dies im Outlook ja auch und habe bereits mit dem Hoster gesprochen und bei denen liegt kein fehler vor und sie erlauben dies auch.

habe hier mal den Code wer mir helfen kann wäre echt nett.
PHP:
<?
function mailer($email,$subject,$text){
	$sender="xxxx";
	$smtpsrv="smtp.1blu.de";
	$pop3srv="pop3.1blu.de";
	$port=25;
	$pop3port=110;
	$auth="ja";
	$username="xxxxx";
	$passwort="xxxxx";
	$hdr="From: ".$sender."\r\n";
	$hdr.="To: ".$email."\r\n";
	$hdr.="Subject: ".$subject."\r\n";
	$hdr.= "MIME-Version: 1.0\r\n";
	$hdr.= "Content-type: text/html; charset=iso-8859-1\r\n";
	$hdr.="X-Mailer: PHP/" . phpversion(). "\r\n";

	if ($auth=='ja'){
		$fp=fsockopen($pop3srv,$pop3port);
		fputs($fp, $username."\r\n");
		$result = fgets($fp, 1024);
		if (!substr($result,0,3)=="+OK"){
				die("Login ERROR 1");
		}
		fputs($fp, $passwort."\r\n");
		$result = fgets($fp, 1024);
		if (!substr($result,0,3)=="+OK"){
				die("Login ERROR 1");
		}
	}

	$fp = fsockopen($smtpsrv, $port);
	$banner = fgets($fp, 1024);
	
	fputs($fp, "HELO ".$_SERVER['SERVER_NAME']."\r\n");
	$result = fgets($fp, 1024);
	if ($result+0 != 250 AND $result+0 != 220)
		die("HELO Statuscode: $result");
	
	fputs($fp, "MAIL FROM: <".$sender.">\r\n");
	$result = fgets($fp, 1024);
	if ($result+0 != 250 AND $result+0 != 334)
		die("MAIL FROM Statuscode: $result");

	fputs($fp, "RCPT TO: <".$email.">\r\n");
	$result = fgets($fp, 1024); 
	if ($result+0 != 250 AND $result+0!=235)
		die("RCPT TO: Statuscode: $result");

	fputs($fp, "DATA\r\n");
	$result = fgets($fp, 1024);
	if ($result+0!=354 AND $result+0!=250)
		die("DATA: Statuscode: $result");
	fputs($fp, $hdr);
	fputs($fp, $text."\r\n");
	fputs($fp, ".\r\n");
	$result = fgets($fp, 1024);
	if ($result+0 != 250)
		die("DATA(end): Statuscode falsch: $result");
	fputs($fp, "QUIT\r\n");
}
?>

Danke und Gruss
DJPaschi
 
Wird der Server wohl SMTP-Auth verlangen.

edit:
Um das böse "$result+0" zu vermeiden, solltest du substr() benutzen ;)
 
ja das tut er auch deswegen habe ich da ja versucht ein smtp after pop da sämtliche anderen auth methoden er ablehnt warum auch immer
 
Nicht am POP3 anmelden, sondern am SMTP.
D.h. du machst EHLO und dann AUTH LOGIN und erst, wenn du authenfiziert bist, beginnst du mit MAIL FROM.
 
und genau bei AUTH LOGIN sagt er ist nicht macht er nicht

das hatte ich anfangs ja gemacht ... aber das wollte er nicht authentifizierung verweigert oder so
 
das hatte ich anfangs ja gemacht ... aber das wollte er nicht authentifizierung verweigert oder so
Dann gibts zwei Möglichkeiten:

  • Username und/oder Passwort falsch (wohl zu 99% dran schuld)
  • der Server unterstützt das AUTH-Feature nicht (das findest du mit dem EHLO raus; da sagt dir der Server, welche Arten von Authentifizierung er alles unterstützt)
 
kannst du mir dann bei AUTH LOGIN mal kurz den genauen ablauf schildern und wie ich was machen muss?
ich habe bisher immer folgendes gemacht ind er reinfolge
AUTH LOGIN \n
username (base64 kodiert)\n
passwort (base64 kodiert)\n

ist das richtig oder falsch ? oder vergess ich dabei was?
 
ich habe bisher immer folgendes gemacht ind er reinfolge
AUTH LOGIN \n
username (base64 kodiert)\n
passwort (base64 kodiert)\n
Du musst immer die Antwort abwarten und dem Server nicht ins Wort fallen.
Erst AUTH LOGIN senden. Der Server fragt dich dann base64-kodiert nach dem Usernamen. Gib ihm den Usernamen dann base64-kodiert und erwarte die base64-kodierte Frage nach dem Passwort. Sende auch dieses entsprechend.
Danach solltest du 235 kriegen.

Beispiel:
Code:
[COLOR=Red]EHLO test[/COLOR]
[COLOR=SeaGreen]250-serverirgendwas
250-PIPELINING
250-SIZE 629145600
250-VRFY
250-ETRN
250-AUTH LOGIN DIGEST-MD5 PLAIN CRAM-MD5 GSSAPI
250-AUTH=LOGIN DIGEST-MD5 PLAIN CRAM-MD5 GSSAPI
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
[COLOR=Red]AUTH LOGIN[/COLOR]
334 VXNlcm5hbWU6 [I][COLOR=Gray]Username:[/COLOR][/I]
[COLOR=Red]d4VfM6MhccE= [/COLOR][/COLOR][COLOR=Gray][I]*****[/I][/COLOR][COLOR=SeaGreen]
334 UGFzc3dvcmQ6[/COLOR][COLOR=SeaGreen][I][COLOR=Gray] Password:[/COLOR][/I][/COLOR]
[COLOR=SeaGreen][COLOR=Red]3fbngt7uhjY= [/COLOR][/COLOR][COLOR=Gray][I]*****[/I][/COLOR][COLOR=SeaGreen]
235 2.0.0 Authentication successful
[COLOR=Red]MAIL FROM:<foo@example.com>[/COLOR][/COLOR]
...
 
ich muss hier nun noch mal ran ... stehe irgendwie seit tagen bisschen auf dem schlauch ...
ich kriege es gerade gar nicht hin das überhaupt die ganzen antworten die der smtp server gibt erhalte bzw. ausgeben kann ... denn ich kriege jan icht alle antworten mit einem fread oder fgets oder ?
wie kan nic hdas also machen das das alles ausgegeben kriege bzw. alle antworten kriege.

wäre da noch mal sehr dankbar für eure hilfe
 
Nimm halt gleich PHPMailer ;)

(Wenn du auf dein Posting eine konkrete Antwort haben willst, solltest du es nochmal ordentlich schreiben, weil atm kann ich es nicht lesen :roll:)
 
ich muss hier nun noch mal ran ... stehe irgendwie seit tagen bisschen auf dem schlauch ...
ich kriege es gerade gar nicht hin das überhaupt die ganzen antworten die der smtp server gibt erhalte bzw. ausgeben kann ... denn ich kriege jan icht alle antworten mit einem fread oder fgets oder ?
wie kan nic hdas also machen das das alles ausgegeben kriege bzw. alle antworten kriege.

wäre da noch mal sehr dankbar für eure hilfe

Am besten verstehst du das Konzept in dem du dich mal mit telnet auf den Mailserver verbindest und die Befehle von Hand eingibts.