Avatar billede d.kryger Praktikant
13. juli 2009 - 11:42 Der er 32 kommentarer og
2 løsninger

Send mail via egen SMTP-server

Hej eksperter.

Jeg har en webside som sender nogle e-mail ud via php's mail()-funktion. Jeg kunne dog godt tænkte mig at det var via min egen exchange server, men hvordan kan jeg gøre det?

Min webside er hostet ude i byen, så jeg har ikke de store muligheder for at ændre i opsætningen i php'en...
Avatar billede majbom Novice
13. juli 2009 - 11:47 #1
du kan bruge phpmailer, den kan du sætte op til at bruge SMTP-server
Avatar billede d.kryger Praktikant
13. juli 2009 - 11:51 #2
Det lyder godt. Har du et link eller noget?
Avatar billede majbom Novice
13. juli 2009 - 12:31 #3
den er ellers nem på google ;)

http://phpmailer.worxware.com/
Avatar billede mcb2001 Nybegynder
13. juli 2009 - 12:48 #4
eller bare bruge php's egen mail:

http://dk.php.net/manual/en/book.mail.php

her kan du se hvordan du skifter i din "php.ini" på "runtime" og bruger en anden server osv...
Avatar billede d.kryger Praktikant
13. juli 2009 - 12:57 #5
Som skrevet, så har er websiden hostet og jeg kan derfor ikke ændre i php.ini... Eller hvad?
Avatar billede mcb2001 Nybegynder
13. juli 2009 - 13:07 #6
har du set den jeg har posted?

du kan bruge metoden: ini_set();
Avatar billede d.kryger Praktikant
13. juli 2009 - 13:22 #7
Nej, det havde jeg ikke set. Hvor kan jeg sætte brugernavn og adgangskode for min mailserver?
Avatar billede mcb2001 Nybegynder
13. juli 2009 - 13:52 #8
kunne du kigge på den jeg har posted og så stille spørgsmål.
Det står direkte i eksemplerne på den side jeg har posted et link til...
Avatar billede d.kryger Praktikant
17. juli 2009 - 13:45 #9
Jeg har nu kigget linket igennem og jeg kan desværre ikke finde det sted hvor du mener at man skal kunne angive brugernavn og adgangskode på den smtp-server som jeg gerne vil sende fra.

Min kode ser sådan ud nu:
$Name = "Afsendernavn"; //senders name
$email = "afsender@afsender.dk"; //senders e-mail adress
$recipient = "modtager@modtager.dk"; //recipient
$mail_body = "Her er teksten i selve e-mailen"; //mail body
$subject = "Her er emnet"; //subject
$header = "From: ". $Name . " <" . $email . ">\r\n"; //optional headerfields

ini_set("SMTP","mail.domæne.dk");
ini_set('sendmail_from', 'afsender@afsender.dk'); //Suggested by "Some Guy"

mail($recipient, $subject, $mail_body, $header); //mail command :)

Lige nu sender den via webhotellets mailserver og ikke via den som er angivet via ini_set...

