Miten lähetän sähköpostiviestejä HTML/PHP-sivustolta?

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";
}
}
?>