Avatar billede slein55 Mester
09. august 2023 - 18:58 Der er 26 kommentarer og
1 løsning

send email fra PHP

hvordan sender man en email fra et PHP program jeg har prøvet følgende med min egen mail i stedet for caffeinated@example.com
?php
// The message
$message = "Line 1\r\nLine 2\r\nLine 3";

// In case any of our lines are larger than 70 characters, we should use wordwrap()
$message = wordwrap($message, 70, "\r\n");

// Send
mail('caffeinated@example.com', 'My Subject', $message);
?>
Avatar billede arne_v Ekspert
09. august 2023 - 19:38 #1
P.g.a. spam bekæmpelse er det at sende email blevet et ikke-trivielt problem. Der er mange ting som kan gå galt.

Første ting som springer i øjnene er at du ikke angiver From.

Derefter vil jeg tro at det ville være godt at bruge MIME.

Og så naturligvis spørgsmålet: er der en SMTP server?
Avatar billede slein55 Mester
09. august 2023 - 19:52 #2
jeg har prøvet lidt med PHPmailer men ved ikke helt hvordan jeg skal uploade det til serverenog includere det i PHP koden
Avatar billede arne_v Ekspert
10. august 2023 - 01:00 #3
Jeg har f'ølgende kode på lager:


<?php

class SmartMailer {
    // content types
    const TYPE_UNKNOWN = 100;
    const TYPE_TEXT = 101;
    const TYPE_HTML = 102;
    // character sets
    const CS_UNKNOWN = 200;
    const CS_USASCII = 201;
    const CS_ISO88591 = 202;
    const CS_UTF8 = 203;
    // default character set if 8 bit and not possible to guess
    private $default_cs;
    // constructor
    public function __construct() {
        $this->default_cs = SmartMailer::CS_UTF8;
    }
    // access default charcter set
    public function get_default_cs() {
        return $this->default_cs;
    }
    public function set_default_cs($cs) {
        cs_type_to_string($cs); // will throw exception if unknown character set
        $this->default_cs = $cs;
    }
    // convert content type code to actual content type string
    private function type_code_to_string($type) {
        switch ($type) {
            case SmartMailer::TYPE_TEXT:
                return "text/plain";
            case SmartMailer::TYPE_HTML:
                return "text/html";
            default:
                throw new Exception('Unsupported content type code ' . $type);
        }
    }
    // convert character set code to actual character set string
    private function cs_code_to_string($cs) {
        switch ($cs) {
            case SmartMailer::CS_USASCII:
                return "US-ASCII";
            case SmartMailer::CS_ISO88591:
                return "ISO-8859-1";
            case SmartMailer::UTF8:
                return "UTF-8";
            default:
                throw new Exception('Unsupported character set code ' . $cs);
        }
    }
    // attempt to guess content type
    private function guess_type($s) {
        $res = preg_match('#<(\w+).+</(\w+)#', $s, $matches);
        return ($res && ($matches[1] == $matches[2])) ? SmartMailer::TYPE_HTML : SmartMailer::TYPE_TEXT;
    }
    // attempt to guess character set
    private function guess_cs($s) {
        $s8bit = array_filter(str_split($s), function($c) { return ord($c) >= 128; });
        if(count($s8bit) == 0) return SmartMailer::CS_USASCII;
        $s8bitnbsp = array_filter($s8bit, function($c) { return ord($c) == 0xA0; });
        $s8bitlatin = array_filter($s8bit, function($c) { return ord($c) >= 0xC0; });
        if(count($s8bitnbsp) == 0 && count($s8bitlatin) > 0) {
            return SmartMailer::CS_ISO88591;
        } else if(count($s8bitnbsp) > 0) {
            return SmartMailer::CS_UTF8;
        } else {
            return $this->default_cs;
        }
    }
    // header encode
    private function header_encode($hdr) {
        $hdrcs = $this->guess_cs($hdr);
        if($hdrcs == SmartMailer::CS_USASCII) {
            return $hdr;
        } else {
            return '=?' . $this->cs_code_to_string($hdrcs) . '?Q?' . quoted_printable_encode($hdr) . '?=';
        }
    }
    // email address encode
    private function email_address_encode($addr) {
        $addrparts = explode(' <', $addr);
        if(count($addrparts) == 2) {
            return $this->header_encode($addrparts[0]) . ' <' . $addrparts[1];
        } else {
            return $addr;
        }
    }
    // actual send
    public function send_email($from, $to, $subject, $body, $type = SmartMailer::TYPE_UNKNOWN, $cs = SmartMailer::CS_UNKNOWN) {
        $from = $this->email_address_encode($from);
        $to = $this->email_address_encode($to);
        $subject = $this->header_encode($subject);
        $type = ($type == SmartMailer::TYPE_UNKNOWN) ? $this->guess_type($body) : $type;
        $bodycs = ($cs == SmartMailer::CS_UNKNOWN) ? $this->guess_cs($body) : $cs;
        $contenttype = $this->type_code_to_string($type) . '; charset=' . $this->cs_code_to_string($bodycs);
        if($bodycs == SmartMailer::CS_USASCII) {
            $contentencoding = '7bit';
        } else {
            $contentencoding = 'quoted-printable';
            $body = quoted_printable_encode($body);
        }
        $headers = "From: $from\r\n" .
                  "Content-Type: $contenttype\r\n" .
                  "MIME-Version: 1.0\r\n" .
                  "Content-Transfer-Encoding: $contentencoding";
        mail($to, $subject, $body, $headers);
    }                 
}

