License: GNU GPL-3.0 or later Description: Simple send plain text and HTML e-mails over SMTP server with save messages in IMAP server. Version: 1.0.0 Milestones: 2025-06-20 22:30 Igor - Forked from Beteha to standalone public library */ namespace TPsoft\Emailer; use PEAR; use Mail; use Mail_mime; use Exception; class Emailer { private $config_smtp = array( 'host' => null, 'port' => null, 'encryption' => null, 'username' => null, 'password' => null, ); private $config_imap = array( 'host' => null, 'port' => null, 'username' => null, 'password' => null, 'encryption' => null, 'folder' => null ); public function __construct(array $config = array()) { $this->config_smtp = array_merge($this->config_smtp, $config['smtp']); $this->config_imap = array_merge($this->config_imap, $config['imap']); } public function send(string $send_to, string $subject, string $message_text, string $message_html): bool { $secure = $this->config_smtp['encryption'] ?? 'smtp'; // Odoslanie spravu $suc = $this->smtpEmail( $secure . '://' . $this->config_smtp['host'], $this->config_smtp['port'], $this->config_smtp['username'], $this->config_smtp['password'], $this->config_smtp['username'], $send_to, $subject, $message_text, $message_html, null, $message_mime ); if ($suc != true) { return false; } // Ulozenie spravy do odoslanych if ($this->config_imap['host']) { $suc2 = $this->imapEmailSave( $this->config_imap['host'], $this->config_imap['port'], $this->config_imap['encryption'], $this->config_imap['folder'], $this->config_imap['username'], $this->config_imap['password'], $message_mime ); if ($suc2 != true) { return false; } } return true; } public function smtpEmail($smtp_host, $smtp_port = 465, $smtp_username, $smtp_password, $email_from, $email_to, $subject, $message_text = null, $message_html = null, $reply_to = null, &$message_mime = null) { if (is_null($reply_to)) $reply_to = $email_from; $crlf = "\n"; $hdrs = array( 'From' => $email_from, 'To' => $email_to, 'Subject' => '=?UTF-8?B?' . base64_encode($subject) . '?=', 'Reply-To' => $reply_to, 'Content-Type' => 'text/plain; charset=utf-8', 'X-Mailer' => 'TPsoft/Emailer' ); $mime_params = array( 'eol' => $crlf, 'text_encoding' => '7bit', 'text_charset' => 'UTF-8', 'html_charset' => 'UTF-8', 'head_charset' => 'UTF-8' ); $mime = new Mail_mime($mime_params); if (!is_null($message_text)) $mime->setTXTBody($message_text); if (!is_null($message_html)) $mime->setHTMLBody($message_html); //$mime->addAttachment($file, 'text/plain'); $body = $mime->get(); $headers = $mime->headers($hdrs); $message_mime = $mime->getMessage(); $smtp = Mail::factory('smtp', ['host' => $smtp_host, 'port' => $smtp_port, 'auth' => true, 'username' => $smtp_username, 'password' => $smtp_password]); $mail = $smtp->send($email_to, $headers, $body); if (PEAR::isError($mail)) { throw new Exception($mail->getMessage()); } return true; } public function imapEmailSave($imap_host, $imap_port = 993, $imap_secure = 'ssl', $imap_folder = 'Sent', $imap_username, $imap_password, $message_mime) { // example $path = "{imap.gmail.com:993/imap/ssl}[Gmail]/Sent Mail"; $path = sprintf('{%s:%s/%s}%s', $imap_host, $imap_port, $imap_secure, $imap_folder); //Tell your server to open an IMAP connection using the same username and password as you used for SMTP $imapStream = imap_open($path, $imap_username, $imap_password); $result = imap_append($imapStream, $path, $message_mime); imap_close($imapStream); return $result; } public function imapList($imap_host, $imap_port = 993, $imap_secure = 'ssl', $imap_username, $imap_password) { $mbox = imap_open('{' . $imap_host . ':' . $imap_port . '/' . $imap_secure . '}', $imap_username, $imap_password, OP_HALFOPEN); if (!$mbox) { throw new Exception('Can\'t connect: '.imap_last_error()); } $list = imap_list($mbox, '{' . $imap_host . ':' . $imap_port . '/' . $imap_secure . '}', "*"); $ret = array(); if (is_array($list)) { foreach ($list as $val) { $ret[] = imap_utf7_decode($val); } } else { throw new Exception('imap_list failed: ' . imap_last_error()); } imap_close($mbox); return $ret; } }