[php] externe smtp-server gebruiken voor mail functie

Pagina: 1
Acties:
  • 176 views sinds 30-01-2008
  • Reageer

Onderwerpen


  • TromboneFreakus
  • Registratie: Juli 2001
  • Laatst online: 01-08-2023
Ik probeer een externe mailserver te gebruiken voor het verzenden van mail. Nu zijn daar al vele topics over, maar die gaan vaak over de instellingen van PHP zelf. Dit terwijl ik in dit geval geen root access heb en het dus moet doen met gewone PHP-code.

Nu heb ik een topic de volgende PHP-code gevonden:

code:
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
<?php

//this is the sock mail function
function sock_mail($auth,$to, $subj, $body, $head, $from) {
       $lb="\r\n";                        //linebreak
       $body_lb="\r\n";                //body linebreak
       $loc_host = "localhost";        //localhost
       $smtp_acc = "************";        //account
       $smtp_pass="************";            //password
       $smtp_host="smtp.uci.kun.nl";    //server SMTP
       $hdr = explode($lb,$head);        //header
       
       if($body) {$bdy = preg_replace("/^\./","..",explode($body_lb,$body));}
       
       // build the array for the SMTP dialog. Line content is array(command, success code, additonal error message)
       if($auth == 1){// SMTP authentication methode AUTH LOGIN, use extended HELO "EHLO"
           $smtp = array(
               // call the server and tell the name of your local host
               array("EHLO ".$loc_host.$lb,"220,250","HELO error: "),
               // request to auth
               array("AUTH LOGIN".$lb,"334","AUTH error:"),
               // username
               array(base64_encode($smtp_acc).$lb,"334","AUTHENTIFICATION error : "),
               // password
               array(base64_encode($smtp_pass).$lb,"235","AUTHENTIFICATION error : "));
       } 
       else {// no authentication, use standard HELO    
           $smtp = array(
               // call the server and tell the name of your local host
               array("HELO ".$loc_host.$lb,"220,250","HELO error: "));
       }
   
       
       // envelop
       $smtp[] = array("MAIL FROM: <".$from.">".$lb,"250","MAIL FROM error: ");
       $smtp[] = array("RCPT TO: <".$to.">".$lb,"250","RCPT TO error: ");
       // begin data        
       $smtp[] = array("DATA".$lb,"354","DATA error: ");
       // header
       $smtp[] = array("Subject: ".$subj.$lb,"","");
       $smtp[] = array("To:".$to.$lb,"","");        
       foreach($hdr as $h) {$smtp[] = array($h.$lb,"","");}
       // end header, begin the body
       $smtp[] = array($lb,"","");
       if($bdy) {foreach($bdy as $b) {$smtp[] = array($b.$body_lb,"","");}}
       // end of message
       $smtp[] = array(".".$lb,"250","DATA(end)error: ");
       $smtp[] = array("QUIT".$lb,"221","QUIT error: ");

       // open socket
       $fp = @fsockopen($smtp_host, 25);
       if (!$fp) echo "<b>Error:</b> Cannot conect to ".$smtp_host."<br>";
       
       $banner = @fgets($fp, 1024);
       // perform the SMTP dialog with all lines of the list
       foreach($smtp as $req){
           $r = $req[0];
           // send request
           @fputs($fp, $req[0]);
           // get available server messages and stop on errors
           if($req[1]){
               while($result = @fgets($fp, 1024)){if(substr($result,3,1) == " ") { break; }};
               if (!strstr($req[1],substr($result,0,3))) echo"$req[2].$result<br>";
           }
       }
       $result = @fgets($fp, 1024);
       // close socket
       @fclose($fp);
       return 1;
   }  

 
   
   ?>


Of ik dit nu oproep met
code:
1
sock_mail(0,"********@****.nl", "Testje", "Test", $head, "***@***.***.nl");

of
code:
1
sock_mail(1,"********@****.nl", "Testje", "Test", $head, "***@***.***.nl");


ik krijg telkens de volgende foutmelding:
Error: Cannot conect to smtp.uci.kun.nl
HELO error: .
MAIL FROM error: .
RCPT TO error: .
DATA error: .
DATA(end)error: .
QUIT error: .
Een eenvoudiger scriptje gevonden via php.net/mail is het volgende

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?
include("Mail.php");

$recipients = "info*********.nl";

$headers["From"]    = "***@*****.nl";
$headers["To"]      = "***@*****.nl";
$headers["Subject"] = "Test message";

$body = "TEST MESSAGE!!!";

$params["host"] = "smtp.uci.kun.nl";
$params["port"] = "25";
$params["auth"] = true;
$params["username"] = "*******";
$params["password"] = "*******";

// Create the mail object using the Mail::factory method
$mail_object =& Mail::factory("smtp", $params);

$mail_object->send($recipients, $headers, $body);
?>



Dan is de foutmelding korter (niet beter helaas....):
Warning: fsockopen(): unable to connect to 131.174.93.49:25 in /usr/lib/php/Net/Socket.php on line 108
Opvallend is: een telnet naar deze server werkt prima.

