<?php
/******************************************************************************
* Verschiedene Funktionen fuer Rollen
*
* Copyright : (c) 2004 - 2011 The Admidio Team
* Homepage : http://www.admidio.org
* License : GNU Public License 2 http://www.gnu.org/licenses/gpl-2.0.html
*
* Uebergaben:
*
* usr_id - E-Mail an den entsprechenden Benutzer schreiben
*
*****************************************************************************/
require_once('../../system/common.php');
require_once('../../system/classes/email.php');
require_once('../../system/classes/table_roles.php');
if ($g_preferences['enable_mail_module'] != 1)
{
// es duerfen oder koennen keine Mails ueber den Server verschickt werden
$g_message->show($g_l10n->get('SYS_MODULE_DISABLED'));
}
// Der Inhalt des Formulars wird nun in der Session gespeichert...
$_SESSION['mail_request'] = $_REQUEST;
// Pruefungen, ob die Seite regulaer aufgerufen wurde
if (isset($_GET['usr_id']))
{
// Falls eine Usr_id uebergeben wurde, muss geprueft werden ob der User ueberhaupt
// auf diese zugreifen darf oder ob die UsrId ueberhaupt eine gueltige Mailadresse hat...
if (!$g_valid_login)
{
//in ausgeloggtem Zustand duerfen nie direkt usr_ids uebergeben werden...
$g_message->show($g_l10n->get('SYS_INVALID_PAGE_VIEW'));
}
if (is_numeric($_GET['usr_id']) == false)
{
$g_message->show($g_l10n->get('SYS_INVALID_PAGE_VIEW'));
}
//usr_id wurde uebergeben, dann Kontaktdaten des Users aus der DB fischen
$user = new User($g_db, $_GET['usr_id']);
// darf auf die User-Id zugegriffen werden
if(( $g_current_user->editUsers() == false && isMember($user->getValue('usr_id')) == false)
|| strlen($user->getValue('usr_id')) == 0 )
{
$g_message->show($g_l10n->get('SYS_USER_ID_NOT_FOUND'));
}
// besitzt der User eine gueltige E-Mail-Adresse
if (!strValidCharacters($user->getValue('EMAIL'), 'email'))
{
$g_message->show($g_l10n->get('SYS_USER_NO_EMAIL', $user->getValue('FIRST_NAME').' '.$user->getValue('LAST_NAME')));
}
}
elseif (isset($_POST['rol_id']))
{
// wird eine bestimmte Rolle aufgerufen, dann pruefen, ob die Rechte dazu vorhanden sind
// Falls eine rol_id uebergeben wurde, muss geprueft werden ob der User ueberhaupt auf diese zugreifen darf
if (is_numeric($_POST['rol_id']) == false)
{
$g_message->show($g_l10n->get('SYS_INVALID_PAGE_VIEW'));
}
$sql = 'SELECT rol_mail_this_role, rol_name, rol_id
FROM '. TBL_ROLES. ', '. TBL_CATEGORIES. '
WHERE rol_cat_id = cat_id
AND ( cat_org_id = '. $g_current_organization->getValue('org_id').'
OR cat_org_id IS NULL)
AND rol_id = '.$_POST['rol_id'];
$result = $g_db->query($sql);
$row = $g_db->fetch_array($result);
// Ausgeloggte duerfen nur an Rollen mit dem Flag "alle Besucher der Seite" Mails schreiben
// Eingeloggte duerfen nur an Rollen Mails schreiben, zu denen sie berechtigt sind
// Rollen muessen zur aktuellen Organisation gehoeren
if(($g_valid_login == false && $row['rol_mail_this_role'] != 3)
|| ($g_valid_login == true && $g_current_user->mailRole($row['rol_id']) == false)
|| $row['rol_id'] == null)
{
$g_message->show($g_l10n->get('SYS_INVALID_PAGE_VIEW'));
}
}
// aktuelle Seite im NaviObjekt speichern. Dann kann in der Vorgaengerseite geprueft werden, ob das
// Formular mit den in der Session gespeicherten Werten ausgefuellt werden soll...
$_SESSION['navigation']->addUrl(CURRENT_URL);
// Falls Attachmentgroesse die max_post_size aus der php.ini uebertrifft, ist $_POST komplett leer.
// Deswegen muss dies ueberprueft werden...
if (empty($_POST))
{
$g_message->show($g_l10n->get('SYS_INVALID_PAGE_VIEW'));
}
//Erst mal ein neues Emailobjekt erstellen...
$email = new Email();
// und ein Dummy Rollenobjekt dazu
$role = new TableRoles($g_db);
//Nun der Mail die Absenderangaben,den Betreff und das Attachment hinzufuegen...
if(strlen($_POST['name']) == 0)
{
$g_message->show($g_l10n->get('SYS_FIELD_EMPTY', $g_l10n->get('SYS_NAME')));
}
//Absenderangaben checken falls der User eingeloggt ist, damit ein paar schlaue User nicht einfach die Felder aendern koennen...
if ( $g_valid_login
&& ( $_POST['mailfrom'] != $g_current_user->getValue('EMAIL')
|| $_POST['name'] != $g_current_user->getValue('FIRST_NAME'). " ". $g_current_user->getValue('LAST_NAME')) )
{
$g_message->show($g_l10n->get('SYS_INVALID_PAGE_VIEW'));
}
//Absenderangaben setzen
if ($email->setSender($_POST['mailfrom'],$_POST['name']))
{
//Betreff setzen
if ($email->setSubject($_POST['subject']))
{
//Pruefen ob moeglicher Weise ein Attachment vorliegt
if (isset($_FILES['userfile']))
{
//noch mal schnell pruefen ob der User wirklich eingelogt ist...
if (!$g_valid_login)
{
$g_message->show($g_l10n->get('SYS_INVALID_PAGE_VIEW'));
}
$attachment_size = 0;
// Nun jedes Attachment
for($act_attachment_nr = 0; isset($_FILES['userfile']['name'][$act_attachment_nr]) == true; $act_attachment_nr++)
{
//Pruefen ob ein Fehler beim Upload vorliegt
if (($_FILES['userfile']['error'][$act_attachment_nr] != 0) && ($_FILES['userfile']['error'][$act_attachment_nr] != 4))
{
$g_message->show($g_l10n->get('MAI_ATTACHMENT_TO_LARGE'));
}
//Wenn ein Attachment vorliegt dieses der Mail hinzufuegen
if ($_FILES['userfile']['error'][$act_attachment_nr] == 0)
{
// pruefen, ob die Anhanggroesse groesser als die zulaessige Groesse ist
$attachment_size = $attachment_size + $_FILES['userfile']['size'][$act_attachment_nr];
if($attachment_size > $email->getMaxAttachementSize("b"))
{
$g_message->show($g_l10n->get('MAI_ATTACHMENT_TO_LARGE'));
}
if (strlen($_FILES['userfile']['type'][$act_attachment_nr]) > 0)
{
$email->addAttachment($_FILES['userfile']['tmp_name'][$act_attachment_nr], $_FILES['userfile']['name'][$act_attachment_nr], $_FILES['userfile']['type'][$act_attachment_nr]);
}
// Falls kein ContentType vom Browser uebertragen wird,
// setzt die MailKlasse automatisch "application/octet-stream" als FileTyp
else
{
$email->addAttachment($_FILES['userfile']['tmp_name'][$act_attachment_nr], $_FILES['userfile']['name'][$act_attachment_nr]);
}
}
}
}
}
else
{
$g_message->show($g_l10n->get('SYS_FIELD_EMPTY', $g_l10n->get('MAI_SUBJECT')));
}
}
else
{
$g_message->show($g_l10n->get('SYS_EMAIL_INVALID', $g_l10n->get('SYS_EMAIL')));
}
if (array_key_exists('rol_id', $_POST))
{
if (strlen($_POST['rol_id']) == 0)
{
$g_message->show($g_l10n->get('MAI_CHOOSE_ROLE'));
}
$role->readData($_POST['rol_id']);
// Falls der User eingeloggt ist checken ob er das recht hat der Rolle eine Mail zu schicken
if ($g_valid_login == true && !$g_current_user->mailRole($_POST['rol_id']))
{
$g_message->show($g_l10n->get('SYS_INVALID_PAGE_VIEW'));
}
// Falls der User nicht eingeloggt ist, muss der Wert 3 sein
if ($g_valid_login == false && $role->getValue('rol_mail_this_role') != 3)
{
$g_message->show($g_l10n->get('SYS_INVALID_PAGE_VIEW'));
}
}
// Falls der User nicht eingeloggt ist, aber ein Captcha geschaltet ist,
// muss natuerlich der Code ueberprueft werden
if (!$g_valid_login && $g_preferences['enable_mail_captcha'] == 1)
{
if ( !isset($_SESSION['captchacode']) || admStrToUpper($_SESSION['captchacode']) != admStrToUpper($_POST['captcha']) )
{
if($g_preferences['captcha_type']=='pic') {$g_message->show($g_l10n->get('SYS_CAPTCHA_CODE_INVALID'));}
else if($g_preferences['captcha_type']=='calc') {$g_message->show($g_l10n->get('SYS_CAPTCHA_CALC_CODE_INVALID'));}
}
}
//Nun die Empfaenger zusammensuchen und an das Mailobjekt uebergeben
if (array_key_exists('usr_id', $_GET))
{
//den gefundenen User dem Mailobjekt hinzufuegen...
$email->addRecipient($user->getValue('EMAIL'), $user->getValue('FIRST_NAME').' '.$user->getValue('LAST_NAME'));
}
else
{
// Rolle wurde uebergeben, dann an alle Mitglieder aus der DB fischen (ausser dem Sender selber)
$sql = 'SELECT first_name.usd_value as first_name, last_name.usd_value as last_name,
email.usd_value as email, rol_name
FROM '. TBL_ROLES. ', '. TBL_CATEGORIES. ', '. TBL_MEMBERS. ', '. TBL_USERS. '
JOIN '. TBL_USER_DATA. ' as email
ON email.usd_usr_id = usr_id
AND LENGTH(email.usd_value) > 0
JOIN '.TBL_USER_FIELDS.' as field
ON field.usf_id = email.usd_usf_id
AND field.usf_type = "EMAIL"
LEFT JOIN '. TBL_USER_DATA. ' as last_name
ON last_name.usd_usr_id = usr_id
AND last_name.usd_usf_id = '. $g_current_user->getProperty('LAST_NAME', 'usf_id'). '
LEFT JOIN '. TBL_USER_DATA. ' as first_name
ON first_name.usd_usr_id = usr_id
AND first_name.usd_usf_id = '. $g_current_user->getProperty('FIRST_NAME', 'usf_id'). '
WHERE rol_id = '. $_POST['rol_id']. '
AND rol_cat_id = cat_id
AND ( cat_org_id = '. $g_current_organization->getValue('org_id'). '
OR cat_org_id IS NULL )
AND mem_rol_id = rol_id
AND mem_begin <= "'.DATE_NOW.'"
AND mem_end > "'.DATE_NOW.'"
AND mem_usr_id = usr_id
AND usr_valid = 1 ';
// Wenn der User eingeloggt ist, wird die UserID im Statement ausgeschlossen,
//damit er die Mail nicht an sich selber schickt.
if ($g_valid_login)
{
$sql =$sql. ' AND usr_id <> '. $g_current_user->getValue('usr_id');
}
$result = $g_db->query($sql);
if($g_db->num_rows($result) > 0)
{
// alle Mitglieder als BCC an die Mail haengen
while ($row = $g_db->fetch_object($result))
{
$email->addBlindCopy($row->email, $row->first_name.' '.$row->last_name);
}
}
else
{
// Falls in der Rolle kein User mit gueltiger Mailadresse oder die Rolle gar nicht in der Orga
// existiert, muss zumindest eine brauchbare Fehlermeldung präsentiert werden...
$g_message->show($g_l10n->get('MAI_ROLE_NO_EMAILS'));
}
}
// Falls eine Kopie benoetigt wird, das entsprechende Flag im Mailobjekt setzen
if (isset($_POST['kopie']) && $_POST['kopie'] == true)
{
$email->setCopyToSenderFlag();
//Falls der User eingeloggt ist, werden die Empfaenger der Mail in der Kopie aufgelistet
if ($g_valid_login)
{
$email->setListRecipientsFlag();
}
}
//Den Text fuer die Mail aufbereiten
if ($role->getValue('rol_id') > 0)
{
$mail_body = $g_l10n->get('MAI_EMAIL_SEND_TO_ROLE', $_POST['name'], $g_current_organization->getValue('org_homepage'), $_POST['mailfrom'], $role->getValue('rol_name'));
}
else
{
$mail_body = $g_l10n->get('MAI_EMAIL_SEND_TO_USER', $_POST['name'], $g_current_organization->getValue('org_homepage'), $_POST['mailfrom'], $role->getValue('rol_name'));
}
if (!$g_valid_login)
{
$mail_body = $mail_body. "\n".$g_l10n->get('MAI_SENDER_NOT_LOGGED_IN');
}
$mail_body = $mail_body. "\n\n\n". $_POST['body'];
//Den Text an das Mailobjekt uebergeben
$email->setText($mail_body);
//Nun kann die Mail endgueltig versendet werden...
if ($email->sendEmail())
{
// Der CaptchaCode wird bei erfolgreichem Mailversand aus der Session geloescht
if (isset($_SESSION['captchacode']))
{
unset($_SESSION['captchacode']);
}
// Bei erfolgreichem Versenden wird aus dem NaviObjekt die am Anfang hinzugefuegte URL wieder geloescht...
$_SESSION['navigation']->deleteLastUrl();
// dann auch noch die mail.php entfernen
$_SESSION['navigation']->deleteLastUrl();
// Der Inhalt des Formulars wird bei erfolgreichem insert/update aus der Session geloescht
unset($_SESSION['mail_request']);
// Meldung ueber erfolgreichen Versand und danach weiterleiten
if($_SESSION['navigation']->count() > 0)
{
$g_message->setForwardUrl($_SESSION['navigation']->getUrl());
}
else
{
$g_message->setForwardUrl($g_homepage);
}
if ($role->getValue('rol_id') > 0)
{
$g_message->show($g_l10n->get('SYS_EMAIL_SEND', $g_l10n->get('MAI_TO_ROLE', $role->getValue('rol_name'))));
}
else
{
$g_message->show($g_l10n->get('SYS_EMAIL_SEND', $_POST['mailto']));
}
}
else
{
if ($role->getValue('rol_id') > 0)
{
$g_message->show($g_l10n->get('SYS_EMAIL_NOT_SEND', $g_l10n->get('MAI_TO_ROLE', $role->getValue('rol_name'))));
}
else
{
$g_message->show($g_l10n->get('SYS_EMAIL_NOT_SEND', $_POST['mailto']));
}
}
?>