* @version $Id$ * @access public * @license http://opensource.org/licenses/gpl-3.0.html * @see /newsletter/send.php Direct file called by the application */ /** * absolute_url * http://www.howtoforge.com/forums/showthread.php?t=4 * @param string $txt * @param string $base_url * @return string $txt */ function absolute_url($txt, $base_url) { $needles = array('href="', 'src="', 'background="'); $new_txt = ''; if(substr($base_url,-1) != '/') $base_url .= '/'; $new_base_url = $base_url; $base_url_parts = parse_url($base_url); foreach($needles as $needle){ while($pos = strpos($txt, $needle)){ $pos += strlen($needle); if(substr($txt,$pos,7) != 'http://' && substr($txt,$pos,8) != 'https://' && substr($txt,$pos,6) != 'ftp://' && substr($txt,$pos,7) != 'mailto:'){ if(substr($txt,$pos,1) == '/') $new_base_url = $base_url_parts['scheme'].'://'.$base_url_parts['host']; $new_txt .= substr($txt,0,$pos).$new_base_url; } else { $new_txt .= substr($txt,0,$pos); } $txt = substr($txt,$pos); } $txt = $new_txt.$txt; $new_txt = ''; } return $txt; } // We create the Transport if (defined ( 'MAIL_MAILER' )) { // sendmail if (MAIL_MAILER == 'sendmail') { $transport = new Swift_SendmailTransport(MAIL_SENDMAIL); } // smtp if (MAIL_MAILER == 'smtp') { if (defined ( 'MAIL_SMTP_AUTH' ) && MAIL_SMTP_AUTH == 1) { if (defined ( 'MAIL_SMTP_ENCRYPTION')) { $transport = (new Swift_SmtpTransport(MAIL_HOST, MAIL_PORT, MAIL_SMTP_ENCRYPTION)) ->setUsername(MAIL_SMTP_USER) ->setPassword(MAIL_SMTP_PASS); } else { $transport = (new Swift_SmtpTransport(MAIL_HOST, MAIL_PORT))->setUsername ( MAIL_SMTP_USER )->setPassword ( MAIL_SMTP_PASS ); } } else { $transport = (new Swift_SmtpTransport(MAIL_HOST, MAIL_PORT)); } } } // Create the Mailer using the Transport $mailer = new Swift_Mailer($transport); /** * Ability to set options through plugins * examples taken from : * http://swiftmailer.org/docs/plugins.html * Duplicate original file and locate it into public themes * Finally uncomment instructions and set them correcty */ // // Use AntiFlood to re-connect after 100 emails // $mailer->registerPlugin(new Swift_Plugins_AntiFloodPlugin(100)); // // And specify a time in seconds to pause for (30 secs) // $mailer->registerPlugin(new Swift_Plugins_AntiFloodPlugin(100, 30)); // // Rate limit to 100 emails per-minute // $mailer->registerPlugin(new Swift_Plugins_ThrottlerPlugin( // 100, Swift_Plugins_ThrottlerPlugin::MESSAGES_PER_MINUTE // )); // // Rate limit to 10MB per-minute // $mailer->registerPlugin(new Swift_Plugins_ThrottlerPlugin( // 1024 * 1024 * 10, Swift_Plugins_ThrottlerPlugin::BYTES_PER_MINUTE // )); /** echo "destinataire : ".$email_recipient."
"; echo "sujet : ".$email_subject."
"; echo "body : ".$email_html_body."
"; echo "methode : ".$email_method."
"; echo "host : ".$mail->Host."
"; echo "port : ".$mail->Port."
"; */ for($i = 0;$i < count($newsletters); $i++) { $newsletter_id = $newsletters[$i]['newsletter_id']; $email_subject = formatText($newsletters[$i]['newsletter_title'], '2HTML'); $newsletter_body_html = formatText($newsletters[$i]['newsletter_body'], '2HTML'); // get content with SIMPLEHTMLDOM $dom = str_get_html($template_html); // we do replace the content from template with content stored id db inside
if($dom->find('div[id=main]', 0)) { $dom->find('div[id=main]', 0)->innertext= $newsletter_body_html; $template_html = $dom->save(); // we finally save changes to apply them } preg_replace("/(<\s*(a|img)\s+[^>]*(href|src)\s*=\s*[\"'])(?!http)([^\"'>]+)[\"'>]/", "$1".CURRENT_APP_URL."$4", $newsletter_body_html); $email_html_body=str_replace('##TITLE##', $email_subject, $template_html); $email_html_body=str_replace('##CHARSET##', CHARSET, $email_html_body); $email_html_body=str_replace('##CONTENTS##', '', $email_html_body); // @todo not used anymore since 2.6 - remove later $email_html_body=str_replace('##SITENAME##', SITE_NAME, $email_html_body); if(file_exists('../'.THEME_DIRECTORY.'/public/'.THEME_PUBLIC.'/images/logo-newsletter.png')) { $email_html_body=str_replace('##LOGOIMG##', '', $email_html_body); } else { $email_html_body=str_replace('##LOGOIMG##', '', $email_html_body); } // since v2.6 ##CSSPATH## not necessary $email_html_body=str_replace('##CSSPATH##', SITE_ROOT_URL. THEME_DIRECTORY.'/public/'.THEME_PUBLIC.'/css/', $email_html_body); $email_html_body=str_replace('##SITEURL##', SITE_ROOT_URL, $email_html_body); $email_html_body=str_replace('##SITEMAIL##', SITE_MAIL, $email_html_body); $email_html_body=absolute_url($email_html_body, SITE_ROOT_URL); $newsletter_body_txt = formatText($newsletters[$i]['newsletter_body']); $email_text_body=str_replace('##TITLE##', strip_tags(formatText($email_subject)) . "\n" . strip_tags(formatText($newsletter_body_txt)), $template_txt); $email_text_body=str_replace('##CONTENTS##', '', $email_text_body); // @todo not used anymore since 2.6 - remove later $email_text_body=str_replace('##SITENAME##', SITE_NAME, $email_text_body); $email_text_body=str_replace('##SITEURL##', SITE_ROOT_URL, $email_text_body); $email_text_body=str_replace('##SITEMAIL##', SITE_MAIL, $email_text_body); $email_text_body=absolute_url($email_text_body, SITE_ROOT_URL); isset($email_from) ? $from = $email_from : $from = MAIL_FROM; isset($email_fromname) ? $fromname = $email_fromname : $fromname = MAIL_FROMNAME; $altbody = str_replace('&', '&', $email_text_body); // Create a message instance $message = new Swift_Message($email_subject); $message->setFrom(array($from => $fromname)) ->setReplyTo(array(MAIL_REPLY => MAIL_REPLYNAME)); for($k = 0; $k < count($emails_batch); $k++) { $email_id = $emails_batch[$k]['emailcol_id']; $email_recipient = $emails_batch[$k]['emailcol_email']; // we create the link to unsubscribe newsletter and add it to the message $unsubscribe_url= SITE_ROOT_URL.'public/index.php?rub='.$GLOBALS['links'][U_L]['subscribe-newsletter']['linkvalue'].'&del_action=on&newsletteremail='.$email_recipient; $unsubscribe_link_html = sprintf(_t('newsletter', 'unsubscribe_html'), $unsubscribe_url); $unsubscribe_link_txt = _t('newsletter', 'unsubscribe_txt'). ' '. $unsubscribe_url; $email_html_body=str_replace('##UNSUBSCRIBE_LINK##', $unsubscribe_link_html, $email_html_body); $email_text_body=str_replace('##UNSUBSCRIBE_LINK##', $unsubscribe_link_txt, $email_text_body); // finish message settings $message->setBody($email_html_body, 'text/html')->addPart($altbody, 'text/plain')->setTo($email_recipient); $r = $mailer->Send($message); // hope it fixes bug https://dev.linea21.com/issues/1438 - see https://stackoverflow.com/questions/43871739/swiftmailer-broken-pipe-error $mailer->getTransport()->stop(); // < this line closes socket and at next iteration its reopened // if any issue again, try usleep() https://www.php.net/manual/fr/function.usleep.php but it seems, performance is very bad ... // also using antiflood-plugin could be an option : https://swiftmailer.symfony.com/docs/plugins.html#using-the-antiflood-plugin // see around line 85 in current script if(!$r) { $logmsg = 'not sent'; } else { $logmsg = 'sent'; } logfile(LOG_MAILING, array($email_subject, $newsletter_id, $email_recipient, $logmsg)); } if(!isset($doNotPublish)) $newsletter_object->SetNewsletterPublished($newsletter_id, $sql_object); } ?>