From 9cb35f2bf2127cc8ac077aae17514a57e576217d Mon Sep 17 00:00:00 2001 From: George Halkiadakis Date: Wed, 26 Apr 2023 04:43:12 +0300 Subject: alfa.2 version; seceral optimizations; added support for mail-relay --- public/app/extends/Send_mail.php | 254 +++++++++++++++++++++------------------ 1 file changed, 138 insertions(+), 116 deletions(-) (limited to 'public/app/extends') diff --git a/public/app/extends/Send_mail.php b/public/app/extends/Send_mail.php index fa0d8d3..52eab53 100644 --- a/public/app/extends/Send_mail.php +++ b/public/app/extends/Send_mail.php @@ -8,96 +8,179 @@ use PHPMailer\PHPMailer\Exception; class Send_mail { + /** send_activation_code + * + * construct the envelope = [ + * email => user email + * name => user full name + * subject => subject + * body => email message body + * ] + * + * then send the email; + * + * @param $activator (array): [ + * email => user email, + * name => user full name, + * code => activation code + * ] + * + * @return success_starus (boolean) + * + * TODO: + * check for email templating: + * + https://stackoverflow.com/questions/2391171/how-to-get-output-from-local-script-in-php + * + https://stackoverflow.com/questions/171318/how-do-i-capture-php-output-into-a-variable + */ + public static function send_activation_code($activator) + { + $activation_url = SITE_URL ."/account/activate?ticket=". $activator['code']; + $envelope = [ + 'email' => $activator['email'], + 'name' => $activator['name'], + 'subject' => 'Εγγραφή στο Classroom', + 'body' => "Χαίρετε,
+ το παρόν αυτοποιημένο email σάς έχει σταλεί + γιατί έχει γίνει αίτημα εγγραφής σας στο Classroom.
+
+ Όνομα επαφής: ". $activator['name'] ."
+ Email : ". $activator['email'] ."
+
+ Για να ενεργοποιήσετε την πρόσβασή σας στο site + θα πρέπει ακολουθήσετε τον παρακάτω σύνδεσμο: + ". $activation_url .". +
+
+ Μετά την ενεργοποίηση θα έχετε πρόσσβαση + στο περιεχόμενο του site.
+ Μην απαντήσετε στο email, + δεν υπάρχει φυσική επαφή η οποία να λαμβάνει τυχόν replies." + ]; + + switch (DEFAULT_MAIL_SERVICE) { + case 'mailjet': + $reply = self::send_mailjet($envelope); + break; + + case 'phpMailer': + $reply = self::send_phpMailer($envelope); + break; + } - private static function init_mail() + return $reply; + + } + + + /** send phpMailer + * + * send email using phpMailer class; + * optional SMTP server configuration; + * + * @param $envelope + * @return success_starus (boolean) + */ + public static function send_phpMailer($envelope) { $mail = new PHPMailer(); - // setup smpt + # // setup smpt $mail->SMTPDebug = 3; $mail->IsSMTP(); $mail->Host = MAIL_HOST; - $mail->SMPTAuth = false; + # $mail->SMPTAuth = false; $mail->SMTPSecure = MAIL_ENCRYPTION; - // $mail->Protocol = 'mail'; + # // $mail->Protocol = 'mail'; $mail->Mailer = MAIL_MAILER; $mail->Port = MAIL_PORT; $mail->Username = MAIL_USERNAME; $mail->Password = MAIL_PASSWORD; - return $mail; - } + // setup format + $mail->CharSet = 'utf-8'; + $mail->IsHTML(true); + // setup THE mail + // --- -- -- - - - + // It's important not to use the submitter's address as the from address + // as it's forgery, which will cause your messages to fail SPF checks. + // Use an address in your own domain as the from address; + // put the submitter's address in a reply-to - /** - * - */ - private static function init_slack() - { + $mail->setFrom(NO_REPLY_EMAIL, MAIL_FROM_NAME); + $mail->addAddress($envelope['email'], $envelope['name']); + $mail->addReplyTo(REPLY_TO_EMAIL, MAIL_FROM_NAME); + $mail->Subject = $envelope['subject']; + $mail->Body = $envelope['body']; + + return (!$mail->send()) ? false : true; } - /** + /** send_mailjet * - * @param $envelope (array): mail from/to and activation code + * send email using CURL mail-relay of Mailjet * - * TODO: - * check for email templating: - * + https://stackoverflow.com/questions/2391171/how-to-get-output-from-local-script-in-php - * + https://stackoverflow.com/questions/171318/how-do-i-capture-php-output-into-a-variable + * @param $envelope + * @return success_starus (boolean) */ - public static function send_activation_code($envelope) + public static function send_mailjet($envelope) { - $mail = self::init_mail(); + $body = [ + 'Messages' => [ + [ + 'From' => [ + 'Email' => REPLY_TO_EMAIL, + 'Name' => MAIL_FROM_NAME + ], + 'To' => [ + [ + 'Email' => $envelope['email'], + 'Name' => $envelope['name'] + ] + ], + 'Subject' => $envelope['subject'], + 'HTMLPart' => $envelope['body'] + ] + ] + ]; + + $ch = curl_init(); + + curl_setopt($ch, CURLOPT_URL, "https://api.mailjet.com/v3.1/send"); + curl_setopt($ch, CURLOPT_POST, 1); + curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($body)); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_HTTPHEADER, array( + 'Content-Type: application/json') + ); + curl_setopt( + $ch, + CURLOPT_USERPWD, + MAILJET_APIKEY. ':'. MAILJET_SECRET + ); + $server_output = curl_exec($ch); + curl_close ($ch); + + $response = json_decode($server_output); - // setup format - $mail->CharSet = 'utf-8'; - $mail->IsHTML(true); + return ($response->Messages[0]->Status == 'success'); - // setup THE mail - // --- -- -- - - - - // It's important not to use the submitter's address as the from address as it's forgery, - // which will cause your messages to fail SPF checks. - // Use an address in your own domain as the from address, put the submitter's address in a reply-to - $mail->setFrom(NO_REPLY_EMAIL, MAIL_FROM_NAME); - $mail->addAddress($envelope['email'], $envelope['name']); - $mail->addReplyTo(REPLY_TO_EMAIL, MAIL_FROM_NAME); - $mail->Subject = 'Εγγραφή στο Classroom'; - $mail->Body = "Χαίρετε,
- το παρόν αυτοποιημένο email σάς έχει σταλεί γιατί έχει γίνει αίτημα εγγραφής σας στο Classroom.
-
- Όνομα επαφής: ". $envelope['name'] ."
- Email : ". $envelope['email'] ."
-
- Για να ενεργοποιήσετε την πρόσβασή σας στο site θα πρέπει να παρακαλώ πατήστε στον - παρακάτω σύνδεσμο url - . -
-
- Μετά την ενεργοποίηση θα έχετε πρόσσβαση στο περιεχόμενο του site.
-
- Μην απαντήσετε στο email γιατί δεν υπάρχει φυσική επαφή η οποία να λαμβάνει τυχόν replies.
"; - if (!$mail->send()) { - return false; - } else { - return true; - } - } - } -/** - * +/** NOTE: + * ----------------------------------------------------------------------------- + * (brainstorming) * Optimization per concept alternative technologies @@ -125,66 +208,5 @@ Database Log Log event to Slack Log event to Email - * - * - */ - -/** custom email api - * - * host : https://api.roptron.gr - * apikey : md5(hash)-substring(0,5, md5(service)) 8668d1c4a8f5aba236a8f821d148340f-0c83f - * message : serialize([ - * from[email] => from name - * replyTo[email] => reply-to-Name - * to => [ - * email => email-name - * secondemail => another email name - * ] - * type => html - * charset => utf8 - * subject => mail subject - * mailBody => html string - * ]) - * - */ - -/** Several custom APIs - * - * Mailer - * - * sendpulse - * rU8WEmcHsRcEQaH - * rU8WEmcHsRcEQaH - * - * mailjet - * piipiis@g - * EN6Xg8!99ZTKaYp7 - * - * - * sendGrid - * piipiis - * EN6Xg899ZTKU8WEmcHsR54321 - * - * - * time4vps... - * https://community.time4vps.com/discussion/75/are-any-ports-blocked-by-time4vps - * - * test activation code: - * ca42d68cfba5fbbafeacc010b8e3a551 - * - * - * - * MAIL API - * --- -- -- - - - - * client = ip/mp5(IP) or domain/md5(ref_domain) - * token = md5(client + timestamp + rand(0,10000)) - * - * api : auth_content : client : token - * --- : --- : --- : --- - * mail : ip|domain : md5(*) : md5(...) -> send an email - * image : ip|domain : md5(*) : md5(...) -> proccess an image (resize|crop|convert) - * slack : ip|domain : md5(*) : md5(...) -> send a slack message to channel - * database : ip|domain : md5(*) : md5(...) -> - * + * ----------------------------------------------------------------------------- */ - \ No newline at end of file -- cgit v1.2.3