Zonerin webhotelliympäristössä on tietoturvasyistä estetty PHPMail -funktion käyttäminen. Tämä tarkoittaa, että oletuksena sovellukset eivät kykene lähettämään sähköposteja palvelimelta, ilman erillisiä määrityksiä.
HTML/PHP-lomakkeita voidaan lähettää, kun lomakkeella käytetään SMTP Autentikointia.
Tästä ohjeessa käydään läpi esimerkit lomakkeiden sähköpostien lähettämiseen SMTP-autentikoinnilla hyödyntäen PHPMaileria (ja myös ilman).
SMTP-autentikoinnin määritys lomakkeelle
1. Luo uusi sähköpostilaatikko
Voit myös käyttää vanhaa olemassa olevaa laatikkoa, mutta suosittelemme uuden luontia.
Ohje sähköpostilaatikon luomiseen.
2. Luo lomake-sivu.
Luodaan esimerkkiksi lomake.html -tiedosto.
<form method="post" action="email.php"> Email: <input name="email" id="email" type="text" /><br /> Message:<br /> <textarea name="message" id="message" rows="15" cols="40"></textarea><br /> <input type="submit" value="Submit" /> </form>
Lomake näyttää tältä:
3. Määritä PHP
a) PHPMailer
PHPMailerin saat ladattua täältä: https://github.com/PHPMailer/PHPMailer
Saat ladattua sen ZIP-tiedostona valitsemalla ”Clone or download” ja ”Download ZIP”.
ZIP-tiedoston sisältö tulee siirtää webhotellin.
Esimerkissä ZIP-tiedosto on purettu sellaisenaan samaan hakemistoon email.php -tiedoston kanssa, jolloin PHPMailerin tiedostot löytyvät ”PHPMailer-master” nimisestä kansioista.
Seuraavaksi luodaan email.php tiedosto.
Katso alla oleva php-koodi läpi ja muuta tarvittavat/haluamasi kohdat.
<?php // Haetaan tiedot lomakkeelta $email = $_REQUEST['email']; $message = $_REQUEST['message']; // Täytä seuraavat kohdat omilla tiedoilla $from = 'smtp@omadomain.fi'; // Webhotelliin luodun sähköpostilaatikon osoite $pass = 'Salasana1234'; // Sähköpostilaatikon salasana $to = 'vastaanottaja@omadomain.fi'; // Osoite johon viestit lähetetään // Import PHPMailer classes into the global namespace // These must be at the top of your script, not inside a function use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Exception; // Load composer's autoloader // Tarkista kansio polut että ne vastaavat sitä miten purit phpMailerin webhotelliisi require 'PHPMailer-master/src/Exception.php'; require 'PHPMailer-master/src/PHPMailer.php'; require 'PHPMailer-master/src/SMTP.php'; // phpMailer osuus alkaa $mail = new PHPMailer(true); try { //Server settings $mail->SMTPDebug = 0; // Tähän voi asettaa myös "2", jolloin näkee enemmän tietoja lähetyksestä $mail->isSMTP(); $mail->Host = 'localhost'; // Määritetään sähköpostipalvelin $mail->SMTPAuth = true; $mail->Username = $from; // Haetaan ylempänä annettu sähköpostiosoite $mail->Password = $pass; // Haetaan salasana $mail->SMTPSecure = ''; $mail->SMTPAutoTLS = false; $mail->Port = 587; //Recipients $mail->setFrom($from, 'Palaute'); // "Palaute" näkyy viestissä lähettäjän nimenä, jonka voitte valita vapaasti $mail->addAddress($to); // Haetaan ylempänä annettu osoite, johon viestit lähetetään $mail->addReplyTo($email); // Haetaan lomakkeeseen täytetty sähköpostiosoite //Content $mail->isHTML(true); $mail->Subject = 'Palaute sivuilta'; // Vapaavalintainen viestin otsikko $mail->Body = $message; // Haetaan lomakkeeseen täytetty viesti $mail->AltBody = $message; // Haetaan lomakkeeseen täytetty viesti $mail->send(); echo 'Message has been sent'; // Ilmoitus viestin lähtyksen onnistumisesta // echo "<script>location.href='lahetetty.html';</script>"; // Esimerkki uudelleen ohjauksesta toiselle sivulle } catch (Exception $e) { echo 'Message could not be sent. Mailer Error: ', $mail->ErrorInfo; // Ilmoitus viestin lähetyksen epäonnistumisesta // echo "<script>location.href='epaonnistui.html';</script>"; // Esimerkki uudelleen ohjauksesta toiselle sivulle }
b) PHP-koodi ilman PHPMaileria
Luodaan email.php tiedosto.
Muuta sähköpostiosoite ja salasana -kohdat oikeiksi.
<?php $email = $_REQUEST['email'] ; // Haetaan lomakkeesta sähköpostiosoite kenttä $message = $_REQUEST['message']; // Haetaan lomakkeesta viesti kenttä $mail = new EMail; $mail->Server = "localhost"; $mail->Username = 'sahkoposti@omadomain.fi'; // Webhotelliin luotu sähköpostilaatikko $mail->Password = 'Salasana1234'; // Sähköpostilaatikon salasana $mail->SetFrom("sahkoposti@omadomain.fi","Lahettajan nimi"); //Viestin lähettäjän sähköpostiosoite ja nimi. $mail->AddTo("sahkoposti@omadomain.fi","Vastaanottajan nimi"); //Viestin vastaanottajan sähköpostiosoite ja nimi $mail->Subject = "Palautelomake"; // Viestin otsikko $mail->Message = "Sahkopostiosoite: $email<br> Viesti: $message\n.\n"; // Viestin sisältö. Tässä tapauksessa lomakkeessa ilmoitettu sähköpostiosoite ja viesti. //Optional extras $mail->ContentType = "text/html"; // Defaults to "text/plain; charset=iso-8859-1" //$mail->Headers['X-SomeHeader'] = 'abcde'; // Set some extra headers if required echo $success = $mail->Send(); /* This is the EMail class. Anything below this should not be edited unless you really know what you're doing. */ class EMail { const newline = "\r\n"; private $Port, $Localhost, $skt; public $Server, $Username, $Password, $ConnectTimeout, $ResponseTimeout, $Headers, $ContentType, $From, $To, $Cc, $Subject, $Message, $Log; function __construct() { $this->Server = "localhost"; $this->Port = 587; $this->Localhost = "localhost"; $this->ConnectTimeout = 30; $this->ResponseTimeout = 8; $this->From = array(); $this->To = array(); $this->Cc = array(); $this->Log = array(); $this->Headers['MIME-Version'] = "1.0"; $this->Headers['Content-type'] = "text/plain; charset=iso-8859-1"; } private function GetResponse() { stream_set_timeout($this->skt, $this->ResponseTimeout); $response = ''; while (($line = fgets($this->skt, 515)) != false) { $response .= trim($line) . "\n"; if (substr($line,3,1)==' ') break; } return trim($response); } private function SendCMD($CMD) { fputs($this->skt, $CMD . self::newline); return $this->GetResponse(); } private function FmtAddr(&$addr) { if ($addr[1] == "") return $addr[0]; else return "\"{$addr[1]}\" <{$addr[0]}>"; } private function FmtAddrList(&$addrs) { $list = ""; foreach ($addrs as $addr) { if ($list) $list .= ", ".self::newline."\t"; $list .= $this->FmtAddr($addr); } return $list; } function AddTo($addr,$name = "") { $this->To[] = array($addr,$name); } function AddCc($addr,$name = "") { $this->Cc[] = array($addr,$name); } function SetFrom($addr,$name = "") { $this->From = array($addr,$name); } function Send() { $newLine = self::newline; //Connect to the host on the specified port $this->skt = fsockopen($this->Server, $this->Port, $errno, $errstr, $this->ConnectTimeout); if (empty($this->skt)) return false; $this->Log['connection'] = $this->GetResponse(); //Say Hello to SMTP $this->Log['helo'] = $this->SendCMD("EHLO {$this->Localhost}"); //Request Auth Login $this->Log['auth'] = $this->SendCMD("AUTH LOGIN"); $this->Log['username'] = $this->SendCMD(base64_encode($this->Username)); $this->Log['password'] = $this->SendCMD(base64_encode($this->Password)); //Email From $this->Log['mailfrom'] = $this->SendCMD("MAIL FROM:<{$this->From[0]}>"); //Email To $i = 1; foreach (array_merge($this->To,$this->Cc) as $addr) $this->Log['rcptto'.$i++] = $this->SendCMD("RCPT TO:<{$addr[0]}>"); //The Email $this->Log['data1'] = $this->SendCMD("DATA"); //Construct Headers if (!empty($this->ContentType)) $this->Headers['Content-type'] = $this->ContentType; $this->Headers['From'] = $this->FmtAddr($this->From); $this->Headers['To'] = $this->FmtAddrList($this->To); if (!empty($this->Cc)) $this->Headers['Cc'] = $this->FmtAddrList($this->Cc); $this->Headers['Subject'] = $this->Subject; $this->Headers['Date'] = date('r'); $headers = ''; foreach ($this->Headers as $key => $val) $headers .= $key . ': ' . $val . self::newline; $this->Log['data2'] = $this->SendCMD("{$headers}{$newLine}{$this->Message}{$newLine}."); // Say Bye to SMTP $this->Log['quit'] = $this->SendCMD("QUIT"); fclose($this->skt); return substr($this->Log['data2'],0,3) == "250"; } } ?>