Location: PHPKode > scripts > Admidio > admidio-2.2.9/adm_program/modules/mail/mail_send.php
<?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']));
    }
}



?>
Return current item: Admidio