[AsteriskBrasil] Email no Asterisk

Asterisk - Junior Polegato asterisk em juniorpolegato.com.br
Segunda Maio 20 15:56:27 BRT 2013


Em 20-05-2013 06:45, Manecão escreveu:
> Oi pessoal,
> Como faço para receber no meu email cada vez que forem disparadas 
> ligaçoes entrantes ou saintes no asterisk, de tal maneira que me 
> informe data, hora, tempo de conexão, numero discado e callerID de 
> origem, identificando o ramal ou portal de voz de onde partiu a ligação.

Olá!

         Tenho uma solução de monitoramento que alimenta um banco de 
dados externo, mas no seu caso é só adaptar para enviar o e-mail. Não 
precisa fazer nenhuma alteração no seu plano de discagem.

         O código é feito em python e roda em segundo plano lendo o 
final do arquivo /var/log/asterisk/cdr-csv/Master.csv.

         Tentei colocar as linhas de código para enviar e-mail dentro 
deste código, espero que seja um ponto de partida para você.

         Qualquer interesse à parte, podemo negociar em PVT.

         E-mail recebido:

Origem: 123
Destino: 909092788696
Data e hora: 20/05/2013 15:45:18 BRT(-0300)
Tempo conectado: 00:00:13
Tempo total: 00:00:30


         Logo abaixo tem o código em Python:

[]'s
         Junior Polegato


#!/usr/bin/env python
# -*- coding: utf-8 -*-

import time
import smtplib
import datetime
try:
     import pytz
     time_zone_support = True
     local = pytz.timezone(open('/etc/timezone').read().strip())
except:
     print "No time zone support"
     time_zone_support = False

_SMTP_SERVER = "smtp.googlemail.com:587"
_SMTP_EMAIL = "junior em gmail.com"
_SMTP_PASS = "SeNhAdOgMaIl"
_SUBJECT = 'Dados da chamada efetuada'

_EXTEN_EMAIL = {
     "123": "ramal_123 em gmail.com",
     "456": "ramal_456 em gmail.com",
     "789": "ramal_789 em gmail.com",
     "abc": "ramal_abc em gmail.com",
}

_CSV_FILE = "/var/log/asterisk/cdr-csv/Master.csv"

# CSV Fields from http://www.voip-info.org/wiki/view/Asterisk+cdr+csv
_ACCOUNTCODE = 0
_SRC = 1
_DST = 2
_DCONTEXT = 3
_CLID = 4
_CHANNEL = 5
_DSTCHANNEL = 6
_LASTAPP = 7
_LASTDATA = 8
_START = 9
_ANSWER = 10
_END = 11
_DURATION = 12
_BILLSEC = 13
_DISPOSITION = 14
_AMAFLAGS = 15

# Inteval between reads from _CSV_FILE
_READ_INTERVAL = 1

# This function returns a list of fields in a csv record and
# it identifies text, integer and float types,
# ignoring left and right spaces according a field delimiter
def split_csv_fields(reg, field_delimiter = ','):
     fields = []
     pos = 0
     while pos < len(reg):
         while reg[pos] < ' ':
             pos += 1
         if reg[pos] in ('"', "'"):
             text_delimiter = reg[pos]
             start = pos + 1
             while pos < len(reg):
                 pos += 1
                 while reg[pos] != text_delimiter:
                     pos += 1
                 if reg[pos - 1] != '\\':
                     pos += 1
                     break
             fields.append(reg[start:pos - 1])
             while pos < len(reg) and reg[pos] != field_delimiter:
                 pos += 1
         else:
             start = pos
             while pos < len(reg) and reg[pos] != field_delimiter:
                 pos += 1
             text = reg[start:pos].strip()
             dots = text.count('.')
             if dots < 2 and text.replace('.', '').isdigit():
                 if dots:
                     fields.append(float(text))
                 else:
                     fields.append(int(text))
             else:
                 fields.append(text)
         pos += 1
     return fields

def duration(seconds):
     h = seconds / 3600
     m = seconds / 60 % 60
     s = seconds % 60
     return "%02i:%02i:%02i" % (h, m, s)

def process_data(data):
     data = data.strip().replace('\r', '').split('/n')
     for reg in data:
         fields = split_csv_fields(reg)
         if time_zone_support:
             start_date = datetime.datetime.strptime(
                                     fields[_START], '%Y-%m-%d %H:%M:%S')
             start_date = pytz.utc.localize(start_date)
             start_date = start_date.astimezone(local)
             start_date = start_date.strftime('%d/%m/%Y %H:%M:%S %Z(%z)')
         else:
             start_date = datetime.fields[_START]
         body = ('Origem: %s\n'
                 'Destino: %s\n'
                 'Data e hora: %s\n'
                 'Tempo conectado: %s\n'
                 'Tempo total: %s\n'
                 % (fields[_SRC], fields[_DST], start_date,
                    duration(fields[_BILLSEC]),
                    duration(fields[_DURATION])))
         print body
         if fields[_SRC] not in _EXTEN_EMAIL:
             print "No e-mail to %s found!" % fields[_SRC]
             return
         try:
             to = _EXTEN_EMAIL[fields[_SRC]]
             email_date = time.strftime('%a, %d %b %Y %H:%M:%S %z')
             msg = ("From: %s\r\n"
                    "To: %s\r\n"
                    "Subject: %s\r\n"
                    "Date: %s\r\n"
                    "\r\n"
                    "%s"
                    % (_SMTP_EMAIL, to, _SUBJECT, email_date, body))
             server = smtplib.SMTP(_SMTP_SERVER, timeout = 60)
             ehlo = server.ehlo()
             if "STARTTLS" in ehlo[1]:
                 server.starttls()
             server.login(_SMTP_EMAIL, _SMTP_PASS)
             server.sendmail(_SMTP_EMAIL, to, msg)
             server.quit()
             print "Mail to %s sent!" % to
         except Exception as error:
             print str(error)
             print "Mail to %s not sent!" % to

if __name__ == "__main__":
     # Open csv file
     csv_file = open(_CSV_FILE)
     # Go to the end of file
     csv_file.seek(0, 2)
     # Try to get more data in _READ_INTERVAL
     data = ''
     while True:
         # Get more data
         data += csv_file.read()
         if '\n' in data:
             # Get the position of last new line
             last_new_line = data.rfind('\n')
             # Process data up to last new line
             try:
                 process_data(data[:last_new_line])
             except:
                 print 'Error processing data:', repr(data)
             # Delete the processed data
             data = data[last_new_line + 1:]
         # Wait for _READ_INTERVAL seconds
         time.sleep(_READ_INTERVAL)





Mais detalhes sobre a lista de discussão AsteriskBrasil