Avatar billede Asky Forsker
29. august 2023 - 09:20 Der er 21 kommentarer og
1 løsning

opdatering af gamle PHPformularer

Nu er det jo sådan, at mine formularer med PHPMailer har fungeret i 13-14 år eller mere med php5,6 på webhotellet. Det var jo ret let at opdatere et par filer og et par linjer i koden og så køre videre. Foreløbig kan jeg opdatere til  cLASS.PHPMailer version 5.2.9 fra 2014, så når webhotellet ikke længere understøtter PHP 5,6 er jeg stadig konvertibel med PHP 7.x. 
Den gamle opskrift på en fungerende PHPMailer er denne:

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

Jeg har altid skrevet mine koder i Notepad++
Avatar billede bvirk Guru
29. august 2023 - 11:11 #1
'jeg har alitid' er et imponerende erfaringsgrundlag at begrunde sine valg med 😜
Avatar billede ejvindh Ekspert
29. august 2023 - 12:50 #2
Som der blev skrevet i en tidligere tråd, kan det være en god ide at starte ud med at lave noget meget simpelt, og så se om man kan få hul igennem.

F.eks. kunne du starte med at lægge Phpmailer-filerne (Exception.php, PHPMailer.php, SMTP.php) i en mappe. I samme mappe oprette en ny php-fil, som du putter følgende ind i:

<?php

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
use PHPMailer\PHPMailer\SMTP;

require 'Exception.php';
require 'PHPMailer.php';
require 'SMTP.php';

$mail = new PHPMailer(true);

try {
    //Server settings
    $mail->SMTPDebug = SMTP::DEBUG_SERVER;                      //Enable verbose debug output
    $mail->isSMTP();                                            //Send using SMTP
    $mail->Host      = 'smtp.webhosting.dk';                    //Set the SMTP server to send through
    $mail->SMTPAuth  = true;                                  //Enable SMTP authentication
    $mail->Username  = 'xxx-en-email-adresse-du-har-til-sitet';                    //SMTP username
    $mail->Password  = 'xxx-email-password';                              //SMTP password
    $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;            //Enable implicit TLS encryption
    $mail->Port      = 587;                                    //TCP port to connect to; use 587 if you have set `SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS`

    //Recipients
    $mail->setFrom('xxxemail-fra-afsender', 'Mailer');
    $mail->addAddress('xxxxemail-til-modtager', 'Ejvind');    //Add a recipient
    $mail->addReplyTo('xxxxemail-fra-afsender', 'Information');

    //Content
    $mail->isHTML(true);                                  //Set email format to HTML
    $mail->Subject = 'prøve';
    $mail->Body    = 'Går denneher <b>igennem!</b>';
    $mail->AltBody = 'eller denne?';

    $mail->send();
    echo 'Message has been sent';
} catch (Exception $e) {
    echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}";
}

?>


Hvis så der er hul igennem, kan du begynde at eksperimentere derfra.
Avatar billede ejvindh Ekspert
29. august 2023 - 12:51 #3
Husk at udskifte indholdet markeret med "xxx". Ellers virker det ikke.
Avatar billede Asky Forsker
29. august 2023 - 17:01 #4
Har prøvet noget lignende før og har nu prøvet denne kode. Jeg kan ikke få den til at virke, Har prøvet at ændre porten 587 til 25 som den er i den gamle kode, men det virker heller ikke. filen skal vel også kaldes for at gå i aktion?
Avatar billede ejvindh Ekspert
29. august 2023 - 17:10 #5
Ja, du skal naturligvis gå ind på php-filen fra din browser, for at aktivere den. Når du gør det, burde du få en fejlmelding, hvis ikke det virker. Den kan du prøve at lægge herind.
Avatar billede Asky Forsker
29. august 2023 - 20:27 #6
Kan ikke udføre i øjeblikket ERROR 500
Avatar billede Asky Forsker
29. august 2023 - 20:37 #7
Nu tror jeg, det virker. jeg fik ihvertfald en mægtig responsskærm! kigger lige i mailprogrammet- Jo den er igennem, selvom tegnsættet er forkert.
Avatar billede Asky Forsker
29. august 2023 - 21:01 #8
Port til smtp.webhosting.dk er 25 og ikke 587

Tegnsættet i mailen er nu rigtigt, da jeg under content har tilføjet
header('Content-type: text/html; charset=utf-8');

sjovt nok er mailens navn proevemail og det står til gengæld som helt forkert tegnsæt.