?>


Den bør hjælpe med mail format problemerne.

Men den hjælper ikke med SMTP serveren.
Avatar billede repox Seniormester
10. august 2023 - 08:41 #4
Jeg vil anbefale dig at bruge Symfonys mail pakke:

https://packagist.org/packages/symfony/mailer
Avatar billede slein55 Mester
10. august 2023 - 09:33 #5
jeg kan ikke se umiddelbart se hvordan man installerer Symfonymailer på mit webhotel
Avatar billede repox Seniormester
10. august 2023 - 10:14 #6
Det gør du med Composer.

Enten på webhotellet eller lokalt inden du uploader til dit webhotel.
Avatar billede slein55 Mester
11. august 2023 - 10:52 #7
PHP har en simpel mail funktion hvorfor virker den ikke
<?php
// the message
$msg = "First line of text\nSecond line of text";

// use wordwrap() if lines are longer than 70 characters
$msg = wordwrap($msg,70);

// send email
mail("someone@example.com","My subject",$msg);
?>
Avatar billede repox Seniormester
11. august 2023 - 11:48 #8
Som den dygtige arne_v beskriver, så er mail() funktionen ikke længere triviel at bruge.

Mail funktionen er lige så gammel som PHP selv og den er fra en tid før SPF, DKIM og D-MARC. Det er altsammen nyere teknologier i kampen mod spam.

Hold de nye teknologier op mod evigt udviklende spam-filtre og et kæmpe marked for tredjeparts ydelser med blacklists, så er det at sende en mail i dag i høj grad et spørgsmål om specialkompetencer.

Ideelt set ville du reelt bruge tredjepart til både transaktionelle og bulk mails, for at skåne egen server eller IP block mor potentiel blacklisting.

At bruge mail() til at sende en mail til brugere uden for egen server er så besværligt, at det ikke er umagen værd.
Avatar billede slein55 Mester
11. august 2023 - 11:50 #9
ok har du en link til et eksempel der virker?
Avatar billede michael_stim Ekspert
11. august 2023 - 12:15 #10
#9
Det har du jo allerede fået?
Avatar billede slein55 Mester
11. august 2023 - 12:25 #11
jeg har prøvet at finde ud af hvordan jeg bruger composer det er ikke lykkedes endnu
Avatar billede repox Seniormester
11. august 2023 - 14:46 #12
Det tænker jeg er noget du må sætte dig ind i.

Composer er de facto standarden for pakkehåndtering i PHP miljøet, ligesom NPM er for NodeJS og Pip for Python, eksempelvis.

Ret basalt kan du se hvordan du kan installere Composer på https://getcomposer.org/download/

Når du har Composer installeret, skal du bare følge installationsguiden på den Packagist pakke jeg sendte dig.
Avatar billede slein55 Mester
13. august 2023 - 13:32 #13
jeg har et webhotel ved one.com og det skal installeres der det kan jeg ikke finde ud af
Avatar billede arne_v Ekspert
13. august 2023 - 19:59 #14
Nu er jeg ikke specielt kyndig i composer, men jeg troede at man kørte composer på ens udviklingsmaskine og så uploadede alt (både det filer man selv har produceret plus alle de filer som composer har installeret ) til server.
Avatar billede repox Seniormester
13. august 2023 - 20:11 #15
Der er mange måder at bruge composer på; den metode som arne_v beskriver er ganske fin og løser problemet.

Personligt bruger jeg Composer lokalt under udvikling, committer min composer.lock fil og lader min deployment pipeline installere ud fra lock filen på det image jeg skal hoste.

