/** * aldonas plian kopio-ricevanton * (aux plurajn tiajn). * * @param string|array $adreso aux String kun unu adreso, aux el * pluraj adresoj, disigitaj per komo, aux array de unuopaj adresoj. * Tiuj estos aldonitaj al la gxisnuna listo de * kasxitaj kopio-ricevantoj. */ function kopion_al($adreso) { if ($adreso and !is_array($adreso)) { $adreso = preg_split('/, */', $adreso); } if ($adreso) { $this->kopioj_listo = array_merge($this->kopioj_listo, $adreso); } else { // nenio sxangxigxas, ne necesas // rekalkuli la Bcc-kaplinion. return; } $eraro = $this->baza_objekto->SetHeader("Bcc", implode(",", $this->kopioj_listo)); $this->testu_eraron($eraro); }
$reply_name = $from_name; $reply_address = $from_address; $reply_address = $from_address; $error_delivery_name = $from_name; $error_delivery_address = $from_address; /* * Change these lines or else you will be mailing the class author. */ $to_name = "Manuel Lemos"; $to_address = "*****@*****.**"; $subject = "Testing Manuel Lemos' MIME E-mail composing and sending PHP class: HTML message"; $email_message = new email_message_class(); $email_message->SetEncodedEmailHeader("To", $to_address, $to_name); $email_message->SetEncodedEmailHeader("From", $from_address, $from_name); $email_message->SetEncodedEmailHeader("Reply-To", $reply_address, $reply_name); $email_message->SetHeader("Sender", $from_address); /* * Set the Return-Path header to define the envelope sender address to which bounced messages are delivered. * If you are using Windows, you need to use the smtp_message_class to set the return-path address. */ if (defined("PHP_OS") && strcmp(substr(PHP_OS, 0, 3), "WIN")) { $email_message->SetHeader("Return-Path", $error_delivery_address); } $email_message->SetEncodedHeader("Subject", $subject); /* * An HTML message that requires any dependent files to be sent, * like image files, style sheet files, HTML frame files, etc.., * needs to be composed as a multipart/related message part. * Different parts need to be created before they can be added * later to the message. *
function send($to = '') { $this->error = ''; /* * check if newsletter and issue are set */ if (!is_object($this->c_newsletter) || !is_object($this->c_issue)) { $this->error = 'No valid newsletter issue set'; $this->log->error($this->error); return false; } /* * check if text or html messages are set */ $message = $this->composeText(); $html = $this->composeHtml(); if (empty($message) && empty($html)) { $this->error = 'No content set'; $this->log->error($this->error); return false; } /* * now prepare email */ $from_name = $this->c_newsletter->sender_name; $from_address = $this->c_newsletter->getSender(); if (empty($from_address)) { $this->error = 'No valid sender address set'; $this->log->error($this->error); return false; } $reply_name = $from_name; $reply_address = $this->c_newsletter->getReply(); if (empty($reply_address)) { $reply_address = $from_address; } $error_delivery_name = $from_name; $error_delivery_address = $this->c_newsletter->getReturn(); if (empty($error_delivery_address)) { if (empty($GLOBALS['tnl_error_email'])) { $error_delivery_address = $from_address; } else { $error_delivery_address = $GLOBALS['tnl_error_email']; } } if (empty($to)) { $to = $this->c_newsletter->getSubscribers(); } elseif (!is_array($to)) { $to = array($to); } /*array( array( 'UID' => '0000001', "address"=>"*****@*****.**", "name"=>"Peter Gabriel" ), array( 'UID' => '0000002', "address"=>"*****@*****.**", "name"=>"Paul Simon" ), array( 'UID' => '0000003', "address"=>"*****@*****.**", "name"=>"Mary Chain" ) );*/ $subject = $this->c_issue->title; switch (XOX_MAILER_TYPE) { case 'pickup': $email_message = new pickup_message_class(); $email_message->dir_sep = '/'; $email_message->mailroot_directory = XOX_APP_BASE . '/jobs'; $email_message->pickup_file_prefix = date('YmdHis') . '_'; $email_message->pickup_file_postfix = '.eml'; break; case 'sendmail': $email_message = new sendmail_message_class(); $email_message->delivery_mode = SENDMAIL_DELIVERY_DEFAULT; /* Mode of delivery of the message. Supported modes are: * SENDMAIL_DELIVERY_DEFAULT - Default mode * SENDMAIL_DELIVERY_INTERACTIVE - Deliver synchronously waiting for remote server response. * SENDMAIL_DELIVERY_BACKGROUND - Deliver asynchronously without waiting for delivery success response. * SENDMAIL_DELIVERY_QUEUE - Leave message on the queue to be delivered later when the queue is run * SENDMAIL_DELIVERY_DEFERRED - Queue without even performing database lookup maps. */ $email_message->bulk_mail_delivery_mode = SENDMAIL_DELIVERY_QUEUE; /* Mode of delivery of the message when the class is set to the bulk mail delivery mode */ $email_message->sendmail_arguments = ""; /* Additional sendmail command line arguments */ break; case 'qmail': case 'smtp': case 'mail': default: $email_message = new email_message_class(); break; } echo "<table style='font-size:11px'><tr><td><b>From</b></td><td>{$from_address}, {$from_name}</td></tr>"; echo "<tr><td><b>Reply-To</b></td><td>{$reply_address}, {$reply_name}</td></tr>"; echo "<tr><td><b>Errors-To</b></td><td>{$error_delivery_address}, {$error_delivery_name}</td></tr>"; if (count($to) < 100) { foreach ($to as $subscriber) { echo '<tr><td><b>To</b></td><td>' . $subscriber->email . '</td></tr>'; } } else { echo '<tr><td></td><td><b>Massenmailing</b></td></tr>'; } echo '</table>'; /* * For faster queueing use qmail... * * require_once("qmail_message.php"); * $email_message=new qmail_message_class; * * or sendmail in queue only delivery mode * * require_once("sendmail_message.php"); * $email_message=sendmail_message_class; * $email_message->delivery_mode=SENDMAIL_DELIVERY_QUEUE; * * Always call the SetBulkMail function to hint the class to optimize * its behaviour to make deliveries to many users more efficient. */ $email_message->SetBulkMail(1); $email_message->SetEncodedEmailHeader("From", $from_address, $from_name); $email_message->SetEncodedEmailHeader("Reply-To", $reply_address, $reply_name); /* * Set the Return-Path header to define the envelope sender address * to which bounced messages are delivered. * If you are using Windows, you need to use the smtp_message_class * to set the return-path address. */ if (!XOX_LOCAL_MODE) { $email_message->SetHeader("Return-Path", $error_delivery_address); } $email_message->SetEncodedEmailHeader("Errors-To", $error_delivery_address, $error_delivery_name); $email_message->SetEncodedHeader("Subject", $subject); // make sure text is not cached for personalization $email_message->cache_body = 0; // create copy for text only $email_text = $email_message; /* Create empty parts for the parts that will be personalized for each recipient. */ $email_message->CreateQuotedPrintableTextPart($message, "", $text_part); $email_message->CreateQuotedPrintableHTMLPart($html, "", $html_part); $email_text->CreateQuotedPrintableTextPart($message, "", $text_only_part); /* * Multiple alternative parts are gathered in multipart/alternative parts. * It is important that the fanciest part, in this case the HTML part, * is specified as the last part because that is the way that HTML capable * mail programs will show that part and not the text version part. */ $alternative_parts = array($text_part, $html_part); $email_message->AddAlternativeMultipart($alternative_parts); /* Add the empty part wherever it belongs in the message. */ $email_text->AddPart($text_only_part); /* Iterate personalization for each recipient. */ $count_to = count($to); if (MAILTEST_ACTIVE && $count_to > MAILTEST_MAX_MAILS) { $count_to = MAILTEST_MAX_MAILS; } $tmp = new xoxSimpleTemplate('', '', '', '\\{\\$', '\\}'); $tmp->setVar('DOMAINID', $this->c_newsletter->domain_id); $tmp->setVar('ISSUEID', $this->c_issue->id); set_time_limit(60); for ($recipient = 0; $recipient < $count_to; $recipient++) { $error = ''; #### MAILTEST #### if (MAILTEST_ACTIVE && $count_to > 20) { $testemail = array('*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**'); $to[$recipient]->email = $testemail[rand(0, 11)]; #$to[$recipient]->email = sprintf("*****@*****.**",rand(0,3)); } /* Personalize the recipient address. */ $to_address = $to[$recipient]->email; $to_name = $to[$recipient]->displayname; $textonly = $to[$recipient]->config == 'text'; //$email_class &= ( $textonly ) ? $email_text : $email_message; $email_class = $textonly ? $email_text : $email_message; if (XOX_MAILER_TYPE == 'pickup') { $email_class->pickup_file_prefix = sprintf("%s_%05d_%05d_%05d_%07s_%s_", date('YmdHis'), $this->c_issue->id, $this->mail_counter + 1, $to[$recipient]->uid, $to[$recipient]->mode_data, $to[$recipient]->mode_id == 1 ? 'N' : 'X'); } $email_class->SetEncodedEmailHeader("To", $to_address, $to_name); /* Do we really need to personalize the message body? * If not, let the class reuse the message body defined for the first recipient above. */ if (!$email_class->cache_body) { /* Create a personalized body part. */ $fingerprint = dechex($this->c_issue->id) . "g" . dechex($to[$recipient]->uid); if (MAILTEST_ACTIVE) { $fingerprint .= "g" . $to[$recipient]->mode_data; } $tmp->setVar('USERID', $fingerprint); $tmp->setVar('USEREMAIL', $to[$recipient]->email); $tmp->setVar('USERNAME', $to[$recipient]->displayname); $tmp->setVar('USERSALUT', $to[$recipient]->_details['gender']); $tmp->setVar('USERFNAME', $to[$recipient]->_details['firstname']); $tmp->setVar('USERLNAME', $to[$recipient]->_details['lastname']); $tmp->setVar('USERCOMPANY', $to[$recipient]->_details['company']); $tmp->setVar('USERSTREET', $to[$recipient]->_details['street']); $tmp->setVar('USERCOUNTRY', $to[$recipient]->_details['country']); $tmp->setVar('USERZIP', $to[$recipient]->_details['zip']); $tmp->setVar('USERCITY', $to[$recipient]->_details['city']); $tmp->setVar('USERTEL', $to[$recipient]->_details['telephone']); $tmp->setVar('USERFAX', $to[$recipient]->_details['fax']); $tmp->setVar('USERMOB', $to[$recipient]->_details['mobile']); if ($to[$recipient]->isExpert()) { $tmp->setVar('EXPERTS', '<td align="center" nowrap><a href="http://www.bay-as.de/index.php?id=189&fluid=' . $fingerprint . '" style="font-size:12px; font-family:Arial, Helvetica, sans-serif; text-decoration:none; color:#ffffff;"> <font color="white">BAYAS experts</font><b style="font-size:15px"> </b></a></td><td width="1" bgcolor="#ffffff"><img src="http://www.bay-as.de/fileadmin/images/punkt.gif" height="18" width="1"></td>'); $tmp->setVar('BAYPOINTS', $to[$recipient]->getBayPoints()); } else { $tmp->setVar('EXPERTS', ''); $tmp->setVar('BAYPOINTS', ''); } #$message="Hello ".strtok($to_name," ").",\n\nThis message is just to let you know that Manuel Lemos' e-mail sending class is working as expected for sending personalized messages.\n\nThank you,\n$from_name"; $tmp->parsed_template = $message; $email_class->CreateQuotedPrintableTextPart($tmp->show(true), "", $user_text_part); if (!$textonly) { $tmp->parsed_template = $html; $email_class->CreateQuotedPrintableHTMLPart($tmp->show(true), "", $user_html_part); } /* Make the personalized replace the initially empty part */ if (!$textonly) { $email_class->ReplacePart($text_part, $user_text_part); $email_class->ReplacePart($html_part, $user_html_part); } else { $email_class->ReplacePart($text_only_part, $user_text_part); } } /* Send the message checking for eventually acumulated errors */ #if ( !XOX_LOCAL_MODE ) { $this->error = $email_class->Send(); if ($this->mail_counter++ % 50 == 0) { set_time_limit(60); } $this->log->log(strlen($this->error), sprintf('Versand an: %05d %05d %05d %s [%s] : %s : %s', $this->mail_counter, $to[$recipient]->id, $to[$recipient]->uid, $to[$recipient]->displayname, $to[$recipient]->email, $to[$recipient]->mode_data . ($to[$recipient]->mode_id == 2 ? '*' : ' '), $this->error)); if (strlen($this->error)) { $this->mailerror++; //echo "\n\nERROR: $this->error<br>\n\n"; if ($this->mailerror >= $this->error_break && $this->mailerror == $this->mail_counter) { break; } } #} } /* When you are done with bulk mailing call the SetBulkMail function * again passing 0 to tell the all deliveries were done. */ $email_message->SetBulkMail(0); $email_text->SetBulkMail(0); if (strlen($this->error)) { return false; } return true; }