Nu vil jeg prøve at indføre lidt efter lidt fra min gamle opsætning af response-filen fra formularerne.
Avatar billede ejvindh Ekspert
29. august 2023 - 21:52 #9
Godt at høre. Og ja, jeg bøvler også lidt med encoding i subject. Dog ikke i mailbody, som ser godt nok ud.

Subject fixer jeg med dette trick:

$mail->Subject = "=?UTF-8?B?".base64_encode((string) $subject)."?=";

... hvor $subject så indeholder den ønskede streng. Så bliver den med rigtig encoding. Om der findes en smartere løsning ved jeg ikke.
Avatar billede Asky Forsker
29. august 2023 - 22:15 #10
DEt har jeg lige prøvet, men synes ikke helt, det virker. Det får dog heller ikke betydning for mig, da subjekt er et af felterne i formularen.
jeg fortsætter mine eksperimenter i morgen. Langt om længe er der hul igennem :-)
Avatar billede Asky Forsker
30. august 2023 - 22:25 #11
Har nu prøvet adskillige gange at putte indhold fra mine formularer ind sammen med den nye maildel. Prøvefilen virker, men lige så snart der kommer flere ting på får jeg "virker ikke". Der må være en fejl et sted.
Avatar billede ejvindh Ekspert
31. august 2023 - 08:42 #12
Det må der være. Hvis vi skal kunne hjælpe herindefra skal du nok skrive lidt mere: Ligger den nye fil samme sted, som den gamle? Hvad har du ændret? Hvilken fejlmelding får du?
Avatar billede Asky Forsker
31. august 2023 - 09:46 #13
Det er lige så snart jeg tilføjer definitioner fra formularerne til den mail, der virker og kalder den "response.php" fx
$navn = ($_POST['navn']);
$adresse = ($_POST['adresse']);
$postnummer = ($_POST['postnummer']);
$by = ($_POST['by']);
altså en simpel tilmeldingsformular. fejlmeldingerne er alle error 500.
Avatar billede ejvindh Ekspert
31. august 2023 - 11:19 #14
Hvilken php-version kører du med? Hvis du har opgraderet til php8 skal du nemlig være opmærksom på, at hvis man prøver at trække en $_POST-variabel ud, der ikke er sat, får man fejlmeldinger

Den hurtige løsning er i så fald noget lignende:
$navn = ($_POST['navn']);
udvides til:
$navn = ($_POST['navn'] ?? null);

... og tilsvarende for de andre variable.
Avatar billede Asky Forsker
31. august 2023 - 14:28 #15
På min server på webhotellet er der stadigvæk PHP 5.6, men min nye PHPMailer er vist noget med 6.8.x. Så måske er det en god ide at udvide felternes variabel til
$navn = ($_POST['navn'] ?? null);
Avatar billede ejvindh Ekspert
31. august 2023 - 14:49 #16
Du kan jo prøve det, men er nok lidt skeptisk så. Hvis du kun har tilføjet de variable, som du viser ovenfor, og php-filen ligger det samme sted (blot med et nyt navn), burde det ikke slå phpmailer ud af kurs.
Avatar billede Asky Forsker
31. august 2023 - 19:57 #17
Her er min kode, som ikke virker når den kaldes fra en formular med de nævnte felter. "siden virker ikke i øjeblikket (error 500)
<?php

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
use PHPMailer\PHPMailer\SMTP;

require 'Exception.php';
require 'PHPMailer.php';
require 'SMTP.php';

$mail = new PHPMailer(true);

try {
    //Server settings
    $mail->SMTPDebug = SMTP::DEBUG_SERVER;                      //Enable verbose debug output
    $mail->isSMTP();                                            //Send using SMTP
    $mail->Host      = 'smtp.webhosting.dk';                    //Set the SMTP server to send through
    $mail->SMTPAuth  = true;                                  //Enable SMTP authentication
    $mail->Username  = 'info@domæne.dk';                    //SMTP username
    $mail->Password  = 'xxxxx';                              //SMTP password
    $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;            //Enable implicit TLS encryption
    $mail->Port      = 25;                                    //TCP port to connect to; use 587 if you have set `SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS`

$emne = ($_POST['subject']?? null);
$navn = ($_POST['navn']?? null);
$adresse = ($_POST['adresse']?? null);
$postnummer = ($_POST['postnummer']?? null);
$by = ($_POST['by']?? null);
$telefon = ($_POST['telefon']?? null);
$email = $_POST['email']?? null);
   
    //Recipients
    $mail->setFrom('info@domæne.dk', 'Arne Firma');
    $mail->addAddress('xxxx@domæne.dk', 'Arne');    //Add a recipient
    $mail->addReplyTo('xxxx@stofanet.dk', 'Information');

    //Content
    $mail->isHTML(true);
    $mail->Subject = "=?UTF-8?B?".base64_encode((string) $subject)."?=";
    $mail->Subject = 'prøvemail';
   
    $mail->Body    ="<html>
