email;
if(array_key_exists($key, $this->mailinglist)) return false;
$this->mailinglist[$key] = $email;
return true;
}
public function remove($email) {
if(array_key_exists($email, $this->mailinglist)) {
unset($this->mailinglist[$email]);
return true;
}
return false;
}
public function write()
{
$fp = fopen($this->file, "w");
fwrite($fp, "\n");
fwrite($fp, "subj_prefix . "\"\n");
fwrite($fp, " sender=\"" . $this->sender . "\"\n");
fwrite($fp, " replyto=\"" . $this->replyto . "\"\n");
fwrite($fp, " unsubscribe_url=\"" . $this->unsubscribe_url . "\">\n");
fwrite($fp, " \n");
foreach($this->mailinglist as $email) {
fwrite($fp, " email, ENT_QUOTES, "UTF-8") . "\"\n");
fwrite($fp, " timestamp=\"" . $email->timestamp . "\">\n");
fwrite($fp, " \n");
}
fwrite($fp, "\n");
fclose($fp);
}
private function read()
{
$dom = new DomDocument;
$dom->preserveWhiteSpace = FALSE;
$dom->load($this->file);
$nl = $dom->documentElement;
$this->subj_prefix = $nl->getAttribute('subj_prefix');
$this->sender = $nl->getAttribute('sender');
$this->replyto = $nl->getAttribute('replyto');
$this->unsubscribe_url = $nl->getAttribute('unsubscribe_url');
$footers = $dom->getElementsByTagName('footer');
if($footers) {
foreach($footers as $f) {
$this->footer = $f->textContent;
}
}
$params = $dom->getElementsByTagName('email');
foreach ($params as $param) {
$email = new Email($param->getAttribute('email'),
$param->getAttribute('timestamp'));
$this->add($email);
}
}
public function subscribe($emailaddr)
{
$str = "";
if($emailaddr == "your@email.here") return "";
$email = new EMail($emailaddr, time());
if($this->add($email)) {
$this->write();
$str .= "
The email: " . $emailaddr . " has now been subscribed.
";
} else {
$str .= "The email: " . $emailaddr . " is already subscribed.
";
}
return $str;
}
public function unsubscribe($emailaddr)
{
$str = "";
if($this->remove($emailaddr)) {
$this->write();
$str .= "The email: " . $emailaddr . " has now been unsubscribed.
";
} else {
$str .= "The email: " . $emailaddr . " is not subscribed.
";
}
return $str;
}
public function postSingle($email, $subject, $message)
{
$subject = "[".$this->subj_prefix."] " . $subject;
$message .= "\n\n".$this->footer;
$message .= "\n\nTo stop receiving this newsletter, click the following link: ".
$this->unsubscribe_url."&action=unsubscribe&email=". $email->email . "\n";
$email->send($subject, $message, $this->sender, $this->replyto);
}
public function post($subject, $message)
{
$subject = "[".$this->subject_prefix."] " . $subject;
$message .= "\n\n".$this->footer;
$message .= "\n\nTo stop receiving this newsletter, click the following link: ".
$this->unsubscribe_url."&action=unsubscribe&email=". $this->email . "\n";
$sz = sizeof($this->mailinglist);
echo "Sending ". $sz ." mails
\n<";
ob_flush();
flush();
$num = 0;
$lvl = 0;
$steps = floor($sz / 10) + 1;
foreach($this->mailinglist as $email) {
$this->postSingle($email, $ubject, $message);
$pct = $num / $sz * 100;
if($pct >= $lvl) {
printf("
%.0f%%", $lvl);
$lvl += 100/$steps;
} else {
echo ".";
}
ob_flush();
flush();
$num++;
}
echo "
[100%]>\n
done
\n";
echo "
[CLOSE]";
echo "
\n";
ob_flush();
flush();
}
public function Mailinglist($file)
{
$this->file = $file;
if(file_exists($file)) $this->read();
}
}
class Newsletter {
private $file;
private $mailinglist;
// Admin config
public $admin_title = "NewsLetter";
public $admin_submodules = array("Send newsletter" => "send",
"Config" => "config");
public function admin_send($action, $vars)
{
global $UID, $ICONS_DIR;
switch($action) {
case "send":
$this->mailinglist->post($vars["subject"], $vars["content"]);
break;
case "preview":
$testmail = new Email($vars["testaddr"], 0);
echo "\n";
$this->mailinglist->postSingle($testmail, $vars["subject"], $vars["content"]);
echo "A test mail has been sent to ".$vars["testaddr"]."
\n";
echo "Looking ok?
";
$form = new Form("send");
$form->addWidget(new Hidden($vars));
$form->addWidget(new Button("yes"));
$form->render();
$form = new Form("retry");
$form->addWidget(new Hidden($vars));
$form->addWidget(new Button("no"));
$form->render();
break;
case "retry":
$testaddr = $vars["testaddr"];
$subject = $vars["subject"];
$content = $vars["content"];
default:
$form = new Form("preview");
$form->addWidget(new LineEdit("Test address:", "testaddr", $testaddr));
$form->addWidget(new LineEdit("Subject:", "subject", $subject));
$form->addWidget(new TextEdit("Content:", "content", $content));
$form->addWidget(new Button("Send"));
$form->render();
break;
}
}
public function admin_config($action, $vars)
{
switch($action) {
case "update":
$this->mailinglist->subj_prefix = $vars["subj_prefix"];
$this->mailinglist->sender = $vars["sender"];
$this->mailinglist->replyto = $vars["replyto"];
$this->mailinglist->footer = $vars["footer"];
$this->mailinglist->unsubscribe_url = $vars["unsubscribe_url"];
$this->mailinglist->write();
break;
default:
$form = new Form("update");
//http://www.executionroom.com/?page=news
$form->addWidget(new LineEdit("Subject prefix:", "subj_prefix", $this->mailinglist->subj_prefix));
$form->addWidget(new LineEdit("Sender:", "sender", $this->mailinglist->sender));
$form->addWidget(new LineEdit("Reply to:", "replyto", $this->mailinglist->replyto));
$form->addWidget(new TextEdit("Footer:", "footer", $this->mailinglist->footer));
$form->addWidget(new LineEdit("Unsubscribe URL::", "unsubscribe_url", $this->mailinglist->unsubscribe_url));
$form->addWidget(new Button("Update"));
$form->render();
break;
}
}
public function admin($sub, $action, $vars)
{
switch($sub) {
case "send":
$this->admin_send($action, $vars);
break;
case "config":
$this->admin_config($action, $vars);
break;
}
}
public function run($params)
{
global $page;
global $newsletter_action;
global $_POST, $GLOBALS;
$email = $_POST["newsletter_email"]; // get from lineedit.
if($email == "") $email = $GLOBALS["newsletter_email"]; // get from link.
$str = "";
$str .= "\n";
$str .= "
\n";
$str .= "
\n";
if($newsletter_action == "subscribe") {
$str .= $this->mailinglist->subscribe($email);
}
if($newsletter_action == "unsubscribe") {
$str .= $this->mailinglist->unsubscribe($email);
}
return $str;
}
private function read()
{
$this->mailinglist = new Mailinglist($this->file);
}
public function Newsletter($file)
{
$this->file = $file;
if(file_exists($file)) $this->read();
}
}
function newsletter_init()
{
global $DATA_DIR;
return new Newsletter($DATA_DIR . "/newsletter.xml");
}
?>