Overigens wordt in dit topic gemeld dat direct afleveren bij de SMTP-server kan, als de ontvanger in hetzelfde domain zit. Dat is het geval, dus mocht dit een andere oplossing ook mogelijk maken....

  • Vunzz
  • Registratie: Augustus 2001
  • Laatst online: 12-09 11:10
Heb je al geprobeerd of het wel werkt als je een andere SMTP-server invult?

How can you conquer a hill top, if you are to busy at the bottom stepping over stones.


  • NeOTheMaTriXM
  • Registratie: April 2001
  • Laatst online: 17-09 15:07
http://phpmailer.sourceforge.net/

Zit alles in, schilt je een hoop werk :-)

  • snoopy
  • Registratie: December 2000
  • Laatst online: 17-08 08:27
Het zou ook kunnen dat jouw webhost uitgaand verkeer geblokkeerd heeft om misbruik/hacken tegen te gaan vanaf hun server... Informeer eens bij je host zou ik zeggen.

Verwijderd

Ja, ik denk dat veilige modus aanstaat, of iets anders dat je verhindert om sockets met PHP te openen.

In dat geval heb je gewoon botte pech.

  • bartgymnast
  • Registratie: Oktober 2002
  • Laatst online: 12-08 18:08
zover ik weet kan je vragen of ze het voor jouw account kunnen open, met een motivatie erbij.
dan maak je veel kans, dat ze het voor jouw open gooien.

if you jump to the otherside of the galaxy, it is still not the end. http://eu.battle.net/d3/en/profile/ouchpain-2430/hero/564727


Acties:
  • 0 Henk 'm!

  • TromboneFreakus
  • Registratie: Juli 2001
  • Laatst online: 01-08-2023
Helpt niet echt....
Warning: fsockopen(): unable to connect to mailserver.uci.kun.nl:25 in /home/jfvnijme/public_html/phpmailer-1.72/class.smtp.php on line 105
There has been a mail error sending to
En op het forum van de host (BYH) staat juist dat het probleemloos zou moeten kunnnen.....

Acties:
  • 0 Henk 'm!

  • Reptile209
  • Registratie: Juni 2001
  • Laatst online: 17:39

Reptile209

- gers -

Allereerst: ik kan geen PHP :)
Waarom doe je in regel 57 $r = $req[0]; en gebruik je $r verder nergens meer? Voudje?

Wat constructiever: probeer eens om iedere send en receive actie met de server direct te echo'en en vergelijk dat vervolgens met je telnet-sessie. Interpreteert je script alle acies inderdaad correct?

Zo scherp als een voetbal!


Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Probeer zelf even met fscockopen te connecten naar de SMTP server:
PHP:
1
2
3
4
5
6
7
8
9
$errNr = 0;
$errMsg = '';
$fd = fsockopen ( 'smtp.server.nl', 25, $errNr, $errMsg );
if ( $fd ) {
   echo 'success';
   fclose ( $fd );
} else {
   printf ( 'failure: %d (%s)', $errNr, $errMsg );
}
Als dit een failure oplevert moet je allereerst even kijken of je iets kunt met de errormessage (google daar even op). Verder kun je even contact opnemen met de beheerder van de server (is al genoemd) om te kijken of die connecties outbound wel toegestaan worden voor jou.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • TromboneFreakus
  • Registratie: Juli 2001
  • Laatst online: 01-08-2023
drm schreef op 20 september 2004 @ 10:33:
Probeer zelf even met fscockopen te connecten naar de SMTP server:
PHP:
1
2
3
4
5
6
7
8
9
$errNr = 0;
$errMsg = '';
$fd = fsockopen ( 'smtp.server.nl', 25, $errNr, $errMsg );
if ( $fd ) {
   echo 'success';
   fclose ( $fd );
} else {
   printf ( 'failure: %d (%s)', $errNr, $errMsg );
}
Als dit een failure oplevert moet je allereerst even kijken of je iets kunt met de errormessage (google daar even op). Verder kun je even contact opnemen met de beheerder van de server (is al genoemd) om te kijken of die connecties outbound wel toegestaan worden voor jou.
Ik krijg een error 111 (Connection refused).

Nu vertelt dat dus niet waarom de connectie geweigerd wordt. En dat is ook de tendens wanneer ik hiermee zoek op Google.

Moet ik nu bij de beheerder van de smtp-server zijn??

Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Begin eerst eens bij je eigen serverbeheerder.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • InputOutput
  • Registratie: September 2004
  • Laatst online: 18-09 10:52
Heb je al geprobeerd of je vanaf de machine waar het script moet draaien met telnet/netcat een connectie naar de mailserver poort 25 kunt opzetten? Als dat werkt weet je dat het ergens in je php script zit. Werkt het niet, dan kun je het vanaf een andere machine proberen. Werkt dat, dan weet je dat het waarschijnlijk in de firewall instelling van de machine zit waar het script op draait. Werkt dat niet, dan is er iets met de mailserver.

Alternatieve hack is om met ssh( als je tenminste ssh access hebt op de mailserver ), sendmail op de server aan te roepen, maar dat is een beetje een vieze hack (alhoewel de mail() functie van php niets anders doet dan sendmail aanroepen op de machine waar php op draait).
Pagina: 1