465 lines
15 KiB
PHP
465 lines
15 KiB
PHP
<?php
|
|
/**
|
|
* @author Gorazd Veselič
|
|
* @date December 2011
|
|
*
|
|
*/
|
|
|
|
define("SIMPLE_MAIL_QUOTA", 20);
|
|
|
|
class SurveySimpleMailInvitation {
|
|
|
|
public $sid; # id ankete
|
|
|
|
function __construct($anketa) {
|
|
$this->sid = $anketa;
|
|
SurveyInfo::SurveyInit($this->sid);
|
|
}
|
|
|
|
function ajax() {
|
|
|
|
switch ($_GET['a']) {
|
|
case 'showInvitation':
|
|
$this->showSimpleMailInvitation();
|
|
break;
|
|
case 'previewInvitation':
|
|
$this->previewInvitation();
|
|
break;
|
|
case 'sendInvitation':
|
|
$this->sendInvitation();
|
|
break;
|
|
|
|
default:
|
|
print_r("<pre>");
|
|
print_r($_GET);
|
|
print_r($_POST);
|
|
print_r("</pre>"); ;
|
|
break;
|
|
}
|
|
}
|
|
|
|
function showSimpleMailInvitation() {
|
|
global $site_url, $lang, $global_user_id;
|
|
global $admin_type;
|
|
|
|
|
|
$pid = (isset($_POST['pid']) && trim($_POST['pid']) != '') ? trim($_POST['pid']) : 'def1';
|
|
|
|
# najprej preverimo prejemnike
|
|
$emails = explode( "\n",mysql_real_unescape_string($_POST['emails'] ));
|
|
|
|
#počistimo emaile
|
|
$valid_emails = array();
|
|
foreach ($emails as $email) {
|
|
$email = trim($email);
|
|
if ($this->validEmail($email) && !in_array($email,$valid_emails)) {
|
|
$valid_emails[] = $email;
|
|
}
|
|
}
|
|
if (count($valid_emails) > 0 ) {
|
|
$css_wide = ' wide';
|
|
}
|
|
# izrišemo osnovni div .divPopUp
|
|
echo '<div id="simpleMailInvitation_div" class="divPopUp'.$css_wide.'">';
|
|
echo '<div class="divPopUp_top clr">';
|
|
echo $lang['srv_email_vabila_simple_popup_title'];
|
|
echo '</div>'; #PM_top
|
|
echo '<div class="divPopUp_content">';
|
|
|
|
|
|
# če ni admin ali manager preverimo koliko emailov je ta uporabnik že uspešno poslal
|
|
if ($admin_type > 1) {
|
|
$r = sisplet_query("SELECT count(email)FROM srv_simple_mail_invitation WHERE ank_id='".$this->sid."' AND state='ok' AND usr_id='".$global_user_id."'");
|
|
list ($quota) = mysqli_fetch_row($r);
|
|
if ($quota > SIMPLE_MAIL_QUOTA) {
|
|
echo '<div class="simpleMailError">';
|
|
printf ($lang['srv_simple_mail_inv_quota1'], SIMPLE_MAIL_QUOTA);
|
|
echo '</div>';
|
|
} else if ( ($quota+count($valid_emails)) > SIMPLE_MAIL_QUOTA) {
|
|
echo '<div class="simpleMailError">';
|
|
printf ($lang['srv_simple_mail_inv_quota2'], SIMPLE_MAIL_QUOTA);
|
|
echo '</div>';
|
|
}
|
|
}
|
|
|
|
|
|
# če imamo kaj vlejavnih emailov, potem nadaljujemo
|
|
if (count($valid_emails) > 0 ) {
|
|
# preberemo vsa obvestila ankete (2x iz lang fajla in če obstaja še kaj shranjeno)
|
|
$profiles = $this->getProfiles();
|
|
|
|
# izrišemo profile
|
|
# dodamo cover div
|
|
echo '<div id="simpleMailInvitationCoverDiv" />';
|
|
echo '<div id="simpleMailInvitationPreviewDiv" />';
|
|
echo '<div class="floatLeft">';
|
|
echo '<div class="profile_holder">';
|
|
foreach ($profiles as $key => $profile) {
|
|
echo '<div value="'.$key.'" class="option'.($key == $pid ? ' active': '').'">'.$profile['subject'].'</div>';
|
|
}
|
|
echo '</div>';
|
|
echo '</div>'; #floatLeft
|
|
echo '<div class="floatLeft spaceLeft">';
|
|
echo '<div>';
|
|
echo $lang['srv_invitation_subject'].':';
|
|
echo '<br/>';
|
|
echo '<input id="simpleMailSubject" type="text" value="'.$profiles[$pid]['subject'].'">';
|
|
echo '</div>';
|
|
echo '<div>';
|
|
echo $lang['srv_invitation_content'].':';;
|
|
echo '<br/>';
|
|
echo '<textarea id="simpleMailBody">';
|
|
echo $profiles[$pid]['body'];
|
|
echo '</textarea>';
|
|
echo '</div>';
|
|
echo '</div>'; #floatLeft
|
|
|
|
echo '<div class="floatLeft spaceLeft">';
|
|
echo '<div>';
|
|
echo $lang['srv_invitation_recipients'].':';
|
|
echo '<br/>';
|
|
echo '<textarea id="simpleMailRecipients">';
|
|
echo implode("\n",$valid_emails);
|
|
echo '</textarea>';
|
|
echo '</div>';
|
|
echo '</div>'; #floatLeft
|
|
$buttonsRight = '<span class="buttonwrapper floatRight spaceRight"><a class="ovalbutton ovalbutton_orange" href="#" onclick="sendSimpleMailInvitation(); return false;"><span>'.$lang['srv_invitation_send'].'</span></a></span>';
|
|
$buttonsRight .= '<span class="buttonwrapper floatRight"><a class="ovalbutton ovalbutton_gray" href="#" onclick="previewMailInvitation(); return false;"><span>'.$lang['srv_invitation_preview'].'</span></a></span>';
|
|
} else {
|
|
# nimamo veljavnih emailov, obvestimo in damo gumb zapri
|
|
echo '<div class="simpleMailError">';
|
|
echo $lang['srv_simple_mail_inv_no_emails'];
|
|
echo '</div>';
|
|
}
|
|
|
|
echo '<br class="clr">';
|
|
echo '</div>'; # class="popUp_content"
|
|
echo '<div class="divPopUp_btm clr">'; #class="inv_FS_btm"
|
|
echo '<div class="floatLeft spaceLeft"><div class="buttonwrapper" title="'.$lang['srv_cancel'].'"><a class="ovalbutton ovalbutton_gray" href="#" onclick="$(\'#fullscreen\').hide();$(\'#fade\').fadeOut(\'slow\'); return false;"><span>'.$lang['srv_cancel'].'</span></a></div></div>';
|
|
|
|
if (count($valid_emails) > 0 ) {
|
|
echo $buttonsRight;
|
|
}
|
|
|
|
echo '</div>'; #class="inv_FS_btm"
|
|
echo '</div>'; #class="divPopUp"
|
|
}
|
|
|
|
function previewInvitation() {
|
|
global $lang;
|
|
# polovimo poslano
|
|
|
|
# najprej preverimo prejemnike
|
|
$emails = explode( "\n", mysql_real_unescape_string($_POST['emails']) );
|
|
#počistimo emaile
|
|
$valid_emails = array();
|
|
foreach ($emails as $email) {
|
|
$email = trim($email);
|
|
if ($this->validEmail($email) && !in_array($email,$valid_emails)) {
|
|
$valid_emails[] = $email;
|
|
}
|
|
}
|
|
|
|
reset($valid_emails);
|
|
$email = current($valid_emails);
|
|
#polovimo subject
|
|
$subject = trim($_POST['subject']);
|
|
$body = nl2br(trim(mysql_real_unescape_string($_POST['body'])));
|
|
|
|
# če mamo SEO
|
|
$url = SurveyInfo::getSurveyLink();
|
|
|
|
$body = str_replace(
|
|
array('#URL#','#EMAIL#'),
|
|
array('<a href="' . $url . '">' . $url . '</a>',$email),
|
|
$body);
|
|
|
|
echo '<div><b>'.$subject.'</b></div><br/>';
|
|
echo '<div>';
|
|
echo $body;
|
|
echo '</div>';
|
|
echo '<br class="clr"/>';
|
|
echo '<br/>';
|
|
echo '<span class="buttonwrapper floatRight"><a class="ovalbutton ovalbutton_orange" href="#" onclick="$(\'#simpleMailInvitationPreviewDiv\').hide(); $(\'#simpleMailInvitationCoverDiv\').fadeOut(\'slow\'); return false;"><span>'.$lang['srv_zapri'].'</span></a></span>';
|
|
}
|
|
|
|
|
|
function sendInvitation() {
|
|
global $lang, $admin_type, $site_path, $global_user_id;
|
|
# polovimo poslano
|
|
|
|
# najprej preverimo prejemnike
|
|
$emails = explode( "\n", mysql_real_unescape_string($_POST['emails']) );
|
|
#počistimo emaile
|
|
$valid_emails = array();
|
|
foreach ($emails as $email) {
|
|
$email = trim($email);
|
|
if ($this->validEmail($email) && !in_array($email,$valid_emails)) {
|
|
$valid_emails[] = $email;
|
|
}
|
|
}
|
|
|
|
#polovimo subject
|
|
$subject = trim(mysql_real_unescape_string($_POST['subject']));
|
|
$body = nl2br(trim(mysql_real_unescape_string($_POST['body'])));
|
|
|
|
# če mamo SEO
|
|
$url = SurveyInfo::getSurveyLink();
|
|
|
|
# zamenjamo sistemske vrednosti
|
|
$body = str_replace(array('#URL#', '[URL]'),
|
|
array('<a href="' . $url . '">' . $url . '</a>','<a href="' . $url . '">' . $url . '</a>'),
|
|
$body);
|
|
|
|
$c = 0;
|
|
# če ni admin ali manager preverimo koliko emailov je ta uporabnik že uspešno poslal
|
|
if ($admin_type > 1 ) {
|
|
$r = sisplet_query("SELECT count(email)FROM srv_simple_mail_invitation WHERE ank_id='".$this->sid."' AND state='ok' AND usr_id='".$global_user_id."'");
|
|
list ($quota) = mysqli_fetch_row($r);
|
|
$c = (int)$quota;
|
|
}
|
|
|
|
|
|
|
|
# izrišemo osnovni div .divPopUp
|
|
echo '<div id="simpleMailInvitation_div" class="divPopUp'.$css_wide.'">';
|
|
echo '<div class="divPopUp_top clr">';
|
|
echo $lang['srv_email_vabila_simple_popup_title'];
|
|
echo '</div>';
|
|
echo '<div class="divPopUp_content">';
|
|
|
|
if (is_array($valid_emails) && count($valid_emails) > 0) {
|
|
if ($subject != null && $subject != '') {
|
|
if ($body != null && $body != '') {
|
|
|
|
$send_success = array ();
|
|
$send_errors = array ();
|
|
$send_over_quota = array ();
|
|
|
|
Common::getInstance()->Init($this->sid);
|
|
|
|
foreach ($valid_emails AS $email) {
|
|
if ( $c < SIMPLE_MAIL_QUOTA ) {
|
|
|
|
# povečamo counter za neadmine
|
|
if ($admin_type > 1) {
|
|
$c++;
|
|
}
|
|
# zamenjamo morebitne meaile
|
|
$body = str_replace(array('#EMAIL#', '[EMAIL]'),
|
|
array($email,
|
|
$email),
|
|
$body);
|
|
|
|
try
|
|
{
|
|
$MA = new MailAdapter($this->anketa, $type='invitation');
|
|
$MA->addRecipients($email);
|
|
$resultX = $MA->sendMail($body, $subject);
|
|
}
|
|
catch (Exception $e)
|
|
{
|
|
}
|
|
|
|
if ($resultX) {
|
|
# poslalo ok
|
|
$send_success[] = $email;
|
|
} else {
|
|
# ni poslalo
|
|
$send_errors[] = $email;
|
|
}
|
|
|
|
} else {
|
|
# presegli smo kvoto, zabeležimo email.
|
|
$send_over_quota[] = $email;
|
|
}
|
|
}
|
|
} else {
|
|
# Polje Vsebina ne sme biti prazno
|
|
echo '<div class="simpleMailError">';
|
|
echo $lang['srv_simple_mail_inv_error1'];
|
|
echo '</div>';
|
|
$has_error = true;
|
|
}
|
|
|
|
} else {
|
|
# Polje Naslov - (zadeva) ne sme biti prazna
|
|
echo '<div class="simpleMailError">';
|
|
echo $lang['srv_simple_mail_inv_error2'];
|
|
echo '</div>';
|
|
$has_error = true;
|
|
}
|
|
} else {
|
|
# ni vnešenih prejemnikov, ali pa emaili niso pravilni
|
|
echo '<div class="simpleMailError">';
|
|
echo $lang['srv_simple_mail_inv_error3'];
|
|
echo '</div>';
|
|
$has_error = true;
|
|
}
|
|
|
|
|
|
echo '<div class="floatLeft" style="width:310px; max-height:400px; overflow:auto;">';
|
|
if (count($send_success) > 0 || count($send_errors) > 0) {
|
|
if (count($send_success) > 0) {
|
|
echo $lang['srv_simple_mail_inv_ok_msg'];
|
|
echo '<br/>';
|
|
echo implode("<br/>",$send_success);
|
|
echo '<br/>';
|
|
}
|
|
if (count($send_errors) > 0) {
|
|
echo $lang['srv_simple_mail_inv_error4'];
|
|
echo '<br/>';
|
|
echo '<br/>';
|
|
echo implode("<br/>",$send_errors);
|
|
}
|
|
} else {
|
|
echo $lang['srv_simple_mail_inv_error5'];
|
|
}
|
|
echo '</div>'; #floatLeft
|
|
|
|
echo '<div class="floatRight spaceLeft" >';
|
|
echo '<strong>'.$lang['srv_invitation_subject'].':'.'</strong>';
|
|
echo '<br/>';
|
|
echo '<div style="background-color: #fefefe; padding:3px; width:500px;">';
|
|
echo $subject;
|
|
echo '</div>';
|
|
echo '<br/>';
|
|
echo '<strong>'.$lang['srv_invitation_content'].':'.'</strong>';
|
|
echo '<br/>';
|
|
echo '<div style="background-color: #fefefe; padding:3px; width:500px;">';
|
|
echo $body;
|
|
echo '</div>';
|
|
echo '</div>'; #floatLeft
|
|
echo '<br class="clr" />';
|
|
|
|
echo '</div>'; # class="popUp_content"
|
|
echo '<div class="divPopUp_btm clr">'; #class="inv_FS_btm"
|
|
|
|
echo '<span class="buttonwrapper floatRight spaceRight"><a class="ovalbutton ovalbutton_orange" href="#" onclick="$(\'#fullscreen\').hide();$(\'#fade\').fadeOut(\'slow\'); return false;"><span>'.$lang['srv_zapri'].'</span></a></span>';
|
|
|
|
echo '</div>'; #class="inv_FS_btm"
|
|
echo '</div>'; #class="divPopUp"
|
|
|
|
# poskrbimo za tracking: statusi emailov: ENUM('ok','error','quota_exceeded'),
|
|
$values = '';
|
|
$prefix = '';
|
|
$send_time = date( 'Y-m-d H:i:s');
|
|
if (is_array($send_success) && count($send_success)>0) {
|
|
foreach ($send_success AS $email) {
|
|
$values .= $prefix."('".$this->sid."', '".$email."', '".$send_time."', 'ok', '".$global_user_id."')";
|
|
$prefix = ', ';
|
|
}
|
|
}
|
|
if (is_array($send_errors) && count($send_errors)>0) {
|
|
foreach ($send_errors AS $email) {
|
|
$values .= $prefix."('".$this->sid."', '".$email."', '".$send_time."', 'error', '".$global_user_id."')";
|
|
$prefix = ', ';
|
|
}
|
|
}
|
|
if (is_array($send_over_quota) && count($send_over_quota)>0) {
|
|
foreach ($send_over_quota AS $email) {
|
|
$values .= $prefix."('".$this->sid."', '".$email."', '".$send_time."', 'quota_exceeded', '".$global_user_id."')";
|
|
$prefix = ', ';
|
|
}
|
|
}
|
|
if ($values != '') {
|
|
$insert_string = 'INSERT INTO srv_simple_mail_invitation (ank_id, email, send_time, state, usr_id) VALUES '.$values;
|
|
sisplet_query($insert_string);
|
|
sisplet_query("COMMIT");
|
|
}
|
|
}
|
|
|
|
function getProfiles() {
|
|
global $lang;
|
|
# preberemo vsa obvestila ankete (2x iz lang fajla in če obstaja še kaj shranjeno)
|
|
$profiles = array();
|
|
$profiles['def1'] = array('subject' => $lang['srv_simple_mail_inv_def1_subject'],
|
|
'body' => $lang['srv_simple_mail_inv_def1_body']);
|
|
$profiles['def2'] = array('subject' => $lang['srv_simple_mail_inv_def2_subject'],
|
|
'body' => $lang['srv_simple_mail_inv_def2_body']);
|
|
|
|
return $profiles;
|
|
}
|
|
|
|
/**
|
|
Validate an email address.
|
|
Provide email address (raw input)
|
|
Returns true if the email address has the email
|
|
address format and the domain exists.
|
|
*/
|
|
function validEmail($email = null) {
|
|
$isValid = true;
|
|
$atIndex = strrpos($email, "@");
|
|
if (is_bool($atIndex) && !$atIndex)
|
|
{
|
|
$isValid = false;
|
|
}
|
|
else
|
|
{
|
|
$domain = substr($email, $atIndex+1);
|
|
$local = substr($email, 0, $atIndex);
|
|
$localLen = strlen($local);
|
|
$domainLen = strlen($domain);
|
|
$domain_parts = explode('.',$domain);
|
|
|
|
if ($localLen < 1 || $localLen > 64) {
|
|
// local part length exceeded
|
|
$isValid = false;
|
|
} else if ($domainLen < 1 || $domainLen > 255) {
|
|
// domain part length exceeded
|
|
$isValid = false;
|
|
} else if ($local[0] == '.' || $local[$localLen-1] == '.') {
|
|
// local part starts or ends with '.'
|
|
$isValid = false;
|
|
} else if ($domain[0] == '.' || $domain[$domainLen-1] == '.') {
|
|
// domain part starts or ends with '.'
|
|
$isValid = false;
|
|
} else if (preg_match('/\\.\\./', $local))
|
|
{
|
|
// local part has two consecutive dots
|
|
$isValid = false;
|
|
} else if (!preg_match('/^[A-Za-z0-9\\-\\.]+$/', $domain)) {
|
|
// character not valid in domain part
|
|
$isValid = false;
|
|
} else if (preg_match('/\\.\\./', $domain)) {
|
|
// domain part has two consecutive dots
|
|
$isValid = false;
|
|
} else if (!preg_match('/^(\\\\.|[A-Za-z0-9!#%&`_=\\/$\'*+?^{}|~.-])+$/', str_replace("\\\\","",$local))) {
|
|
// character not valid in local part unless
|
|
// local part is quoted
|
|
if (!preg_match('/^"(\\\\"|[^"])+"$/', str_replace("\\\\","",$local))) {
|
|
$isValid = false;
|
|
}
|
|
} else if ( strlen($domain_parts[0]) < 1) {
|
|
// num chars in
|
|
$isValid = false;
|
|
} else if ( strlen($domain_parts[1]) < 1) {
|
|
$isValid = false;
|
|
}
|
|
|
|
#if ($isValid && !(checkdnsrr($domain,"MX") || checkdnsrr($domain,"A"))) {
|
|
# // domain not found in DNS
|
|
# $isValid = false;
|
|
#}
|
|
|
|
}
|
|
return $isValid;
|
|
}
|
|
|
|
function countRecipients() {
|
|
$r = sisplet_query("SELECT count(email)FROM srv_simple_mail_invitation WHERE ank_id='".$this->sid."' AND state='ok'");
|
|
list ($quota) = mysqli_fetch_row($r);
|
|
return (int)$quota;
|
|
}
|
|
|
|
function getRecipients() {
|
|
$result = array();
|
|
$sql_string = "SELECT smi.*, u.name, u.surname, u.email AS adminmail FROM srv_simple_mail_invitation AS smi LEFT JOIN users AS u ON smi.usr_id = u.id WHERE smi.ank_id='".$this->sid."' ORDER BY smi.send_time DESC";
|
|
$sql_query = sisplet_query($sql_string);
|
|
while ($row = mysqli_fetch_assoc($sql_query)) {
|
|
$result[] = $row;
|
|
}
|
|
return $result;
|
|
}
|
|
}
|