1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
<?php
/**
***********************************************************************************************
* Diese Klasse dient dazu Systemmails zu verschicken
*
* @copyright 2004-2016 The Admidio Team
* @see http://www.admidio.org/
* @license https://www.gnu.org/licenses/gpl-2.0.html GNU General Public License v2.0 only
***********************************************************************************************
*/
/**
* @class SystemMail
* Beside the methods of the parent class there are the following additional methods:
*
* getMailText($systemMailId, &$user)
* - diese Methode liest den Mailtext aus der DB und ersetzt
* vorkommende Platzhalter durch den gewuenschten Inhalt
*
* setVariable($number, $value)
* - hier kann der Inhalt fuer zusaetzliche Variablen gesetzt werden
*
* sendSystemMail($systemMailId, &$user)
* - diese Methode sendet eine Systemmail nachdem der Mailtext
* ausgelesen und Platzhalter ersetzt wurden
*/
class SystemMail extends Email
{
private $smTextObject;
private $smOrganization;
private $db; ///< An object of the class Database for communication with the database
private $smMailText;
private $smMailHeader;
private $smVariables = array(); // speichert zusaetzliche Variablen fuer den Mailtext
/**
* Constructor that will create an object of a SystemMail to handle all system notifications.
* @param \Database $database Object of the class Database. This should be the default global object @b $gDb.
*/
public function __construct(&$database)
{
$this->db =& $database;
$this->smTextObject = new TableText($this->db);
parent::__construct();
}
/**
* diese Methode liest den Mailtext aus der DB und ersetzt vorkommende Platzhalter durch den gewuenschten Inhalt
* @param string $systemMailId eindeutige Bezeichnung der entsprechenden Systemmail, entspricht adm_texts.txt_name
* @param \User $user Benutzerobjekt, zu dem die Daten dann ausgelesen und in die entsprechenden Platzhalter gesetzt werden
* @return string
*/
public function getMailText($systemMailId, &$user)
{
global $gPreferences;
// create organization object of the organization the current user is assigned (at registration this can be every organization)
if(!is_object($this->smOrganization) || $this->smOrganization->getValue('org_id') != $user->getOrganization())
{
$this->smOrganization = new Organization($this->db, $user->getOrganization());
}
// read email text from text table in database
if($this->smTextObject->getValue('txt_name') !== $systemMailId)
{
$this->smTextObject->readDataByColumns(array(
'txt_name' => $systemMailId,
'txt_org_id' => $this->smOrganization->getValue('org_id')
));
}
$mailSrcText = $this->smTextObject->getValue('txt_text');
// now replace all parameters in email text
$pregRepArray = array(
'/#user_first_name#/' => $user->getValue('FIRST_NAME', 'database'),
'/#user_last_name#/' => $user->getValue('LAST_NAME', 'database'),
'/#user_login_name#/' => $user->getValue('usr_login_name'),
'/#user_email#/' => $user->getValue('EMAIL'),
'/#administrator_email#/' => $gPreferences['email_administrator'],
'/#organization_short_name#/' => $this->smOrganization->getValue('org_shortname'),
'/#organization_long_name#/' => $this->smOrganization->getValue('org_longname'),
'/#organization_homepage#/' => $this->smOrganization->getValue('org_homepage')
);
$mailSrcText = preg_replace(array_keys($pregRepArray), array_values($pregRepArray), $mailSrcText);
// zusaetzliche Variablen ersetzen
foreach ($this->smVariables as $number => $value)
{
$mailSrcText = preg_replace('/#variable'.$number.'#/', $value, $mailSrcText);
}
// Betreff und Inhalt anhand von Kennzeichnungen splitten oder ggf. Default-Inhalte nehmen
if(strpos($mailSrcText, '#subject#') !== false)
{
$this->smMailHeader = trim(substr($mailSrcText, strpos($mailSrcText, '#subject#') + 9, strpos($mailSrcText, '#content#') - 9));
}
else
{
$this->smMailHeader = 'Systemmail von '.$this->smOrganization->getValue('org_homepage');
}
if(strpos($mailSrcText, '#content#') !== false)
{
$this->smMailText = trim(substr($mailSrcText, strpos($mailSrcText, '#content#') + 9));
}
else
{
$this->smMailText = $mailSrcText;
}
return $this->smMailText;
}
/**
* die Methode setzt den Inhalt fuer spezielle Variablen
* @param int $number
* @param string $value
*/
public function setVariable($number, $value)
{
$this->smVariables[$number] = $value;
}
/**
* diese Methode sendet eine Systemmail nachdem der Mailtext ausgelesen und Platzhalter ersetzt wurden
* @param string $systemMailId eindeutige Bezeichnung der entsprechenden Systemmail, entspricht adm_texts.txt_name
* @param \User $user Benutzerobjekt, zu dem die Daten dann ausgelesen und in die entsprechenden Platzhalter gesetzt werden
* @throws AdmException SYS_EMAIL_NOT_SEND
* @return true
*/
public function sendSystemMail($systemMailId, &$user)
{
global $gPreferences;
$this->getMailText($systemMailId, $user);
$this->setSender($gPreferences['email_administrator']);
$this->setSubject($this->smMailHeader);
$this->setText($this->smMailText);
$returnMessage = $this->sendEmail();
// if something went wrong then throw an exception with the error message
if($returnMessage !== true)
{
throw new AdmException('SYS_EMAIL_NOT_SEND', $user->getValue('EMAIL'), $this->sendEmail());
}
return true;
}
}