<head>
    <meta http-equiv='content-type' content='text/html; charset=utf-8'/>
<style type='text/css'>
#body{
h1 {font-family : Verdana, Tahoma, sans-serif; font-size: 16px ;  text-align : left; color:#000000;}
h2 {font-family : Verdana, Tahoma, sans-serif; font-size 14px; text-align : left;}
h3 {font-family : Verdana, Tahoma, sans-serif; font-size: 12px/1,5 ; text-align : left; color : #000000;}
h4  {font-family : Verdana, Tahoma, sans-serif; font-size: 10px/1,5 ;  text-align : left; }
p {font-family : Verdana, Tahoma, sans-serif; font-size: 12px/1,3 ;  text-align : left; color :#000000;}
}
</style>
</head>
<body>
<h1>Hej $navn, <br/>Tak for din $emne</h1>"."".$navn." Mail: ".$email."\r\n Adresse: ".$adresse. "\r\n Postnummer: " .$postnummer. " By: " .$by."\r\n Tlf.: " .$telefon."<br/> Bemærkninger:  " .$_POST['bem'].
"\n\r Venlig hilsen\n\r</h3><h1> Firma</h1></body></html>";
   
  // $mail->AltBody = 'eller denne alternative?';
$mail->SMTPAuth  = true; // enable SMTP authentication

    $mail->send();
    echo 'Mailen er blevet sendt med alle oplysninger';
} catch (Exception $e) {
    echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}";
}

?>
PS koden der designer den sendte mail virker, når der ikke er variabler
Avatar billede ejvindh Ekspert
31. august 2023 - 20:34 #18
Jeg antager at du aktivt har anonymiseret dine logonoplysninger (username, password, osv), hvilket selvfølgelig er meget smart. Men hvis det faktisk er disse oplysninger, der står derinde, så kan det nok bøvle.

Derudover kan jeg kun få øje på "$_POST['bem']" som et potentielt problem, men det burde kun være, hvis du kører nyeste php, hvilket du jo ikke gør -- og uanset ville det højst være en warning, den gav af sig...

Mit råd vil nok være, at prøve at fjerne alle variable igen, og så indsætte én af gangen, for at se hvilken der giver bøvl.

Det er i øvrigt ikke så underligt, hvis du subjekt stadig bøvler, da du jo stadig sætter subjekt til "Prøveemail"  EFTER den linje, jeg foreslog. Og at du ikke har givet variablen $subject noget indhold.

Du kan jo sådan set måske også bare fjerne den linje, som jeg foreslog:
$mail->Subject = "=?UTF-8?B?".base64_encode((string) $subject)."?=";
...og så indsætte følgende i stedet:
$mail -> CharSet = "UTF-8";
(men det er ikke dette, der laver den store fejl...)
Avatar billede Asky Forsker
01. september 2023 - 21:45 #19
Nu er jeg kommet så langt med variablerne for navn, adresse osv virker perfekt også $subject virker, hvor subject er med i kaldet fra formularen. (den oprindelige subject i prøvemailen er fjernet)
Derfor er jeg fortsat med svarene fra formularen ".$v1." ".$v2." osv. De er sat ind i mailens tekst.
Det virker så heller ikke lige nu, måske fordi jeg har sat denne fuktion øverst i responsen:

function createNewUser() {
    if(isset($_POST['send'])) {

begge med slut-tuborg til sidst i responsen

Sådan var det nemlig i den gamle version, Det er måske her fejlen ligger, men hvad gør jeg så?
Avatar billede Asky Forsker
02. september 2023 - 09:29 #20
Så fik jeg fjernet de to linjer og flyttede definitionerne fra formular-felterne ned under
$mail = new PHPMailer(true); hvor de andre variabler også står NU VIRKER DET HELE!
en lille detalje er den lange responsskærm. I en anden tråd foreslår du at fjerne linjen
$mail->SMTPDebug = SMTP::DEBUG_SERVER;  eller bruge en anden version med forkellige indstllinger. Det er en detalje, så skriv et svar, som jeg kan markere som løsning:-)
Avatar billede ejvindh Ekspert
02. september 2023 - 14:51 #21
Dejligt at der virker. Og her kommer et svar :-)
Avatar billede Asky Forsker
02. september 2023 - 22:24 #22
Tak for hjælpen ;-)
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

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