Den bredeste konsensus er dog at man ikke committer sine installerede pakker til repo; men der kan sagtens argumenteres for at gøre det - det er dog ikke standarden.
Avatar billede slein55 Mester
14. august 2023 - 19:26 #16
jeg kan stadig ikke finde ud af at sende mail med PHP de fleste eksempler bruger composer eller autoload jeg kan ikke finde ud af at få dem til at virke,
jeg bruger one.com webhotel med PHP ver. 8.2 og har ikke en server lokalt til test
Avatar billede repox Seniormester
14. august 2023 - 20:33 #17
Måske hvis du delte hvad du havde prøvet, du kunne få lidt mere hjælp.
Avatar billede slein55 Mester
15. august 2023 - 08:37 #18
jeg har prøvet at finde ud af hvordan Symfonymailer og phpmailer installeres på serveren men de kræver alle composer eller autoload og det er ikke lykkedes for mig at finde en beskrivelse, der kan fortælle hvordan det skal gøres på en ekstern server
jeg oploader med FTP koder i Visual Studio
Avatar billede ejvindh Ekspert
15. august 2023 - 09:30 #19
Jeg skal ikke råde i valget mellem Symfony vs. phpmailer, men omkring sidstnævnte kan du jo også bare uploade pakken manuelt vha ftp:

"Alternatively, if you're not using Composer, you can download PHPMailer as a zip file, (note that docs and examples are not included in the zip file), then copy the contents of the PHPMailer folder into one of the include_path directories specified in your PHP configuration and load each class file manually"

Kilde: https://github.com/PHPMailer/PHPMailer
Se også: https://www.webdesignvista.com/how-to-install-and-use-phpmailer-without-composer/
Avatar billede Asky Forsker
27. august 2023 - 21:12 #20
Jeg har brugt PHPMailer.php i årevis, men er løbet ind i at mine versioner efterhånden er for gamle. En del energi er gået med at opdatere til en nyere version. Har dog fundet en version, der kan bruges på en PHP vers 7,0 server. Det er PHPMaler.php vers 5.2.9 fra 2014. Min kode bruger stadigvæk class.PHPMailer.php og class.SMTP.php.
Det er ikke lykkedes mig endnu at finde en brugbar kode der virker med de nyeste PHPMailer.php
Avatar billede repox Seniormester
27. august 2023 - 21:41 #21
#20, jeg vil også anbefale dig at bruge Symfonys mail pakke i stedet.
Avatar billede Asky Forsker
28. august 2023 - 08:58 #22
Nu er det jo sådan, at mine formularer med PHPMailer har fungeret i 13-14 år med php5,6 på webhotellet. Det var jo ulig lettere at opdatere et par filer og et par linjer i koden og så køre videre. Foreløbig kan jeg opdatere til før nævnte 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.0.  jeg ville gerne sende mine kodeforslag til Stein, men holder mig tilbage da forslaget kun virker op til PHP 7.0 på webhotellet.
Avatar billede repox Seniormester
28. august 2023 - 09:14 #23
#22, jeg ved ikke hvordan du tænker at dine problematikker skal hjælpe OP med hans problematik, men jeg vil da foreslå dig at lave en separat tråd om din problematik og se om nogen kan hjælpe dig med den.
Avatar billede slein55 Mester
29. august 2023 - 11:08 #24
jeg har fundet ud af at sende email med PHPmailer men når jeg har sendt får jeg ca 30 linier med tekst som det her under hvordan undgår jeg det??

2023-08-29 09:03:31 CLIENT -> SERVER: Content-Type: text/html; charset=us-ascii
2023-08-29 09:03:31 CLIENT -> SERVER:
2023-08-29 09:03:31 CLIENT -> SERVER: This is the HTML message body <b>in bold!</b>
2023-08-29 09:03:31 CLIENT -> SERVER:
2023-08-29 09:03:31 CLIENT -> SERVER:
2023-08-29 09:03:31 CLIENT -> SERVER: --b1=_LmXL9ZHNHDpPPldfRU0Q2bgH2F8runSEYXBPRj35umk--
2023-08-29 09:03:31 CLIENT -> SERVER:
2023-08-29 09:03:31 CLIENT -> SERVER: .
Avatar billede ejvindh Ekspert
29. august 2023 - 12:33 #25
Du skal udkommentere eller fjerne den linje, hvor der står:

$mail->SMTPDebug = SMTP::DEBUG_SERVER;
Avatar billede arne_v Ekspert
29. august 2023 - 16:11 #26
Jeg kender intet til PHPMailer men jeg kender lidt til tegnsæt.

Og jeg undrer mig over denne her:

Content-Type: text/html; charset=us-ascii

US-ASCII i 2023?
Avatar billede slein55 Mester
02. september 2023 - 22:12 #27
tak for de forskellige forslag jeg har fået mine programmer til at virke igen, tror nok det BOM var en stor del af det jeg fik installeret PHPMailer og det kører fint
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