Kan du hjælpe mig?
Avatar billede mcb2001 Nybegynder
17. juli 2009 - 13:52 #10
Avatar billede d.kryger Praktikant
17. juli 2009 - 14:43 #11
Tak for linket. Jeg har via dette link (http://phpmailer.worxware.com/index.php?pg=examplebsmtp) fundet en enkelt kode som gør hvad jeg mener at skulle bruge...

MEN jeg får denne fejl:
Fatal error: Call to undefined method PHPMailer::SetFrom() in smtpmail.php on line 22

Linje 22 ser sådan ud:
$mail->SetFrom('name@yourdomain.com', 'First Last');

Har du et forslag til hvad jeg kan gøre galt?
Avatar billede mcb2001 Nybegynder
17. juli 2009 - 14:50 #12
importerer du filerne korrekt via "include()" eller "include_once()" ??
Avatar billede majbom Novice
18. juli 2009 - 09:12 #13
prøv at post hele din kode
Avatar billede d.kryger Praktikant
20. juli 2009 - 16:02 #14
Koden ser sådan ud:
<?php

    require_once('class.phpmailer.php');
    //include("class.smtp.php"); // optional, gets called from within class.phpmailer.php if not already loaded

    $mail            = new PHPMailer();

    $body            = file_get_contents('contents.html');
    $body            = eregi_replace("[\]",'',$body);

    $mail->IsSMTP(); // telling the class to use SMTP
    $mail->Host      = "mail.domæne.dk"; // SMTP server
    $mail->SMTPDebug  = 2;                    // enables SMTP debug information (for testing)
                                              // 1 = errors and messages
                                              // 2 = messages only
    $mail->SMTPAuth  = true;                  // enable SMTP authentication
    $mail->Host      = "mail.domæne.dk"; // sets the SMTP server
    $mail->Port      = 25;                    // set the SMTP port for the GMAIL server
    $mail->Username  = "brugernavn"; // SMTP account username
    $mail->Password  = "adgangskode";        // SMTP account password

    $mail->SetFrom('name@yourdomain.com', 'First Last');

    $mail->AddReplyTo("name@yourdomain.com","First Last");

    $mail->Subject    = "PHPMailer Test Subject via smtp, basic with authentication";

    $mail->AltBody    = "To view the message, please use an HTML compatible email viewer!"; // optional, comment out and test

    $mail->MsgHTML($body);

    $address = "modtager@domæne.dk";
    $mail->AddAddress($address, "First Last");

    if(!$mail->Send()) {
      echo "Mailer Error: " . $mail->ErrorInfo;
    } else {
      echo "Message sent!";
    }

    print "Sendt!";

?>

PHP-filen liger i samme bibliotek som "class.phpmailer.php", "class.smtp.php" og "contents.html" som blot er en tom HTML-fil, som jeg selv har oprettet!
Avatar billede d.kryger Praktikant
20. juli 2009 - 16:08 #15
Og fejlen jeg får er stadig: Fatal error: Call to undefined method PHPMailer::SetFrom() in smtpmail.php on line 22

smtpmail.php er den fil hvor ovenståede kode står i...
Avatar billede mcb2001 Nybegynder
20. juli 2009 - 16:15 #16
prøv at kigge i class.phpmailer.php om der overhovedet er en funktion der hedder: SetFrom();
Avatar billede majbom Novice
20. juli 2009 - 16:28 #17
det ser ud til at du skal gøre sådan her:

$mail->Set('From', 'name@yourdomain.com');
$mail->Set('FromName', 'First Last');

i stedet...
Avatar billede d.kryger Praktikant
20. juli 2009 - 16:30 #18
Det er der så ikke...

Jeg har ændret det til:
    $mail->From = "mail@domæne.dk";
    $mail->FromName = "Navn på afsender";

Og så sendte den e-mailen...

MEN den skriver en masse til mig, det ønsker jeg ikke, hvordan kan jeg få den til at lade være med det? Det jeg ønsker der skal ske er blot at jeg får en variabel om den er sendt eller ej. F.eks. kunne den videre sende til: email.php?status=sendt eller email.php?status=fejl

Kan det lade sig gøre?
Avatar billede majbom Novice
20. juli 2009 - 16:46 #19
ret:

    if(!$mail->Send()) {
      echo "Mailer Error: " . $mail->ErrorInfo;
    } else {
      echo "Message sent!";
    }

til:

    if(!$mail->Send()) {
      $status = "Mailer Error: " . $mail->ErrorInfo;
    } else {
      status = "Message sent!";
    }
Avatar billede d.kryger Praktikant
21. juli 2009 - 08:33 #20
Jeg har prøvet ovenstående med jeg får stadig dette printet på skærmen:

SMTP -> FROM SERVER: 220 **************************************************************************************************************** SMTP -> FROM SERVER: 250-mail.domæne.dk Hello [0.0.0.0] 250-XXXA 250-SIZE 250-ETRN 250-PIPELINING 250-DSN 250-ENHANCEDSTATUSCODES 250-8bitmime 250-BINARYMIME 250-XXXXXXXB 250-VRFY 250-XXXXXXXXXXXXXXXXXXXXXXXC 250-XXXXXXXXXXXD 250-AUTH GSSAPI NTLM LOGIN 250-AUTH=LOGIN 250-XXXXXXXXXXXE 250-XXXXXXF 250 XG SMTP -> FROM SERVER: 250 2.1.0 email@domæne.dk....Sender OK SMTP -> FROM SERVER: 250 2.1.5 email@domæne.dk SMTP -> FROM SERVER: 354 Start mail input; end with . SMTP -> FROM SERVER: 250 2.6.0 <03a9a2f4adec183731b5f02cebd66fba@www.domæne.dk> Queued mail for delivery SMTP -> FROM SERVER: 221 2.0.0 mail.domæne.dk Service closing transmission channel

Hvordan kan jeg undgå dette?
Avatar billede mcb2001 Nybegynder
21. juli 2009 - 09:43 #21
Du sender til: domæne.dk
Det kan du da ikke...
Du bør rette lidt i koden inden du afprøver den...
Avatar billede d.kryger Praktikant
21. juli 2009 - 09:46 #22
Jeg sender ikke til domæne.dk, det er blot fordi at jeg ikke ønsker at skrive mit domæne/e-mail adresse mv. her...
Avatar billede d.kryger Praktikant
21. juli 2009 - 09:52 #23
For ikke at skabe forvirring, så sender koden e-mail ud gennem serveren helt som den skal, men jeg vil gerne undgå at den skriver ovenstående på websiden, da mine brugere ikke kan bruge det til...
Avatar billede mcb2001 Nybegynder
21. juli 2009 - 10:06 #24
if(!$mail->Send()) {
      $status = "Mailer Error: " . $mail->ErrorInfo;
    } else {
      status = "Message sent!";
    }


skal rettes til (der er glemt en $ i "status"):

    if(!$mail->Send()) {
      $status = "Mailer Error: " . $mail->ErrorInfo;
    } else {
      $status = "Message sent!";
    }
Avatar billede d.kryger Praktikant
21. juli 2009 - 10:11 #25
Det har jeg også sat ind, men den skriver det stadig...
Avatar billede mcb2001 Nybegynder
21. juli 2009 - 12:42 #26
if(!$mail->Send()) {
      $status = "Mailer Error: " . $mail->ErrorInfo;
    } else {
      status = "Message sent!";
    }


prøv bare at skrive:

$mail->Send();


og så se hvad der sker, for udskriver den stadig, så er det Send() funktionen der udløser udskriftet og ikke $mail->ErrorInfo ...
Avatar billede d.kryger Praktikant
21. juli 2009 - 12:58 #27
Teksten kommer stadig og e-mailen bliver sendt! ØV!
Avatar billede mcb2001 Nybegynder
21. juli 2009 - 13:34 #28
hvis jeg bruger koden her:
http://phpmailer.worxware.com/index.php?pg=examplebsmtp

direkte får jeg ikke udskrevet noget...
Avatar billede d.kryger Praktikant
21. juli 2009 - 13:39 #29
Det lyder sku lidt underligt, eftersom at det er den kode som jeg også bruger...

Men pyt, jeg tror jeg har fundet en løsning med min nuværende kode. Vil du ikke ligge et svar, så fordeler jeg point mellem dig og "splazz", da I begge har hjulpet mig til min løsning.

Tak for hjælpen og tålmodigheden!
Avatar billede majbom Novice
21. juli 2009 - 14:07 #30
prøv at fjerne den her linje:

$mail->SMTPDebug  = 2;
Avatar billede d.kryger Praktikant
21. juli 2009 - 14:30 #31
BINGO! Der var den... Nu skriver den intet, og det hele virker som det skal!

Jeg vil stadig gerne have et svar fra mcb2001 også, så jeg kan uddele point!
Avatar billede mcb2001 Nybegynder
21. juli 2009 - 15:04 #32
du deler bare ud...
Avatar billede majbom Novice
21. juli 2009 - 17:51 #33
super!

tak for point :)
Avatar billede mcb2001 Nybegynder
21. juli 2009 - 18:02 #34
:-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester