diff options
Diffstat (limited to 'email.php')
-rw-r--r-- | email.php | 427 |
1 files changed, 427 insertions, 0 deletions
diff --git a/email.php b/email.php new file mode 100644 index 0000000..a83b97a --- /dev/null +++ b/email.php @@ -0,0 +1,427 @@ +<?php + set_include_path( get_include_path() . PATH_SEPARATOR . 'lib'); + session_start(); + + require_once 'Zend/Filter.php'; + require_once 'Zend/Filter/StripTags.php'; + require_once 'Zend/Filter/StringTrim.php'; + + $filters = new Zend_Filter(); + $filters->addFilter(new Zend_Filter_StripTags()) + ->addFilter(new Zend_Filter_StringTrim()); + + $pageTitle = array_key_exists('pageTitle', $_GET) ? $filters->filter($_GET['pageTitle']) : ''; + $pageUrl = array_key_exists('pageUrl', $_GET) ? $filters->filter($_GET['pageUrl']) : ''; + $page = 'form'; + $errors = array(); + + if('post' == strtolower($_SERVER['REQUEST_METHOD'])) + { + // someone sent over an invalid + if(!Readability::hasValidParams()) + { + Readability::logMessage("ERROR:Someone tried to send a request with an invalid set of parameters."); + die(); + } + + require_once 'Zend/Validate/EmailAddress.php'; + + //FILTER DATA + + $from = $filters->filter($_POST['from']); + $to = $filters->filter($_POST['to']); + $to = array_map('trim', split(',', $to)); + $note = $filters->filter($_POST['note']); + $key = $filters->filter($_POST['key']); + + if(!Readability::validateSecureKey($key)) + { + $errors[] = 'key'; + Readability::logMessage("ERROR:Someone tried to send an email with an invalid key."); + } + + // VALIDATE DATA + + $emailValidator = new Zend_Validate_EmailAddress(); + + if(!$emailValidator->isValid($_POST['from'])) + { + $errors[] = 'from'; + } + + if(count($to) == 0) + { + $errors[] = 'to'; + } + else + { + foreach($to as $toAddress) + { + if(!$emailValidator->isValid($toAddress)) + { + $errors[] = 'to'; + break; + } + } + } + + // NO ERRORS SEND EMAIL + if(count($errors) == 0) + { + // store the from address so it's saved for future use + setcookie("from", $from, time()+3600*24*7*4, "/"); + + require_once 'Zend/Mail.php'; + require_once 'Zend/Mail/Transport/Smtp.php'; + + $mailer = new Zend_Mail_Transport_Smtp('smtp.googlemail.com', Array( + 'auth' => 'login', + 'username' => 'readability@arc90.com', + 'password' => 'arc90inc', + 'ssl' => 'ssl', + 'port' => 465, + )); + $mailer->EOL = "\r\n"; // gmail is fussy about this + Zend_Mail::setDefaultTransport($mailer); + + $body = '<html><head>'; + $body = '</head>'; + $body = '<body>'; + $body .= '<div style="font-size: 15px;">'; + $body .= '<p>This page was sent to you by: '.$from.'</p>'; + $body .= '<p>Message from sender: </p><p><blockquote>'.stripslashes($note).'</blockquote></p>'; + $body .= '<p>Just click this link: <a href="'.$pageUrl.'">'.$pageTitle.'</a></p>'; + $body .= '<hr />'; + $body .= '<p style="font-size: 90%;">Sent from <a href="http://lab.arc90.com/experiments/readability/">Readability</a> | An <a href="http://www.arc90.com">Arc90</a> lab experiment<p>'; + $body .= '</div>'; + $body .= '</body></html>'; + + $mail = new Zend_Mail(); + $mail->setBodyHtml($body); + $mail->setFrom($from); + + foreach($to as $toAddress) + { + $mail->addTo($toAddress); + } + + $mail->setSubject("Arc90 Readability: {$pageTitle}"); + + try + { + if(!$mail->send()) + { + Readability::logMessage("ERROR:There was an error sending the email. [to:".implode(', ', $to).", from:{$from}, notes:{$note}, pageUrl: {$pageUrl}, pageTitle: {$pageTitle}]"); + } + else + { + $page = 'complete'; + } + } + catch(Exception $e) + { + Readability::logMessage("ERROR:There was an exception sending the email. [to:".implode(', ', $to).", from:{$from}, notes:{$note}, pageUrl: {$pageUrl}, pageTitle: {$pageTitle}]"); + Readability::logMessage("ERROR:".$e->getMessage()); + } + + //header('location: close.html'); + } + } // end of: if method == POST + + elseif('get' == strtolower($_SERVER['REQUEST_METHOD'])) + { + $_SESSION['secureKey'] = Readability::generateSecureKey(); + } + + class Readability + { + public static function isError($field, $errors) + { + if(in_array($field, $errors)) + { + return TRUE; + } + return FALSE; + } + + public static function getErrorClass($field, $errors) + { + if(in_array($field, $errors)) + { + return 'class = "error"'; + } + return ''; + } + + public static function getParam($param) + { + if(isset($_POST) && array_key_exists($param, $_POST)) + { + return $_POST[$param]; + } + elseif(isset($_COOKIE) && array_key_exists($param, $_COOKIE)) + { + return $_COOKIE[$param]; + } + return ''; + } + + public static function logMessage($message) + { + $logFile = dirname(__FILE__) . '/log.txt'; + + $handle = @fopen($logFile, 'a'); + if(is_resource($handle)) + { + $message = date('Y-m-d G:i:s') . ' :: ' . $message . "\n"; + fwrite($handle, $message); + fclose($handle); + } + } + + public static function generateSecureKey($length = 8) + { + $sucureKey = ""; + $possible = "012*3456)789b(cdfg#hjkmn@pqrs!tvwx[yz"; + + for($x=0; $x < $length; $x++) + { + $char = substr($possible, mt_rand(0, strlen($possible)-1), 1); + + if (!strstr($sucureKey, $char)) + { + $sucureKey .= $char; + } + } + return $sucureKey; + } + + /** + * this adds a small (very small) level of security + * + * @param string $testKey + * @return void + * @author David Hauenstein + */ + public static function validateSecureKey($testKey) + { + if(!array_key_exists('secureKey', $_SESSION)) + { + $_SESSION['secureKey'] = self::generateSecureKey(); + return false; + } + else + { + if($testKey != $_SESSION['secureKey']) + { + return false; + } + } + return true; + } + + public static function emailAsLinks($addresses) + { + $toReturn = ''; + foreach($addresses as $address) + { + $toReturn .= '<a href="mailto:'.$address.'">' . $address . '</a>, '; + } + return substr($toReturn, 0, strlen($toReturn)-2); + } + + public static function hasValidParams() + { + $requiredParams = array('from', 'to', 'note', 'key'); + $sentParams = array_keys($_POST); + foreach($requiredParams as $required) + { + if(!in_array($required, $sentParams)) + { + return false; + } + } + return true; + } + } +?> +<?= '<?' ?>xml version="1.0" encoding="utf-8" ?> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> + <head> + <title>Readability</title> + <script type="text/javascript" charset="utf-8"> + window.onload = function(){ + document.getElementById('cancel-email').onclick = function(){ + window.location = 'http://davehauenstein.com/readability/close.html'; + return false; + }; + document.getElementById('send-email').onclick = function(){ + document.getElementById('send-email-form').submit(); + return false; + }; + }; + <?php if($page == "complete"){ ?> + timer = setTimeout(function(){ + window.location = 'close.html'; + }, 3000); + <?php } ?> + </script> + <style type="text/css" media="screen"> + *{ + margin: 0; + } + #email-container{ + font-size: 14px; + margin: 0; + padding: 0; + width: 480px; + height: 450px; + font-family: times, serif; + background-color: #fff; + } + h2{ + margin: 0 0 10px; + background: url(http://lab.arc90.com/experiments/readability/images/email-head.gif) #e2e3e4 no-repeat 15px center; + text-indent: -99999px; + height: 40px; + } + form{ + padding-right: 20px; + } + label{ + font-size: 20px; + padding-right: 10px; + display: block; + float: left; + width: 100px; + text-align: right; + } + input, + textarea{ + padding: 5px; + width: 330px; + font-family: times, serif; + font-size: 14px; + border: solid 1px #999; + } + input.error{ + border: solid 2px #c33; + } + p.error{ + color: #c33; + font-size: 14px; + } + .helper{ + font-size: 12px; + margin-top: 3px; + color: #666; + } + .details{ + font-style: italic; + font-size: 15px; + } + .helper, + .details{ + margin-left: 110px; /* add label width + label padding-right */ + } + .section{ + margin-top: 15px; + clear: both; + } + #note{ + <?php if(count($errors) > 0){ ?> + height: 100px; + <?php } else { ?> + height: 140px; + <?php } ?> + } + #send-email, + #cancel-email{ + padding: 2px 2px; + font-family: times, serif; + background-color: #e7e8e9; + font-size: 17px; + border: solid 2px #666; + cursor: pointer; + } + #send-email{ + margin-left: 180px; + font-weight: bold; + } + #cancel-email{ + margin-left: 10px; + } + .logo{ + position: absolute; + left: 10px; + bottom: 10px; + } + #complete{ + padding: 20px; + } + #complete p{ + margin: 0 0 10px; + font-size: 16px; + } + </style> + </head> + <body> + <div id="email-container"> + <h2>Email Page</h2> + + <?php if($page == 'form'){ ?> + <form action="" method="post" accept-charset="utf-8" id="send-email-form"> + <div class="section"> + <label for="from">From :</label> + <input type="text" name="from" id="from" value="<?php echo Readability::getParam('from') ?>" <?php echo Readability::getErrorClass('from', $errors); ?> /> + <?php if(Readability::isError('from', $errors)){ ?> + <p class="helper error"> + This field should be a valid email address. + </p> + <?php } ?> + </div> + <div class="section"> + <label for="to">To :</label> + <input type="text" name="to" id="to" value="<?php echo Readability::getParam('to') ?>" <?php echo Readability::getErrorClass('to', $errors); ?> /> + <?php if(Readability::isError('to', $errors)){ ?> + <p class="helper error"> + Please ensure that all addresses are valid email adderesses. + </p> + <?php } ?> + <p class="helper"> + Seperate multiple recipients with commas. + </p> + </div> + <div class="section"> + <label>Sending :</label> + <p class="details"> + <?= $pageTitle ?> + </p> + </div> + <div class="section"> + <label for="note">Note :</label> + <textarea name="note" id="note" rows="8" cols="40"><?php echo Readability::getParam('note') ?></textarea> + </div> + <div class="section"> + <button id="send-email">Email Page</button> + <button id="cancel-email">Cancel</button> + </div> + <img src="http://lab.arc90.com/experiments/readability/images/email-readability.gif" alt="Readability" class="logo" /> + <input type="hidden" name="pageUrl" value="<?= $pageUrl; ?>" id="pageUrl" /> + <input type="hidden" name="pageTitle" value="<?= $pageTitle; ?>" id="pageTitle" /> + <input type="hidden" name="key" value="<?= $_SESSION['secureKey']; ?>" id="key" /> + </form> + <?php }else if($page == "complete"){ ?> + <div id="complete"> + <p> + Thanks for using Readability! + </p> + <p> + A link to this page has been sent to <?php echo Readability::emailAsLinks($to) ?> + </p> + </div> + <?php } ?> + </div> + </body> +</html>
\ No newline at end of file |