Filtrado de correos por IMAP

Desde hace tiempo necesitaba filtrar correos en una cuenta que no contaba con filtros de correo server-side y la mejor opción que encontre es imapfilter, una herramienta que realiza el filtrado de correos por medio de IMAP.

Imapfilter es muy fácil de configurar y es muy flexible, permite utilizar varias cuentas e incluso mover mensajes entre ellas.

Los requerimientos son muy básicos (Lua, PCRE y OpenSSL) y la instalación es sencilla.

La configuración se realiza por medio de un archivo similar a este:

---------------
--  Options  --
---------------

options.timeout = 120
options.subscribe = true

----------------
--  Accounts  --
----------------

-- Connects to "imap1.mail.server", as user "user1" with "secret1" as
-- password.
account1 = IMAP {
    server = 'imap1.mail.server',
    username = 'user1',
    password = 'secret1',
}

-- Another account which connects to the mail server using the SSLv3
-- protocol.
account2 = IMAP {
    server = 'imap2.mail.server',
    username = 'user2',
    password = 'secret2',
    ssl = 'ssl3',
}

-- Get a list of the available mailboxes and folders
mailboxes, folders = account1:list_all()

-- Get a list of the subscribed mailboxes and folders
mailboxes, folders = account1:list_subscribed()

-- Create a mailbox
account1:create_mailbox('Friends')

-- Subscribe a mailbox
account1:subscribe_mailbox('Friends')

-----------------
--  Mailboxes  --
-----------------

-- Get the status of a mailbox
account1.INBOX:check_status()

-- Get all the messages in the mailbox.
results = account1.INBOX:select_all()

-- Get newly arrived, unread messages
results = account1.INBOX:is_new()

-- Get unseen messages with the specified "From" header.
results = account1.INBOX:is_unseen() *
          account1.INBOX:contain_from('[email protected]')

-- Copy messages between mailboxes at the same account.
results:copy_messages(account1.news)

-- Get messages with the specified "From" header but without the
-- specified "Subject" header.
results = account1.INBOX:contain_from('[email protected]') -
          account1.INBOX:contain_subject('security advisory')

-- Copy messages between mailboxes at a different account.
results:copy_messages(account2.security)

-- Get messages with any of the specified headers.
results = account1.INBOX:contain_from('[email protected]') +
          account1.INBOX:contain_from('[email protected]') +
          account1.INBOX:contain_subject('new great products')

-- Delete messages.
results:delete_messages()

-- Get messages with the specified "Sender" header, which are older than
-- 30 days.
results = account1.INBOX:contain_field('sender', '[email protected]') *
          account1.INBOX:is_older(30)

-- Move messages to the "announce" mailbox inside the "lists" folder.
results:move_messages(account1['lists/announce'])

-- Get messages, in the "devel" mailbox inside the "lists" folder, with the
-- specified "Subject" header and a size less than 50000 octets (bytes).
results = account1['lists/devel']:contain_subject('[patch]') *
          account1['lists/devel']:is_smaller(50000)

-- Move messages to the "patch" mailbox.
results:move_messages(account2.patch)

-- Get recent, unseen messages, that have either one of the specified
-- "From" headers, but do not have the specified pattern in the body of
-- the message.
results = ( account1.INBOX:is_recent() *
            account1.INBOX:is_unseen() *
            ( account1.INBOX:contain_from('[email protected]') +
              account1.INBOX:contain_from('[email protected]') ) ) -
          account1.INBOX:match_body('.*all.work.and.no.play.*')

-- Mark messages as important.
results:mark_flagged()

-- Get all messages in two mailboxes residing in the same server.
results = account1.news:select_all() +
          account1.security:select_all()

-- Mark messages as seen.
results:mark_seen()

-- Get recent messages in two mailboxes residing in different servers.
results = account1.INBOX:is_recent() +
          account2.INBOX:is_recent()

-- Flag messages as seen and important.
results:add_flags({ '\\Seen', '\\Flagged' })

-- Get unseen messages.
results = account1.INBOX:is_unseen()

-- From the messages that were unseen, match only those with the specified
-- regular expression in the header.
newresults = results:match_header('^.+MailScanner.*Check: [Ss]pam$')

-- Delete those messages.
newresults:delete_messages()

Si el servidor IMAP permite mantener conexiones en reposo puedes dejar el script corriendo todo el tiempo y en el momento que entre un correo lo filtrará.

Por el momento lo instalé en mi servidor web y estoy filtrando dos cuentas de correo pero se me ocurren muchos usos para esta herramienta.

 

Módulo de Banorte Payworks para Magento

Desarrollando una tienda en línea para un proyecto propio decidí desarrollar el módulo para recibir pagos en Magento por medio de Banorte Payworks, desde mi experiencia, siempre ha sido difícil desarrollar algo para Magento por la poca documentación que existe.

Después de horas de pruebas e investigación pude desarrollar el módulo y adaptarlo para poder configurar el comportamiento en los diferentes escenarios.

Como comenté en posts anteriores mi interés es hacer cada vez más uso de esta plataforma de pagos que a mi consideración es una excelente alternativa a las típicas procesadoras de pagos (Paypal, DineroMail, etc.).

Si alguien está interesado el módulo está a la venta.

Actualización 21/12/12: Hay una nueva versión del módulo que soporta 3D Secure y mensualidades sin intereses.


Si quieres recibir más información sobre este módulo en tu correo, puedes utilizar el siguiente formulario:

[activecampaign form=3]

Módulo de Banorte Payworks para WHMCS

Aprovechando que me decidí a integrar WHMCS e hice el módulo para registro de dominios con dynadot, decidí de una vez implementar el sistema de pagos Banorte Payworks para el procesamiento de tarjetas de crédito de forma transparente (el cliente no sale de mi sitio ni ve el logotipo de Banorte Payworks).

El módulo permite hacer la captura del dinero y reembolsos (pero solo por el monto total, Banorte Payworks no permite reembolsos parciales).

Espero que con esta implementación empiece a hacer uso de la plataforma ya que casi cumplo un año de haberla contratado y realizo menos de 5 transacciones al mes.

Voy a poner el módulo a la venta por si alguien está interesado en implementarlo.

NOTA: Este módulo es para Payworks 1.

Módulo de registro Dynadot para WHMCS

Hace unos días instalé WHMCS para automatizar la creación de cuentas de hosting y dominios, al comprar la licencia me ofrecieron una cuenta reseller de Enom la cual tiene muchos productos pero se tienen que hacer depósitos prepagados de 100 dólares mínimo, se me hace elevado para la cantidad de dominios que registro al mes.

Desde hace años vengo utilizando Dynadot para registrar los dominios que compro y me gusta bastante por la interfaz limpia además de que tengo acceso a precios de mayoreo.

Estuve buscando un módulo de registro Dynadot pr WHMCS pero no encontré por ningún lado, salvo uno en venta pero no estaba seguro de que funcionaría así que ayer en un tiempo libre me puse manos a la obra.

El módulo ya está probado y funciona perfectamente a pesar de las limitaciones de la API de Dynadot, puse el módulo a la venta en $130 MXN ($9.4 USD) para quien esté interesado, el módulo permite registro, renovación y cambio de DNS y me encargaré de hacer actualizaciones conforme liberen nuevas versiones de la API. Pueden comprarlo aquí.