class EmailsController < ApplicationController
require 'net/smtp'
require 'enumerator'
require 'smtp_tls'
require 'net/pop'
require 'tmail'
#require 'pop_ssl'
BASE_DIR = "/tmp/attachements"
layout "callc"
before_filter :check_localization
before_filter :authorize, :except => [:email_callback]
before_filter :find_email, :only => [:edit, :update, :show_emails, :list_users, :destroy, :send_emails, :send_emails_from_cc]
before_filter :find_session_user, :only => [:edit, :update, :show_emails, :destroy]
def index
list
render :action => 'list'
end
# GETs should be safe (see http://www.w3.org/2001/tag/doc/whenToUseGet.html)
verify :method => :post, :only => [ :destroy, :create, :update ],
:redirect_to => { :action => :list },
:add_flash => { :notice => _('Dont_be_so_smart'),
:params => {:dont_be_so_smart => true}}
def new
@page_title = _('New_email')
@page_icon = "add.png"
@help_link = 'http://wiki.kolmisoft.com/index.php/Email_variables'
@email = Email.new
# @user = User.find(session[:user_id])
end
def create
@page_title = _('New_email')
@page_icon = "add.png"
@email = Email.new(params[:email])
@email.date_created = Time.now
@email.callcenter = session[:user_cc_agent]
@email.owner_id = session[:user_id]
if @email.save
flash[:status] = _('Email_was_successfully_created')
if session[:user_cc_agent].to_i != 1
redirect_to :action => 'list'
else
redirect_to :action => 'emeils_callcenter'
end
else
flash[:notice] = _('Email_was_not_created')
render :action => 'new'
end
end
=begin
In before filter : @email, @user
=end
def edit
@help_link = 'http://wiki.kolmisoft.com/index.php/Email_variables'
@page_title = _('Edit_email')+": " + @email.name
@page_icon = "edit.png"
end
=begin
In before filter : @email, @user
=end
def update
@user = User.find_by_id(session[:user_id])
unless @user
flash[:notice] = _('User_was_not_found')
render :controller=>"callc", :action => 'main'
end
if @email.update_attributes(params[:email])
@email.save
flash[:status] = _('Email_was_successfully_updated')
# redirect_to :action => 'list', :id => params[:id], :ccc=>@ccc
if session[:user_cc_agent].to_i != 1
redirect_to :action => 'list'
else
redirect_to :action => 'emeils_callcenter'
end
else
flash[:notice] = _('Email_was_not_updated') + ": " + _("Wrong_email_variables") + " wiki"
render :action => 'edit', :id => params[:id], :ccc=>@ccc
end
end
def list
@page_title = _('Emails')
@page_icon = "email.png"
@emails = Email.find(:all,
:conditions =>["owner_id= ? and (callcenter='0' or callcenter is null)", session[:user_id]],
:joins => "LEFT JOIN (SELECT data, data2, COUNT(*) as emails FROM actions WHERE action = 'email_sent' GROUP BY data2) as actions ON (emails.id = actions.data2)")
@email_sending_enabled = Confline.get_value("Email_Sending_Enabled", 0).to_i == 1
if @emails.size.to_i == 0 and session[:usertype] == "reseller"
user=User.find(session[:user_id])
user.create_reseller_emails
@emails = Email.find(:all,
:conditions =>["owner_id= ? and (callcenter='0' or callcenter is null)", session[:user_id]],
:joins => "LEFT JOIN (SELECT data, data2, COUNT(*) as emails FROM actions WHERE action = 'email_sent' GROUP BY data2) as actions ON (emails.id = actions.data2)")
end
end
def emeils_callcenter
@page_title = _('Emails')
@page_icon = "email.png"
if session[:usertype].to_s != "admin"
@emails = Email.find(:all, :conditions =>["(owner_id= ? or owner_id='0') and callcenter='1'", session[:user_id]])
else
@emails = Email.find(:all, :conditions =>"callcenter='1'")
end
@email_sending_enabled = Confline.get_value("Email_Sending_Enabled", 0).to_i == 1
end
=begin
In before filter : @email, @user
=end
def show_emails
@page_title = _('show_emails')+": " + @email.name
@page_icon = "email.png"
end
=begin
In before filter : @email
=end
def list_users
@page_title = _('Email_sent_to_users')+": " + @email.name
@page_icon = "view.png"
@page = 1
@page = params[:page].to_i if params[:page] and params[:page].to_i > 0
@total_pages = (Action.count(:conditions => ["data2 = ? AND action = 'email_sent'", params[:id]]).to_f / session[:items_per_page].to_f).ceil
@actions = Action.find(:all,
:conditions => ["data2 = ? AND action = 'email_sent'", params[:id]],
:offset=> (@page-1)*session[:items_per_page],
:limit => session[:items_per_page])
end
=begin
In before filter : @email
=end
def destroy
@email.destroy
flash[:status] = _('Email_deleted')
if session[:user_cc_agent].to_i != 1
redirect_to :action => 'list'
else
redirect_to :action => 'emeils_callcenter'
end
end
=begin
In before filter : @email
=end
def send_emails
@page_title = _('Send_email') + ": " + @email.name
@page_icon = "email_go.png"
@users = User.find(:all, :conditions => ["hidden = 0 AND owner_id = ?", session[:user_id]])
# find selected users and send email to them
@users_list = []
to_email = params[:to_be_sent]
if to_email
to_email.each do |user_id, do_it|
if do_it == "yes"
user = User.find(user_id)
@users_list << user
end
end
#sent email to users
send_all(@users_list, @email)
end
if @users_list.size > 0
redirect_to :action => 'list'
end
end
=begin
In before filter : @email
=end
def send_emails_from_cc
@page_title = _('Send_email') + ": " + @email.name.to_s
@page_icon = "email_go.png"
@search_agent= params[:agent]
@agents = User.find(:all, :conditions=>"call_center_agent=1")
@clients = CcClient.whit_main_contact(@search_agent)
@page = 1
@page = params[:page].to_i if params[:page]
@total_pages = (@clients.size.to_f / session[:items_per_page].to_f).ceil
@all_clients = @clients
@clients = []
@a_number = []
iend = ((session[:items_per_page] * @page) - 1)
iend = @all_clients.size - 1 if iend > (@all_clients.size - 1)
for i in ((@page - 1) * session[:items_per_page])..iend
@clients << @all_clients[i]
end
# find selected users and send email to them
@clients_list = []
# my_debug params[:to_be_sent].to_yaml
to_email = params[:to_be_sent]
if to_email
to_email.each do |client_id, do_it|
if do_it == "yes"
client = CcClient.whit_email(client_id)
@clients_list << client
end
end
#sent email to users
send_all(@clients_list, @email)
end
if @clients_list.size > 0
redirect_to :action => 'emeils_callcenter'
end
end
def send_all(users, email)
e =[]
status = Email.send_email(email, users, session[:usertype].to_s == "admin" ? Confline.get_value("Company_Email", 0) : Confline.get_value("Email_from", session[:user_id].to_i), 'send_all', {:owner=>session[:user_id], })
status.uniq.each{ |i| e << _(i.capitalize)}
flash[:notice] = e.join('
')
end #send_all
def EmailsController::send_test(id)
user = User.find(id)
email = Email.find(:first, :conditions => ["name = 'registration_confirmation_for_user' AND owner_id = ?", id])
users = []
users << user
variables = Email.email_variables(user, nil, {:owner=>id})
send_email(email, Confline.get_value("Email_from", id) ,users, variables)
# redirect_to :controller => "callc", :action => "main" and return false
end
def EmailsController::send_to_users_paypal_email(order)
email = Email.find(:first, :conditions => "name = 'calling_cards_data_to_paypal' AND owner_id = #{0}")
users = []
users << order
user_mail = order.email
cards = order.cards
admin = []
adm = User.find(0)
admin << adm
admin_email = adm.email
details = ActionView::Base.new(Rails::Configuration.new.view_path).render(:partial => 'emails/email_calling_cards_purchase', :locals => {:cards => cards})
user = User.new({:usertype=>'user', :username=>'Card', :first_name=>order.first_name, :last_name=>order.last_name})
varables = Email.email_variables(user, nil, {:cc_purchase_details => details}, {:user_email_card=>order.email})
EmailsController::send_email(email, admin_email ,users, varables)
MorLog.my_debug "_____________________________"
MorLog.my_debug admin_email
MorLog.my_debug user_mail
MorLog.my_debug "_____________________________"
EmailsController::send_email(email, user_mail ,admin, {:cc_purchase_details => details})
end
def EmailsController::send_email(email, email_from, users, assigns = {})
if Confline.get_value("Email_Sending_Enabled", 0).to_i == 1
email_from.gsub!(' ', '_')#so nasty, but rails has a bug and doest send from_email if it has spaces in it
status = Email.send_email(email, users, email_from, 'send_email', {:assigns=>assigns, :owner=>assigns[:owner]})
status.uniq.each{ |i| @e = _(i.capitalize) + '
'}
return @e
else
return _('Email_disabled')
end
end
def EmailsController::send_email_with_attachment(email, email_from, user, attachments, assigns = {})
num = []
status = Email.send_email(email, [user], email_from, 'send_email_with_attachment', {:assigns=>assigns, :owner=>user.owner_id.to_i, :attachments=>attachments})
status.uniq.each{ |i| num[1] = _(i.capitalize) + '
'; num[0] = (i =~ /email[\s_]*sent/i) ? 1 : 0 }
return num
end
def email_pop3_cronjob
pop3_server = Confline.get_value("SMS_Email_pop3_Server")
login = Confline.get_value("SMS_Email_Login")
psw = Confline.get_value("SMS_Email_Password")
sql = "SELECT sms_messages.*, sms_providers.*, sms_messages.id as 'sms_id' FROM sms_messages
LEFT JOIN sms_providers on (sms_providers.id = sms_messages.provider_id)
WHERE sms_providers.provider_type = 'sms_email' AND sms_messages.status_code = '0'"
res = ActiveRecord::Base.connection.select_all(sql)
gres = []
for r in res
time = r['sending_date'].to_time
min = ((Time.now - time).to_i / 60)
@user = User.find(r['user_id'])
@ruser = User.find(r['reseller_id'])
if min.to_i < r['sms_email_wait_time'].to_i
gres << r
else
if r['time_out_charge_user'].to_i == 1
# my_debug "nuskaiciau uz per ilga laika"
@sms = SmsMessage.find(r['sms_id'])
@user = User.find(r['user_id'])
@ruser = User.find(r['reseller_id'])
# my_debug("userio_balansas : " + @user.frozen_balance)
# my_debug("resellerio_balansas : " + @ruser.frozen_balance)
if @ruser.id.to_i != 0
@user.frozen_balance = @user.frozen_balance - r['user_price'].to_f
@user.save
else
@user.frozen_balance = @user.frozen_balance - r['user_price'].to_f
@user.save
@ruser.frozen_balance = @ruser.frozen_balance - r['reseller_price'].to_f
@ruser.save
end
@sms.status_code = 5
@sms.save
else
# my_debug "grazinau uz per ilga laika"
if @ruser.id.to_i != 0
@user.balance = @user.balance + r['user_price'].to_f
@user.frozen_balance = @user.frozen_balance - r['user_price'].to_f
@user.save
else
@user.balance = @user.balance + r['user_price'].to_f
@user.frozen_balance = @user.frozen_balance - r['user_price'].to_f
@user.save
@ruser.balance = @ruser.balance + r['reseller_price'].to_f
@ruser.frozen_balance = @ruser.frozen_balance - r['reseller_price'].to_f
@ruser.save
end
@sms = SmsMessage.find(r['sms_id'])
@sms.status_code = 4
@sms.user_rate = 0
@sms.user_price = 0
@sms.reseller_rate = 0
@sms.reseller_price = 0
@sms.provider_rate = 0
@sms.provider_price = 0
@sms.save
end
end
end
Net::POP3.enable_ssl(OpenSSL::SSL::VERIFY_NONE)
Net::POP3.start( pop3_server, Net::POP3.default_pop3s_port, login, psw) do |pop|
if pop.mails.empty?
a= 'No mail.'
# my_debug a
else
pop.each_mail do |email|
msg = email.pop
for r in gres
#================ no keywords ===============================
if msg.match(r['number']) and msg.match(r['sms_provider_domain']) and (r['wait_for_bad_email'].to_i == 1 or r['wait_for_good_email'].to_i == 1)
@user = User.find(r['user_id'])
# my_debug("user : " + @user.username)
@ruser = User.find(r['reseller_id'])
# my_debug("reseller : " + @ruser.username)
@sms = SmsMessage.find(r['sms_id'])
# my_debug("user_balance : " + @user.balance.to_s)
# my_debug("user_frozen_balance : " + @user.frozen_balance.to_s)
# my_debug("resseller_balance : " + @ruser.balance.to_s)
# my_debug("resseller_frozen_balance : " + @ruser.frozen_balance.to_s)
if r['nan_keywords_charge_user'].to_i == 1
# my_debug "nan_keywords_charge_user"
@user_price = r['user_price'].to_f
@ruser_price = r['reseller_price'].to_f
@user_price_b = 0
@ruser_price_b = 0
@sms.status_code = 5
else
# my_debug "nan_keywords_charge_user"
@user_price = r['user_price'].to_f
@ruser_price = r['reseller_price'].to_f
@user_price_b = r['user_price'].to_f
@ruser_price_b = r['user_price'].to_f
@sms.status_code = 4
end
if r['wait_for_bad_email'].to_i == 1 and msg.match(r['email_bad_keywords'])
# my_debug "wait_for_bad_email"
@user_price = r['user_price'].to_f
@ruser_price = r['reseller_price'].to_f
@user_price_b = r['user_price'].to_f
@ruser_price_b = r['user_price'].to_f
@sms.status_code = 4
end
if r['wait_for_good_email'].to_i == 1 and msg.match(r['email_good_keywords'])
# my_debug "wait_for_good_email"
@user_price = r['user_price'].to_f
@ruser_price = r['reseller_price'].to_f
@user_price_b = 0
@ruser_price_b = 0
@sms.status_code = 5
end
# my_debug "--------------VEIKSMAI------------------"
if @user.owner_id.to_i == 0
# my_debug(@user.balance.to_s+ " + " + @user_price_b.to_s)
@user.balance = @user.balance + @user_price_b
# my_debug(@user.frozen_balance.to_s+ " - " + @user_price.to_s)
@user.frozen_balance = @user.frozen_balance - @user_price
@user.save
else
# my_debug(@user.balance.to_s+ " + " + @user_price_b.to_s)
@user.balance = @user.balance + @user_price_b
# my_debug(@user.frozen_balance.to_s+ " - " + @user_price.to_s)
@user.frozen_balance = @user.frozen_balance - @user_price
# my_debug(@ruser.balance.to_s+ " + " + @ruser_price_b.to_s)
@ruser.balance = @ruser.balance + @ruser_price_b
# my_debug(@ruser.frozen_balance.to_s+ " - " + @ruser_price.to_s)
@ruser.frozen_balance = @ruser.frozen_balance - @ruser_price
@user.save
@ruser.save
end
@sms.save
# my_debug "---------------------------------------"
# my_debug "po "
# my_debug("user_balance : " + @user.balance.to_s)
# my_debug("user_frozen_balance : " + @user.frozen_balance.to_s)
# my_debug("resseller_balance : " + @ruser.balance.to_s)
# my_debug("resseller_frozen_balance : " + @ruser.frozen_balance.to_s)
# my_debug "*****************************************************************"
end
end
email.delete
end
end
end
redirect_to :controller => "emails", :action => "list" and return false
end
def email_callback
if callback_active?
if params[:subject].to_s.downcase == 'change'
old_callerid = params[:param1].to_s
new_callerid = params[:param2].to_s
Callerid.set_callback_from_emails(old_callerid, new_callerid)
end
if params[:subject].to_s.downcase == 'callback'
auth_callerid = params[:param1].to_s.gsub(/[^0-9]/,"")
first_number = params[:param2].to_s.gsub(/[^0-9]/,"")
second_number = params[:param3].to_s.gsub(/[^0-9]/,"")
my_debug params.to_yaml
auth_dev_callerid = Callerid.find(:first, :conditions => "cli = '#{auth_callerid}'")
if auth_dev_callerid and auth_dev_callerid.email_callback.to_i == 1
MorLog.my_debug "email2callback by #{auth_callerid} authenticated."
#Initiating callback between #{ first_number} and #{second_number}"
if first_number.to_i > 0 and second_number.to_i > 0
device = Device.find(:first, :conditions => "id = #{auth_dev_callerid.device_id}")
if device
originate_call(device.id, first_number, "Local/#{first_number}@mor_cb_src/n", "mor_cb_dst", second_number, device.callerid)
MorLog.my_debug "email callback - originating callback to '#{first_number}' and '#{second_number}'"
Action.add_action2(0, "email_callback_originate", "done", "originating callback to '#{first_number}' and '#{second_number}'")
else
MorLog.my_debug "email2callback error - auth. device not found"
Action.add_action2(0, "email_callback_originate", "error", "auth. device not found, '#{first_number}' - '#{second_number}'")
end
else
MorLog.my_debug "email2callback can't be initiated because bad numbers '#{first_number}' and/or '#{second_number}'"
Action.add_action2(0, "email_callback_originate", "error", "can't be initiated because bad numbers '#{first_number}' and/or '#{second_number}'")
end
else
MorLog.my_debug "email2callback fail by auth_callerid: #{auth_callerid}"
Action.add_action2(0, "email_callback_originate", "error", "fail by auth_callerid: #{auth_callerid}, dst: '#{second_number}'")
end
end
if params[:subject].to_s.downcase != 'callback' and params[:subject].to_s.downcase != 'change'
MorLog.my_debug "ERROR, Subject is not correct , [#{params[:subject]}]"
Action.add_action2(0, "email_callback", "error - Unknown Action", "#{params[:subject]}")
end
else
MorLog.my_debug "ERROR, Callback addon is disabled"
Action.add_action2(0, "email_callback", "error - Callback addon is disabled", '')
end
end
=begin rdoc
Sends conmirmation email for user after registration.
=end
def EmailsController.send_user_email_after_registration(user, device, password, reg_ip, free_ext)
if Confline.get_value("Send_Email_To_User_After_Registration") == "1"
#send mail to user with device details
email = Email.find(:first, :conditions => ["name = 'registration_confirmation_for_user' AND owner_id= ?", user.owner_id])
users = [user]
variables = Email.email_variables(user, device, {:login_password => password, :user_ip => reg_ip})
num = EmailsController.send_email(email, Confline.get_value("Email_from", user.owner_id), users, variables)
# if num
# #flash[:notice] = _('EMAIL_SENDING_ERROR')
# action = Action.new
# action.user_id = user.id
# action.action = "error"
# action.date = Time.now
# action.data = 'Cant_send_email'
# action.data2 = num.to_s
# action.save
# end
return 1
end
return 0
end
=begin rdoc
Send mail to admin with registered user details
=end
def EmailsController.send_admin_email_after_registration(user, device, password, reg_ip, free_ext, owner_id = 0)
if Confline.get_value("Send_Email_To_Admin_After_Registration") == "1"
#
email = Email.find(:first, :conditions => ["name = 'registration_confirmation_for_admin' AND owner_id= ?", owner_id])
users = [User.find_by_id(owner_id)]
variables = Email.email_variables(user, device, {:user_ip=>reg_ip, :password=>password, :free_ext=>free_ext})
num = EmailsController.send_email(email, Confline.get_value("Email_from", owner_id), users, variables)
# if num
# #flash[:notice] = _('EMAIL_SENDING_ERROR')
# action = Action.new
# action.user_id = user.id
# action.action = "error"
# action.date = Time.now
# action.data = 'Cant_send_email'
# action.data2 = num.to_s
# action.save
# end
end
end
private
def find_email
@email = Email.find_by_id(params[:id])
unless @email
flash[:notice] = _('Email_was_not_found')
redirect_to :controller=>"callc", :action => 'main' and return false
end
check_user_for_email(@email)
end
def find_session_user
@user = User.find_by_id(session[:user_id])
unless @user
flash[:notice] = _('User_was_not_found')
render :controller=>"callc", :action => 'main'
end
end
def check_user_for_email(email)
if email.class.to_s =="Fixnum"
email = Email.find(:first, :conditions => ["id = ? ", email])
end
if email.owner_id != session[:user_id]
dont_be_so_smart
redirect_to :controller => "emails", :action => "list" and return false
end
return true
end
end