Skip to content

Instantly share code, notes, and snippets.

@cielblog cielblog/Mai.php
Last active Sep 30, 2018

Embed
What would you like to do?
<?php
//email.php: Sends an email using an auth smtp connection
//v3
class EMail
{
const newline = "\r\n";
private $Localhost;
private $skt;
public $Server = "127.0.0.1";
public $Port = "25";
public $Username;
public $Password;
public $ConnectTimeout;
public $ResponseTimeout;
public $Headers;
public $ContentType;
public $From;
public $To;
public $Cc;
public $Subject;
public $Message;
public $Log;
function __construct()
{
$this->Localhost = "localhost";
$this->ConnectTimeout = 30;
$this->ResponseTimeout = 8;
$this->From = [];
$this->To = [];
$this->Cc = [];
$this->Log = [];
$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[] = [$addr, $name];
}
function AddCc($addr, $name = "")
{
$this->Cc[] = [$addr, $name];
}
function SetFrom($addr, $name = "")
{
$this->From = [$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";
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.