S
Sered
Beta
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
¿Tienes problema con la cola de correos y spam masivo?, Solución eficiente para gestionar exim en servidores cPanel/WHM
Muchas veces hay clientes que alojan Malware en sus sitios web y es muy probable que estos envíen spam de forma masiva, qué sucede con esto, se llena la cola de correo y es complicado separar los correos buenos de los malos, es decir, si enviamos spam en nuestro servidor con este script podemos gestionar los correos spam sin tener que tocar los correos buenos, además de eliminar únicamente los correos de un usuario o dirección en particular.
Pasos a seguir:
- Solo debe ser utilizado por usuario root dentro del servidor.
- Debes crear el directorio bin en /root, es decir, mkdir -p /root/bin
- El archivo debes crearlo dentro de /root/bin con el nombre que quieras, y darle permisos chmod +x
Opciones en el script:
--user = Selecciona el usuario a gestionar cola de correos
--address = Dirección que envía el correo
--sending-host = Seleccionar host que envía correo
--bounced = Correos que rebotaron
--remove = Opción para eliminar
--help = Muestra opciones principales
Ejemplos de uso:
eximclear --user=sered --remove # eliminar todos los correos en cola del usuario sered
eximclear --bounced --remove # elimina todos los correos en cola que rebotaron
eximclear --address=felipe@sered.net --remove # elimina todos los correos en cola de felipe@sered.net
Muchas veces hay clientes que alojan Malware en sus sitios web y es muy probable que estos envíen spam de forma masiva, qué sucede con esto, se llena la cola de correo y es complicado separar los correos buenos de los malos, es decir, si enviamos spam en nuestro servidor con este script podemos gestionar los correos spam sin tener que tocar los correos buenos, además de eliminar únicamente los correos de un usuario o dirección en particular.
Pasos a seguir:
- Solo debe ser utilizado por usuario root dentro del servidor.
- Debes crear el directorio bin en /root, es decir, mkdir -p /root/bin
- El archivo debes crearlo dentro de /root/bin con el nombre que quieras, y darle permisos chmod +x
Opciones en el script:
--user = Selecciona el usuario a gestionar cola de correos
--address = Dirección que envía el correo
--sending-host = Seleccionar host que envía correo
--bounced = Correos que rebotaron
--remove = Opción para eliminar
--help = Muestra opciones principales
Ejemplos de uso:
eximclear --user=sered --remove # eliminar todos los correos en cola del usuario sered
eximclear --bounced --remove # elimina todos los correos en cola que rebotaron
eximclear --address=felipe@sered.net --remove # elimina todos los correos en cola de felipe@sered.net
Insertar CODE, HTML o PHP:
#!/usr/bin/python
__author__ = 'Felipe Montes <felipe@sered.net>'
import os
import socket
import re
from optparse import OptionParser
from subprocess import Popen
from_pattern = re.compile(r"\d+F\s+From:\s+<?(\S+)>?")
def file_to_msgdict(filename):
if not os.path.exists(filename):
return {}
fd = open(filename, 'r')
content = fd.readlines()
fd.close()
result = {}
for i, line in enumerate((l.strip('\r\n\t ') for l in content)):
if not line:
continue
if i == 0:
result['mid'] = line[:-2]
elif i == 1:
result['user'] = line.split(' ')[0]
elif i == 2:
result['address'] = line.strip('<>')
elif line[0] == "-":
tokens = line[1:].split(' ')
if len(tokens) == 2:
result[tokens[0]] = tokens[1]
elif len(tokens) == 1:
result[tokens[0]] = True
else:
match = from_pattern.match(line)
if match:
result['from'] = match.group(1)
if 'host_address' in result:
result['host_address'] = '.'.join(result['host_address'].split('.')[-1])
return result
def walk_spool(spooldir='/var/spool/exim/input'):
if not os.path.exists(spooldir):
raise IOError("spool directory missing, specify exim spool directory using --spooldir")
for root, dirs, files in os.walk(spooldir):
for f in files:
if f[-2:] == '-H':
yield root + '/' + f
def split_list(list, n):
return [list[i:i+n] for i in range(0, len(list), n)]
if __name__ == "__main__":
oparser = OptionParser()
oparser.add_option('--user', dest='user', default=None,
help='Filter by sending user (includes all emails associated with an account')
oparser.add_option('--address', dest='address', default=None,
help='Filter by "from" address (this can be a real address or an apparent address)')
oparser.add_option('--sending-host', dest='host', default=None,
help='Filter by sending address (hostname, "helo" name, or ip)')
oparser.add_option('--bounced', dest='bounced', action='store_true', default=False,
help='list all bouncing (includes all emails associated with an account')
oparser.add_option('--remove', dest='remove', action='store_true', default=False,
help='Remove messages from the exim queue')
oparser.add_option('--freeze', dest='freeze', action='store_true', default=False,
help='Freeze messages in the exim queue')
(options, arg) = oparser.parse_args()
if options.bounced:
user = re.compile('mailnull')
address = re.compile('^(?:Mailer-Daemon@.*)?$')
host = None
else:
if options.user:
user = re.compile(options.user)
else:
user = None
if options.address:
address = re.compile(options.address)
else:
address = None
if options.host:
host = re.compile(options.host)
else:
host = None
result = []
result_append = result.append
def handle_results():
if options.remove:
for args in split_list(result, 500):
cmd = ['exim', '-Mrm']
cmd.extend(args)
proc = Popen(cmd)
proc.wait()
elif options.freeze:
for args in split_list(result, 500):
cmd = ['exim', '-Mf']
cmd.extend(args)
proc = Popen(cmd)
proc.wait()
else:
for id in result:
print id
del result[:]
result_found = False
for header_file in walk_spool():
tmp_dict = file_to_msgdict(header_file)
filter_flags = [1, 1, 1] # user, address, host
if user:
for i in ['user', 'ident', 'auth_id']:
if user.match(tmp_dict.get(i, ' ')):
break
else:
filter_flags[0] = 0
if address:
for i in ['address', 'auth_sender', 'from']:
if address.match(tmp_dict.get(i, ' ')):
break
else:
filter_flags[1] = 0
if host:
for i in ['helo_name', 'host_address', 'host_name']:
if host.match(tmp_dict.get(i, ' ')):
break
else:
filter_flags[2] = 0
if sum(filter_flags) == 3:
result_append(tmp_dict['mid'])
result_found = True
if len(result) >= 500:
handle_results();
if not result_found:
print "No Messages Found"
elif options.remove:
for args in split_list(result, 500):
cmd = ['exim', '-Mrm']
cmd.extend(args)
proc = Popen(cmd)
proc.wait()
elif options.freeze:
for args in split_list(result, 500):
cmd = ['exim', '-Mf']
cmd.extend(args)
proc = Popen(cmd)
proc.wait()
else:
for id in result:
print id