summaryrefslogtreecommitdiff
path: root/platform/www/lib/plugins/bureaucracy/helper/actionmail.php
diff options
context:
space:
mode:
Diffstat (limited to 'platform/www/lib/plugins/bureaucracy/helper/actionmail.php')
-rw-r--r--platform/www/lib/plugins/bureaucracy/helper/actionmail.php212
1 files changed, 212 insertions, 0 deletions
diff --git a/platform/www/lib/plugins/bureaucracy/helper/actionmail.php b/platform/www/lib/plugins/bureaucracy/helper/actionmail.php
new file mode 100644
index 0000000..698e6c0
--- /dev/null
+++ b/platform/www/lib/plugins/bureaucracy/helper/actionmail.php
@@ -0,0 +1,212 @@
+<?php
+/**
+ * Action sendemail for DokuWiki plugin bureaucracy
+ */
+
+class helper_plugin_bureaucracy_actionmail extends helper_plugin_bureaucracy_action {
+
+ protected $_mail_html = '';
+ protected $_mail_text = '';
+ protected $subject = '';
+ protected $replyto = array();
+ protected $mailtemplate = '';
+
+ /**
+ * Build a nice email from the submitted data and send it
+ *
+ * @param helper_plugin_bureaucracy_field[] $fields
+ * @param string $thanks
+ * @param array $argv
+ * @return string thanks message
+ * @throws Exception mailing failed
+ */
+ public function run($fields, $thanks, $argv) {
+ global $ID;
+ global $conf;
+
+ $mail = new Mailer();
+
+ $this->prepareNamespacetemplateReplacements();
+ $this->prepareDateTimereplacements();
+ $this->prepareLanguagePlaceholder();
+ $this->prepareNoincludeReplacement();
+ $this->prepareFieldReplacements($fields);
+
+ $evdata = [
+ 'fields' => $fields,
+ 'values' => &$this->values
+ ];
+ $event = new Doku_Event('PLUGIN_BUREAUCRACY_EMAIL_SEND', $evdata);
+ if($event->advise_before()) {
+ //set default subject
+ $this->subject = sprintf($this->getLang('mailsubject'), $ID);
+
+ //build html&text table, collect replyto and subject
+ list($table_html, $table_text) = $this->processFieldsBuildTable($fields, $mail);
+
+ //Body
+ if($this->mailtemplate) {
+ //show template
+ $this->patterns['__tablehtml__'] = '/@TABLEHTML@/';
+ $this->patterns['__tabletext__'] = '/@TABLETEXT@/';
+ $this->values['__tablehtml__'] = $table_html;
+ $this->values['__tabletext__'] = $table_text;
+
+ list($this->_mail_html, $this->_mail_text) = $this->getContent();
+
+ } else {
+ //show simpel listing
+ $this->_mail_html .= sprintf($this->getLang('mailintro')."<br><br>", dformat());
+ $this->_mail_html .= $table_html;
+
+ $this->_mail_text .= sprintf($this->getLang('mailintro')."\n\n", dformat());
+ $this->_mail_text .= $table_text;
+ }
+ $mail->setBody($this->_mail_text,null,null,$this->_mail_html);
+
+ // Reply-to
+ if(!empty($this->replyto)) {
+ $replyto = $mail->cleanAddress($this->replyto);
+ $mail->setHeader('Reply-To', $replyto, false);
+ }
+
+ // To
+ $to = $this->replace(implode(',',$argv)); // get recipient address(es)
+ $to = $mail->cleanAddress($to);
+ $mail->to($to);
+
+ // From
+ $mail->from($conf['mailfrom']);
+
+ // Subject
+ $this->subject = $this->replace($this->subject);
+ $mail->subject($this->subject);
+
+ if(!$mail->send()) {
+ throw new Exception($this->getLang('e_mail'));
+ }
+ }
+ $event->advise_after();
+
+ return '<p>' . $thanks . '</p>';
+ }
+
+ /**
+ * Create html and plain table of the field
+ * and collect values for subject and replyto
+ *
+ * @param helper_plugin_bureaucracy_field[] $fields
+ * @param Mailer $mail
+ * @return array of html and text table
+ */
+ protected function processFieldsBuildTable($fields, $mail) {
+ global $ID;
+
+ $table_html = '<table>';
+ $table_text = '';
+
+ foreach($fields as $field) {
+ $html = $text = '';
+ $value = $field->getParam('value');
+ $label = $field->getParam('label');
+
+ switch($field->getFieldType()) {
+ case 'fieldset':
+ if(!empty($field->depends_on)) {
+ //print fieldset only if depend condition is true
+ foreach($fields as $field_tmp) {
+ if($field_tmp->getParam('label') === $field->depends_on[0] && $field_tmp->getParam('value') === $field->depends_on[1] ) {
+ list($html, $text) = $this->mail_buildRow($label);
+ }
+ }
+ } else {
+ list($html, $text) = $this->mail_buildRow($label);
+ }
+ break;
+ case 'file':
+ if($value === null || $label === null) break; //print attachment only if field was visible
+ $file = $field->getParam('file');
+ if(!$file['size']) {
+ $message = $this->getLang('attachmentMailEmpty');
+ } else if($file['size'] > $this->getConf('maxEmailAttachmentSize')) {
+ $message = $file['name'] . ' ' . $this->getLang('attachmentMailToLarge');
+ msg(sprintf($this->getLang('attachmentMailToLarge_userinfo'), hsc($file['name']), filesize_h($this->getConf('maxEmailAttachmentSize'))), 2);
+ } else {
+ $message = $file['name'];
+ $mail->attachFile($file['tmp_name'], $file['type'], $file['name']);
+ }
+ list($html, $text) = $this->mail_buildRow($label, $message);
+ break;
+ case 'subject':
+ $this->subject = $label;
+ break;
+ case 'usemailtemplate':
+ if (!is_null($field->getParam('template')) ) {
+ $this->mailtemplate = $this->replace($field->getParam('template'));
+ resolve_pageid(getNS($ID), $this->mailtemplate, $ignored);
+ }
+ break;
+
+ default:
+ if($value === null || $label === null) break;
+ if(is_array($value)) $value = implode(', ', $value);
+ list($html, $text) = $this->mail_buildRow($label, $value);
+
+ if(!is_null($field->getParam('replyto'))) {
+ $this->replyto[] = $value;
+ }
+ }
+ $table_html .= $html;
+ $table_text .= $text;
+ }
+ $table_html .= '</table>';
+
+ return array($table_html, $table_text);
+ }
+
+ /**
+ * Build a row
+ *
+ * @param $column1
+ * @param null $column2
+ * @return array of html and text row
+ */
+ protected function mail_buildRow($column1,$column2=null) {
+ if($column2 === null) {
+ $html = '<tr><td colspan="2"><u>'.hsc($column1).'<u></td></tr>';
+ $text = "\n=====".$column1.'=====';
+ } else {
+ $html = '<tr><td><b>'.hsc($column1).'<b></td><td>'.hsc($column2).'</td></tr>';
+ $text = "\n $column1 \t\t $column2";
+ }
+ return array($html, $text);
+ }
+
+ /**
+ * Parse mail template in html and text, and perform replacements
+ *
+ * @return array html and text content
+ */
+ protected function getContent() {
+ $content = rawWiki($this->mailtemplate);
+ $html = '';
+ $text = '';
+
+ if(preg_match_all('#<code\b(.*?)>(.*?)</code>#is', $content, $matches)) {
+ foreach($matches[1] as $index => $codeoptions) {
+ list($syntax,) = explode(' ', trim($codeoptions), 2);
+ if($syntax == 'html') {
+ $html = $matches[2][$index];
+ }
+ if($syntax == 'text' || $syntax == '') {
+ $text = $matches[2][$index];
+ }
+ }
+ }
+ return array(
+ $this->replace($html),
+ $this->replace($text)
+ );
+ }
+}
+// vim:ts=4:sw=4:et:enc=utf-8: