1<?php 2 3if (IN_serendipity !== true) { 4 die ("Don't hack!"); 5} 6 7@serendipity_plugin_api::load_language(dirname(__FILE__)); 8 9class serendipity_event_mailer extends serendipity_event 10{ 11 var $title = PLUGIN_EVENT_MAILER_NAME; 12 var $data = array(); 13 14 function introspect(&$propbag) 15 { 16 global $serendipity; 17 18 $propbag->add('name', PLUGIN_EVENT_MAILER_NAME); 19 $propbag->add('description', PLUGIN_EVENT_MAILER_DESC); 20 $propbag->add('stackable', false); 21 $propbag->add('author', 'Sebastian Nohn, Kristian Koehntopp, Garvin Hicking'); 22 $propbag->add('version', '1.60'); 23 $propbag->add('requirements', array( 24 'serendipity' => '1.6', 25 'smarty' => '2.6.7', 26 'php' => '4.1.0' 27 )); 28 $propbag->add('event_hooks', array( 29 'backend_publish' => true, 30 'backend_display' => true, 31 'backend_save' => true, 32 )); 33 $propbag->add('groups', array('FRONTEND_ENTRY_RELATED')); 34 35 $config = array('what', 'mailto', 'sendtoall', 'includelink', 'striptags', 'keepstriptags', 'convertp', 'mailerbody'); 36 $propbag->add('configuration', $config); 37 } 38 39 function performConfig(&$bag) { 40 if (is_object($bag)) { 41 $conf = $bag->get('configuration'); 42 } 43 44 $this->data['categories'] = serendipity_fetchCategories('all'); 45 if (!is_array($this->data['categories'])) { 46 return false; 47 } 48 49 foreach($this->data['categories'] AS $cat) { 50 $conf[] = 'category_' . $cat['categoryid']; 51 $this->data['cat'][$cat['categoryid']] = $cat; 52 } 53 54 if (is_object($bag)) { 55 $bag->add('configuration', $conf); 56 } 57 } 58 59 function introspect_config_item($name, &$propbag) 60 { 61 if (preg_match('@^category_([0-9]+)$@imsU', $name, $catid)) { 62 $parent = ''; 63 if ($this->data['cat'][$catid[1]]['parentid'] > 0) { 64 $parent = " '" . $this->data['cat'][$this->data['cat'][$catid[1]]['parentid']]['category_name'] . "' -"; 65 } 66 $propbag->add('type', 'string'); 67 $propbag->add('name', CATEGORY . $parent . " '" . $this->data['cat'][$catid[1]]['category_name'] . "'"); 68 $propbag->add('description', PLUGIN_EVENT_MAILER_RECIPIENTDESC); 69 $propbag->add('default', ''); 70 return true; 71 } 72 73 switch($name) { 74 75 case 'what': 76 $propbag->add('type', 'select'); 77 $propbag->add('name', CONTENT); 78 $propbag->add('description', ''); 79 $propbag->add('select_values', 80 array( 81 'all' => ENTRY_BODY . ' + ' . EXTENDED_BODY, 82 'body' => ENTRY_BODY, 83 'extended' => EXTENDED_BODY, 84 'none' => NONE 85 ) 86 ); 87 $propbag->add('default', 'all'); 88 break; 89 90 case 'mailto': 91 $propbag->add('type', 'string'); 92 $propbag->add('name', PLUGIN_EVENT_MAILER_RECIPIENT); 93 $propbag->add('description', PLUGIN_EVENT_MAILER_RECIPIENTDESC); 94 $propbag->add('default', ''); 95 break; 96 97 case 'sendtoall': 98 $propbag->add('type', 'boolean'); 99 $propbag->add('name', PLUGIN_EVENT_MAILER_SENDTOALL); 100 $propbag->add('description', ''); 101 $propbag->add('default', 'false'); 102 break; 103 104 case 'includelink': 105 $propbag->add('type', 'boolean'); 106 $propbag->add('name', PLUGIN_EVENT_MAILER_LINK); 107 $propbag->add('description', PLUGIN_EVENT_MAILER_LINKDESC); 108 $propbag->add('default', 'false'); 109 break; 110 111 case 'striptags': 112 $propbag->add('type', 'boolean'); 113 $propbag->add('name', PLUGIN_EVENT_MAILER_STRIPTAGS); 114 $propbag->add('description', PLUGIN_EVENT_MAILER_STRIPTAGSDESC); 115 $propbag->add('default', 'false'); 116 break; 117 118 case 'keepstriptags': 119 $propbag->add('type', 'boolean'); 120 $propbag->add('name', PLUGIN_EVENT_MAILER_KEEPSTRIPTAGS); 121 $propbag->add('description', PLUGIN_EVENT_MAILER_KEEPSTRIPTAGSDESC); 122 $propbag->add('default', 'true'); 123 break; 124 125 case 'convertp': 126 $propbag->add('type', 'boolean'); 127 $propbag->add('name', PLUGIN_EVENT_MAILER_CONVERTP); 128 $propbag->add('description', PLUGIN_EVENT_MAILER_CONVERTPDESC); 129 $propbag->add('default', 'false'); 130 break; 131 132 case 'mailerbody': 133 $propbag->add('type', 'text'); 134 $propbag->add('name', PLUGIN_EVENT_MAILER_MAILTEXT); 135 $propbag->add('description', ''); 136 $propbag->add('default', ''); 137 break; 138 139 default: 140 return false; 141 } 142 return true; 143 } 144 145 function generate_content(&$title) 146 { 147 $title = $this->title; 148 } 149 150 function sendMail($eventData) 151 { 152 global $serendipity; 153 154 $mails = explode(' ', str_replace(',', '', $this->get_config('mailto'))); 155 $to = array(); 156 foreach($mails AS $mailto) { 157 $mailto = trim($mailto); 158 if (!empty($mailto)) { 159 $to[] = $mailto; 160 } 161 } 162 163 $this->performConfig($to); 164 if (is_array($this->data['cat'])) { 165 $selected = array(); 166 if (is_array($eventData['categories'])) { 167 foreach($eventData['categories'] AS $idx => $cid) { 168 $selected[$cid] = true; 169 } 170 } 171 172 foreach($this->data['cat'] AS $cid => $cat) { 173 $mailto = trim($this->get_config('category_' . $cid)); 174 175 if (!empty($mailto) && isset($selected[$cid])) { 176 $tos = explode(' ', str_replace(',', '', $mailto)); 177 foreach($tos AS $mailtopart) { 178 $to[] = trim($mailtopart); 179 } 180 } 181 } 182 } 183 184 if ($serendipity['POST']['properties']['sendentry_all']) { 185 $mails = serendipity_db_query("SELECT DISTINCT email FROM {$serendipity['dbPrefix']}authors"); 186 foreach($mails AS $mail) { 187 $to[] = trim($mail['email']); 188 } 189 } 190 191 $mail = array( 192 'subject' => $eventData['title'], 193 'body' => $eventData['body'] . $eventData['extended'], 194 // 'from' => $serendipity['blogTitle'] . ' - ' . $eventData['author'] . ' <' . $serendipity['serendipityEmail'] . '>' 195 'from' => $serendipity['serendipityEmail'] 196 ); 197 198 switch($this->get_config('what')) { 199 case 'all': 200 $mail['body'] = $eventData['body'] . $eventData['extended']; 201 break; 202 case 'body': 203 $mail['body'] = $eventData['body']; 204 break; 205 case 'extended': 206 $mail['body'] = $eventData['extended']; 207 break; 208 case 'none': 209 $mail['body'] = ''; 210 break; 211 } 212 213 if (!empty($serendipity['POST']['properties']['mailerbody'])) { 214 $mail['body'] = $serendipity['POST']['properties']['mailerbody'] . "\n" . $mail['body']; 215 } 216 217 if (isset($serendipity['POST']['properties']['mailto'])) { 218 $mails = explode(' ', str_replace(',', '', $serendipity['POST']['properties']['mailto'])); 219 foreach($mails as $mailto) { 220 $mailto = trim($mailto); 221 if (!in_array($mailto, $to)) { 222 $to[] = $mailto; 223 } 224 } 225 } 226 227 if (serendipity_db_bool($this->get_config('convertp', 'false'))) { 228 $mail['body'] = str_replace('</p>', "</p>\n", $mail['body']); 229 } 230 231 if (serendipity_db_bool($this->get_config('striptags', 'false'))) { 232 if (serendipity_db_bool($this->get_config('keepstriptags', 'true'))) { 233 $mail['body'] = preg_replace('@<a[^>]+href=["\']([^"\']*)["\'][^>]*>([^<]*)</a>@i', "$2 [$1]", $mail['body']); 234 $mail['body'] = preg_replace('@<img[^>]+src=["\']([^"\']*)["\'][^>]*>@i', "[" . IMAGE . ": $1]", $mail['body']); 235 } else { 236 $mail['body'] = preg_replace('@<a[^>]+href=["\']([^"\']*)["\'][^>]*>([^<]*)</a>@i', "", $mail['body']); 237 $mail['body'] = preg_replace('@<img[^>]+src=["\']([^"\']*)["\'][^>]*>@i', "", $mail['body']); 238 } 239 $mail['body'] = strip_tags($mail['body']); 240 } 241 242 if (serendipity_db_bool($this->get_config('includelink', 'false'))) { 243 $mail['body'] = serendipity_archiveURL($eventData['id'], $eventData['title'], 'baseURL', true, array('timestamp' => $eventData['timestamp'])) . "\n\n" . $mail['body']; 244 } 245 246 foreach($to AS $mailto) { 247 if (!empty($mailto)) { 248 echo serendipity_specialchars($mailto) . '...<br />'; 249 serendipity_sendMail($mailto, $mail['subject'], $mail['body'], $mail['from']); 250 } 251 } 252 } 253 254 function event_hook($event, &$bag, &$eventData, $addData = null) 255 { 256 global $serendipity; 257 258 $hooks = &$bag->get('event_hooks'); 259 260 if (isset($hooks[$event])) { 261 262 switch($event) { 263 264 case 'backend_display': 265 if (isset($serendipity['POST']['properties']['mailto'])) { 266 $mailto = $serendipity['POST']['properties']['mailto']; 267 } else { 268 $mailto = $this->get_config('mailto'); 269 } 270 271 if (isset($serendipity['POST']['properties']['sendentry_all'])) { 272 $sendtoall = $serendipity['POST']['properties']['sendentry_all']; 273 } else { 274 $sendtoall = serendipity_db_bool($this->get_config('sendtoall')); 275 } 276 277 if (isset($serendipity['POST']['properties']['mailerbody'])) { 278 $mailerbody = $serendipity['POST']['properties']['mailerbody']; 279 } else { 280 $mailerbody = $this->get_config('mailerbody'); 281 } 282 283 ?> 284 <fieldset class="entryproperties"> 285 <span class="wrap_legend"><legend><?php echo PLUGIN_EVENT_MAILER_NAME; ?></legend></span> 286 287 <div class="form_check"> 288 <input id="properties_sendentry" type="checkbox" name="serendipity[properties][sendentry]" value="true" checked="checked"> 289 <label title="<?php echo PLUGIN_EVENT_MAILER_SENDING; ?>" for="properties_sendentry"><?php echo PLUGIN_EVENT_MAILER_ISTOSENDIT; ?></label> 290 </div> 291 <div class="form_field"> 292 <label title="<?php echo PLUGIN_EVENT_MAILER_RECIPIENT; ?>" for="properties_mailto"><?php echo PLUGIN_EVENT_MAILER_RECIPIENTS; ?></label> 293 <input id="properties_mailto" type="text" name="serendipity[properties][mailto]" value="<?php echo serendipity_specialchars($mailto); ?>"> 294 </div> 295 <div class="form_check"> 296 <input id="sendall" type="checkbox" value="true" name="serendipity[properties][sendentry_all]" <?php echo ($sendtoall ? 'checked="checked"': ''); ?>> 297 <label title="<?php echo PLUGIN_EVENT_MAILER_SENDTOALL; ?>" for="sendall"><?php echo PLUGIN_EVENT_MAILER_SENDTOALL; ?></label> 298 </div> 299 <?php if (!serendipity_db_bool($eventData['isdraft'])) { // Only show this for entries that are published ?> 300 <div class="form_check"> 301 <input id="forcesend" type="checkbox" value="true" name="serendipity[properties][forcesend]"> 302 <label title="<?php echo PLUGIN_EVENT_MAILER_FORCESEND; ?>" for="forcesend"><?php echo PLUGIN_EVENT_MAILER_FORCESEND; ?></label> 303 <br /> 304 <em><?php echo PLUGIN_EVENT_MAILER_FORCESEND_DESC; ?></em> 305 </div> 306 <?php } ?> 307 <div class="form_check"> 308 <label for="mailerbody"><?= PLUGIN_EVENT_MAILER_MAILTEXT; ?></label> 309 <textarea id="mailerbody" rows="5" name="serendipity[properties][mailerbody]" ><?php echo serendipity_specialchars($mailerbody); ?></textarea> 310 </div> 311 </fieldset> 312<?php 313 break; 314 315 case 'backend_save': 316 if (serendipity_db_bool($eventData['isdraft'])) { 317 // Never send e-mails for drafts. 318 return true; 319 } 320 321 if (isset($serendipity['POST']['properties']['forcesend']) && $serendipity['POST']['properties']['forcesend']) { 322 $this->sendMail($eventData); 323 } else { 324 echo PLUGIN_EVENT_MAILER_NOTSENDDECISION . '<br />'; 325 } 326 break; 327 328 case 'backend_publish': 329 if (isset($serendipity['POST']['properties']) && !isset($serendipity['POST']['properties']['sendentry'])) { 330 echo PLUGIN_EVENT_MAILER_NOTSENDDECISION . '<br />'; 331 } else { 332 $this->sendMail($eventData); 333 } 334 break; 335 336 default: 337 return false; 338 } 339 return true; 340 } else { 341 return false; 342 } 343 } 344 345} 346 347/* vim: set sts=4 ts=4 expandtab : */ 348