Hierarchical-Model-View-Controller (HMVC) es una variante del MVC que se forma mediante una colección de estos, siendo cada MVC independiente de los otros, y siendo un aspecto importante la reutilización de código, por lo que la localización física de los MVC no es importante. El HMVC es muy efectivo a la hora de testear módulos de la aplicación independientes, y una buena opción para escalar nuestra aplicación.

HMVC EN CODEIGNITER

HMVC es un “plugin” que nos permite pogramar módulos bajo el framework codeigniter.

En un principio, la librería nos permite tener para cada módulo los controladores, modelos, vistas y librerías que necesitemos. Es una librería realmente potente ya que incluso nos permite cargar la salida de una función de un controlador en otro controlador.

Página y archivo de descarga:
http://codeigniter.com/wiki/Modular_Extensions_-_HMVC/

Instalación:

Copiamos todos los archivos (Controller.php, Modules.php y MY_Router.php) en la ruta application/libraries.

Una vez copiados dichos archivos, creamos una carpeta llamada modules dentro de application y en su interior crearemos los módulos necesarios. Cada módulo deberá tener varias carpetas: config, controllers, models, libraries y views.

Lógicamente, dentro de controllers, meteremos los controladores, así como en las respectivas carpetas.

Funcionamiento básico:

Si el nombre y clase del controlador tiene el mismo nombre que la carpeta del módulo, este se llamará automáticamente cuando accedamos sólo especificando el nombre del módulo (ej: http://miaplicacion/modulo ó http://miaplicacion/modulo/funcion). En caso contrario, para acceder a dicho controlador lo haríamos así: http://miaplicacion/modulo/clase/funcion

La carpeta config sólo nos servirá (de momento) para:

  • autoload.php: funcionamiento como el de codeigniter. Nos servirá para cargar automáticamente las librerías, modelos… necesarios para el módulo.
  • routes.php: funcionamiento como el de codeigniter. Nos servirá para hacer la configuración de rutas y redirecciones para dicho módulo.

Cuando llamamos a una librería, modelo o vista, por defecto se busca dentro de la carpeta del módulo y si no se encuentra las busca en application y si tampoco las encuenta busca ya en último lugar en system.

Métodos básicos de funcionamiento:

El funcionamiento de cada módulo es como si fuese una aplicación diferente para cada uno.

Podemos recojer la salida del controlador/vista de otro módulo y guardarla o mostrarla según nos convenga (sólo para la versión php5). Sería como llamar a una vista pasándole como tercer parámetro TRUE.

$retorno = modules::run('modulo/controlador/funcion/', $parametro1, $parametro2, $parametro...);

Podemos cargar también un controlador como si fuese una librería:

$this->load->module('modulo/controlador', $parametro1, $parametro2, $parametro...);
$retorno = $this->controlador->funcion();

Aunque lo carguemos como una librería, el controlador cargado seguirá llamando a sus modelos, vistas y demás como si fuese independiente.

Para modelos, vistas y librerías, el funcionamiento es tal cual a codeigniter y podemos acceder a otros módulos anteponiendo el nombre del módulo al archivo:

$this->load->model('modulo/modelo_model');

En la página de la librería podemos encontrar algunos módulos ya desarrollados como una galería fotográfica, captcha, etc…

Javascript tradicional v/s Jquery.

Aunque la librería más conocida y utilizada hasta hace poco era Prototype, ha surgido una nueva librería llamada jQuery, que incluye muchas de las ideas de Prototype y a las que añade muchas otras nuevas ideas para crear una librería espectacular: muy pequeña, rápida, ligera y con cientos de utilidades.

Las aplicaciones web cada vez son más complejas, ya que incorporan nuevos efectosvisuales e interacciones dinámicas (Ajax, auto-completar, drag&drop, elementos que aparecen/desaparecen, animaciones, etc.).

Al mismo tiempo, el desarrollo de las aplicaciones web avanzadas es cada vez más complicado, ya que deben funcionar correctamente en al menos 5 navegadores diferentes (Internet Explorer 6 y 7, Firefox, Opera y Safari) y el tiempo de desarrollo se reduce por la necesidad continua de incluir novedades en la aplicación.

Por todo ello, es imprescindible utilizar librerías JavaScript que simplifiquen el desarrollo y permitan crear aplicaciones compatibles con todos los navegadores.

¿Qué es jQuery?

Según sus creadores, jQuery es una “librería JavaScript muy rápida y muy ligera que simplifica el desarrollo de la parte de cliente de las aplicaciones web”. En otras palabras, jQuery incluye muchas utilidades para crear fácilmente las páginas web de las aplicaciones dinámicas complejas.

Conceptos básicos

Para utilizar jQuery, solamente es necesario descargar la librería y enlazar en nuestras páginas el único archivo JavaScript que la forma:


La librería se puede descargar en dos versiones: la versión descomprimida ocupa 61 KB y es la mejor opción para desarrollar aplicaciones. La versión comprimida ocupa sólo 20 KB y es la opción ideal en el servidor de producción, para minimizar el tiempo de carga de la aplicación.

Una de las instrucciones más utilizadas en las aplicaciones JavaScript es la siguiente:

 window.onload = function() { ... }

La instrucción anterior permite ejecutar el código JavaScript una vez que la página se ha cargado por completo. Se trata de una instrucción imprescindible en las aplicaciones web complejas, porque cualquier modificación en la página o la selección de cualquier elemento necesita que el árbol DOM de la página se haya construido por completo, y por tanto, que esté disponible el código HTML de la página entera. jQuery dispone de una instrucción muy similar equivalente a la anterior:

$(document).ready( function() { ... } );

La gran ventaja de la función de jQuery, es que la página se puede manipular en cuanto se ha cargado su código HTML (y por tanto, se ha construido el árbol DOM de la página) mientras que la función de JavaScript espera a que se carguen todos los elementos de la página, incluyendo todas las imágenes. De esta forma, las aplicaciones realizadas con jQuery pueden responder de forma mucho más rápida que las aplicaciones JavaScript tradicionales.

Por otra parte, la función

getElementById()

es posiblemente la más utilizada al desarrollar aplicaciones web, ya que permite seleccionar un elemento a partir de su atributo “id”. Además, existen otras dos funciones relacionadas:

getElementsByTagName()

y

getElementsByName()

. jQuery incluye la función

$()

como una alternativa más rápida y completa para seleccionar cualquier elemento de la página:

Con JavaScript

 // Seleccionar un elemento
document.getElementById("miParrafo");
// Seleccionar todos los enlaces
document.getElementsByTagName("a");
// Seleccionar todo lo anterior
?
// Seleccionar mediante la clase CSS
?

Con jQuery

 // Seleccionar un elemento
$("#miParrafo");
// Seleccionar todos los enlaces
$("a");
// Seleccionar todo lo anterior
$("#miParrafo, a")
// Seleccionar mediante la clase CSS
$(".miClase")

Selectores avanzados

Uno de los componentes más impresionantes de jQuery es el de sus selectores, que permiten olvidarse de los aburridos

document.getElementById()

y del código JavaScript complejo. jQuery utiliza lo mejor de

CSS  1, CSS 2, CSS 3

y XPath para seleccionar de forma sencilla cualquier elemento de la página sin necesidad de saturar el código XHTML con atributos “id”. Ejemplos:

// Seleccionar todos los párrafos de la página que tengan al menos un enlace
$("p[a]")
// Seleccionar todos los "div" que no estén ocultos
$("div:visible")
// Seleccionar todos los radio buttons que han sido seleccionados
$("input[@type=radio][@checked]")
// Seleccionar varios elementos mediante sus "id" y "class" (devuelve un array)
$("p.importante, div#menu, span#introduccion p.especial a")

Además, jQuery soporta muchos de los selectores que define CSS 3, algo que los navegadores actuales sólo pueden soñar con tener algún día, como

:nth-child(n)

,

:empty

,

:not,  :disabled

. Para los programadores más acostumbrados a trabajar con XML, jQuery también permite utilizar XPath para seleccionar elementos, como por ejemplo:

 // Seleccionar todos los párrafos de la página
$("/html/body//p");
// Seleccionar todos los enlaces cuyo atributo "rel" valga "nofollow"
$("//a[@ref='nofollow']");

jQuery es tan avanzado que incluso añade sus propios selectores que no existen ni en CSS ni en XPath, pero que facilitan mucho el desarrollo de las aplicaciones:

 // Selecciona todos los elementos pares de una lista (":odd" selecciona los impares)
$("ul#menu li:even")
// Selecciona los 4 primeros párrafos de la página
$("p:lt(4) ")
// Selecciona todos los enlaces que contengan el texto "pincha aquí"
$("a:contains('pincha aquí')")

jQuery es tan avanzado que incluso añade sus propios selectores que no existen ni en CSS ni en XPath, pero que facilitan mucho el desarrollo de las aplicaciones:

 // Selecciona todos los elementos pares de una lista (":odd" selecciona los impares)
$("ul#menu li:even")
// Selecciona los 4 primeros párrafos de la página
$("p:lt(4) ")
// Selecciona todos los enlaces que contengan el texto "pincha aquí"
$("a:contains('pincha aquí')")

Eventos

Además del evento

ready()

visto anteriormente, jQuery dispone de varias funciones relacionadas con la gestión de los eventos. El método

bind()

, por ejemplo, permite asociar un número ilimitado de eventos a un mismo elemento:

// Al pinchar sobre un párrafo de la página, se muestra un alert() con su contenido
$("p").bind("click", function() {
alert( $(this).text() );
});

El modelo de eventos de jQuery es muy completo, ya que cada evento dispone de dos posibilidades: si no se pasa ninguna función, se ejecuta el evento del elemento; si se pasa una función, se asocia esta función al evento del elemento:

// Ejecuta el evento "onclick" en todos los párrafos de la página
$("p").click();
// Asocia una función al evento "onclick" de todos los párrafos de la página
$("p").click(function() {
alert( $(this).text() );
});

jQuery dispone de tantas funciones como eventos estándar de JavaScript. El nombre de cada función es el mismo que el del evento, sin el habitual prefijo “on”:

focus()

,

blur()

,

keyup()

,

mouseover()

,

mouseup()

,

resize()

,

submit()

, etc.

Además, jQuery añade un evento que no existe en JavaScript y que es realmente útil para muchas aplicaciones:

 toggle()

. A este método se le pasan dos funciones, cuya ejecución se alterna en función de las veces que se pincha sobre el elemento.

La primera vez que se pincha sobre el elemento (y todas las veces impares), se ejecuta la primera función y la segunda vez que se pincha el elemento (y todas las veces pares) se ejecuta la segunda función:

$("p").toggle(function(){
alert("Me acabas de activar");
},function(){
alert("Me acabas de desactivar");
});

Interacciones Ajax

Ahora que la mayoría de aplicaciones web deben incorporar interacciones creadas con Ajax, jQuery permite incluirlas sin ningún tipo de dificultad. Los siguientes ejemplos muestran lo sencillo que es realizar algunas interacciones comunes en Ajax:

// Cargar el contenido de una página HTML en un elemento
$("div#noticias").load("noticias.html");
// Descargar un script desde el servidor y ejecutarlo
$.getScript("/ruta/hasta/miScript.js");
// Petición GET al servidor con parámetros y función de respuesta
// La petición POST es idéntica, salvo que se cambia $.get por $.post
$.get("/ruta/hasta/el/scriptDelServidor.php",
{ idProducto: "AX00342", cantidad: "3" },
function(data){
alert("Se ha añadido al carrito: " + data);
}
);

Además, jQuery incluye muchas otras funciones para construir peticiones Ajax complejas y para notificar al usuario el inicio/ejecución/finalización de las peticiones Ajax.

Efectos visuales

Todas las aplicaciones web modernas incorporan pequeños efectos visuales y animaciones que, si se utilizan de forma adecuada, mejoran la interacción con la aplicación y su usabilidad. jQuery incluye de serie los efectos visuales más utilizados por los diseñadores, pudiendo controlar mediante sus opciones la duración de cada efecto:

$("p").hide();        // Ocultar un elemento
$("p").show();        // Mostrar un elemento
$("p").toggle();      // Si estaba oculto, mostrarlo; si era visible, ocultarlo
$("p").show("slow");  // Mostrar el elemento con una animación muy suave
$("p").slideToggle("fast"); // Desplegar/ocultar el elemento con una animación muy rápida
$("p").fadeOut();     // El elemento desaparece con un fundido muy suave

Otras utilidades

jQuery incluye muchas otras funciones para facilitar el desarrollo de las aplicaciones web, entre otras:

// Obtiene el valor de la propiedad "color" de CSS del primer párrafo de la página
$("p").css("color");
// Establece el valor de la propiedad "color" de CSS
$("p").css("color","red");
// Establece varias propiedades CSS de un elemento
$("p").css({ color: "red", background: "blue", font-weight: "bold" });
// Oculta todos los elementos de un formulario
$(miFormulario.elements).hide();
// Devuelve "true" si el navegador es alguna versión de Internet Explorer
$.browser.msie
// Devuelve "true" si el navegador es alguna versión de Safari
$.browser.safari
// Obtiene o establece el valor del "innerHTML" del elemento
$("#contenidos").html();
$("#contenidos").html("

Contenidos

Cargando…

“);
// Añade la clase CSS a todos los elementos o la quita si ya la tenían establecida
$(“p”).toggleClass(“seleccionado”);

Este artículo sólo muestra una mínima parte de las posibilidades de la excelente librería jQuery. Gracias a jQuery, puedes hacer mucho más y mucho mejor pero escribiendo menos código JavaScript, además de tener la garantía absoluta de que tus aplicaciones funcionan igual de bien en cualquier navegador.

Lecturas de referencia

La mayoría de la información y ejemplos de este artículo han sido extraídos de la excelente documentación en inglés de jQuery. Una buena forma de estudiar la API completa de jQuery es acceder a la guía visual.

Fuente: http://www.maestrosdelweb.com/editorial/javascript-facil-y-rapido-con-jquery/

July 7th, 2010

Historia del bluetooth.

No Comments, Programación, by Octavio.

En 1994 la empresa sueca Ericsson inició un estudio para investigar la viabilidad de una interfaz vía radio, de bajos costo y consumo, para la interconexión entre teléfonos móviles y otros accesorios con el objetivo de eliminar cables entre aparatos. El estudio partía de un largo proyecto que investigaba sobre unos multicomunicadores conectados a una red celular, hasta que se llegó a un enlace de radio de corto alcance llamado MC link. Con el avance del proyecto quedó claro que este tipo de enlace podía ser utilizado en un gran número de aplicaciones, pues poseía como ventaja principal el hecho de basarse en un chip de radio relativamente económico.

A principios de 1997, otros fabricantes de equipos portátiles despertaron su interés por el avance del proyecto MC link y para que el sistema tuviera éxito, un gran número de equipos debería estar formado con esta tecnología. Ello fue lo que originó a principios de 1998, la creación de un Grupo de Especial Interés en Bluetooth (SIG), formado por cinco promotores y que fueron Ericsson, Nokia, IBM, Toshiba e Intel. La idea era lograr un conjunto adecuado de áreas de negocio, ya que se hallaban en el grupo dos líderes del mercado de las telecomunicaciones, dos del mercado de las PCs portátiles y un líder de la fabricación de chips.

En la actualidad el SIG cuenta con miembros tales como Motorola, 3Com, Lucent y Microsoft, el respaldo de 1900 empresas de tecnología y 2000 empleados (delegados en el Congreso convocado por el SIG) de otras tantas empresas que investigan productos y servicios con aplicaciones Bluetooth.

June 29th, 2010

10 Razones para usar ajax

15 Comments, Programación, by Octavio.

¿Porqué yo debería considerar usar Ajax?

1. Basado en los estándares abiertos
2. Usabilidad
3. Válido en cualquier plataforma y navegador
4. Beneficia las aplicaciones web
5. No es dificil su utilización
6. Compatible con Flash
7. Adoptado por los “gordos” de la tecnología web
8. Web 2.0
9. Es independiente del tipo de tecnología de servidor que se utilice
10. Mejora la estetica de la web

1. Basado en los estándares abiertos

Ajax esta formado por las tecnologias Javascript, html, xml, css, y XML HTTP Request Object, siendo este último el unico que “no es” estandar pero es soportado por los navegadores mas utilizados de internet como son los basados en mozilla, internet explorer, safari y opera.

2. Usabilidad

Permite a las páginas hacer una pequeña petición de datos al servidor y recibirla sin necesidad de cargarla página entera. El incremento de las actualizaciones “on the fly” elimina el tener que refrescar el navegador, algo bastante apreciado a la hora de operar en una aplicación web.

3. Válido en cualquier plataforma y navegador

Internet explorer, los basados en mozilla y firefox son los que se llevan la palma en el mercado de internet y además son los navegadores en los que es mas fácil programar aplicaciones Web AJAX, pero ahora es posible construir aplicaciones web basadas en AJAX para que funcionen en los navegadores mas modernos. Es una de las razonas mas importantes por las que AJAX se ha vuelto tan popular. Aunque si bien muchos desarrolladores sabían que era posible usarse años atrás con Internet Explorer, no era viable realizarse. Ahora ya es posible su avance gracias a Mozilla y Firefox.

4. Beneficia las aplicaciones web

AJAX es la cara del presente en las aplicaciones web – las aplicaciones web conllevan ciertos beneficios sobre las aplicaciones sobre escritorio (apliaciones que dependan de un sistema operativo, librerias, lo que entendemos por programas compilados). Esto incluyo un menor coste de creación, facilidad de soporte y mantenimiento, menores tiempos a la hora de desarrollarlas, y sin necesidad de instalaciones; éstas son algunas de los beneficios que han llevado a las empresas y usuarios el adoptar aplicaciones web desde mediados de los 90. AJAX solo ayudará a las aplicaciones web a mejorar y conseguir un mejor resultado de cara al usuario final.

5. No es dificil su utilización

Porque AJAX esta basada en los estándares que han sido utilizados durante muchos años, muchos desarrolladores web han tenido que utilizar las tecnologías que las aplicaciones AJAX requieren. Ésto significa que no es un gran esfuerzo el aprendizaje de los desarrolladores el pasar de un simple código HTML y aplicaciones web a una potente apliación AJAX. Tambié significa que los desarrolladores puedes actualizar poco a poco las interfaces de usuario hacia unas interfaces con AJAX; no necesita una re-escritura de la aplicación entera, se puede hacer incrementalmente.

6. Compatible con Flash

Muchos desarrolladores tienen serias dudas sobre usar Flash o AJAX. Definitivamente hay ventajas y desventajas en ambas tecnologías según la situación que se de pero también hay muchas posibilidades y muy buenas para que amabas funcionen en conjunto.

7. Adoptado por los “gordos” de la tecnología web

La difusión de AJAX en los líderes de la industria de internet prueba que el mercado acepta y valida el uso de esta tecnología. Todo el mundo esta migrando hacia AJAX incluyendo Google, Yahoo, Amazon, Microsoft (por nombrar unas pocos). Google Maps fue lo que captó la atenció de los desarrolladores web. Cuando empezaron a investigar como google era capaz de llevar esa increible herramienta dentro de un navegador sin necesidad de ningún tipo de plug-in, encontraron que AJAX estaba detrás del tema.

8. Web 2.0

El movimiento Web 2.0 está cada vez mas en auje y dando quebraderos de cabeza de muchos programadores, usuarios, y vendedores. Esto esta ayudando la adopción de AJAX. Las interfaces de AJAX son un componente clave de muchas de las aplicaciones Web 2.0, como puede ser BackPack (un organizador de disco online en entorno Web) y Google Maps. Afortunadamente gracias bombo que se le esta dando, acelerará la adopción de AJAX y la los beneficios de su uso lo mantendrá en escena. Una de las claves principales de Web 2.0 es el usar la red como plataforma para el desarrollo de aplicaciones, en vez de simples páginas web. Siendo importante la iteracción de los usuarios con la apliación en sí.

9. Es independiente del tipo de tecnología de servidor que se utilice

Así como AJAX funciona en cualquier navegador, es perfectamente compatible con cualquier tipo de servidor estándar y lenguage de programación Web. PHP, ASP. ASP.Net, Perl, JSP, Cold Fusion. El ser completamente compatible el desarrollo en éstas tecnologías ha ayudado a AJAX a que vaya cada vez mas en auge.

10. Mejora la estetica de la web

Con AJAX se puede interactuar la imaginación del desarrollador con la usabilidad de una apliación web de forma que se pueda realizar una aplicación que si no estuviera dentro de un navegador, podría pasar por una aplicacion normal de escrotorio.

fuente: Developer.com (en inglés)

Ext JS y frameworks JavaScript

Ext js.

ExtJS es una biblioteca de JavaScript para el desarrollo de aplicaciones web interactivas usando tecnologías como AJAX, DHTML y DOM.

Originalmente construida como una extensión de la biblioteca YUI, en la actualidad puede usarse como extensión para las biblioteca jQuery y Prototype. Desde la versión 1.1 puede ejecutarse como una aplicación independiente.

Funcionalidades

Dispone de un conjunto de componentes (widgets) para incluir dentro de una aplicación web, como:

  • Cuadros y áreas de texto.
  • Campos para fechas.
  • Campos numéricos.
  • Combos.
  • Radiobuttons y checkboxs.
  • Editor HTML.
  • Elementos de datos (con modos de sólo lectura, datos ordenables, columnas que se pueden bloquear y arrastrar, etc.).
  • Árbol de datos.
  • Pestañas.
  • Barra de herramientas.
  • Menús al estilo de Windows.
  • Paneles divisibles en secciones.
  • Sliders.

Varios de estos componentes están capacitados para comunicarse con el servidor usando AJAX. También contiene numerosas funcionalidades que permiten añadir interactividad a las páginas HTML, como:

  • Cuadros de diálogo.
  • quicktips para mostrar mensajes de validación e información sobre campos individuales.

Ejemplos

Facebook acelera PHP con HipHop

Publicado el

Es una red social, es el hogar de farmville, es la galería de fotos con más actividad, quisiera ser twitter algunas veces que rediseña… Facebook es ese gran gigante que corre en PHP y eso tiene que ser un dolor de pelotas para mucha gente que está desarrollando la plataforma. Cuando piensas en un proyecto como Facebook, el tema de escalabilidad tienen que tomarlo muy en serio, su desarrollo de consultas a bases de datos y la forma como generan un cache de tanto contenido que por su mismo dinamismo debe actualizarse constantemente para todos.

El Hip Hop para PHP de Facebook

Facebook Hiphop LogoLa semana pasada arrancaron los rumores de lo que algunos llamaron Hyper PHP y hoy fue confirmado como el HipHop for PHP en el blog de facebook. Es una propuesta de Haiping Zhao quien junto a un pequeño equipo han destinado 2 años para optimizar la plataforma de PHP. El aporte se viene a sumar a los esfuerzos que Facebook ha realizado para la comunidad Open Source y que están disponibles a través de GitHub.

Aunque esperábamos un compilador nuevo de PHP, se trata más bien de un transformador de código fuente. Eso significa que toma el PHP, lo transforma hacia C++ y lo compila con g++. Y el resultado acelera la ejecución del código disminuyendo los recursos del servidor en un 50%.

Para explicarlo más fácil nos hicieron una práctica grafiquita:

Facebook Hiphop Process

Si te interesa probar más de Hip Hop, los links más relevantes:

Y ahora nos faltará estar pendiente de varios eventos donde irán comentando más del desarrollo. Me interesará mucho ver cuando otros proyectos grandes hechos en PHP se pongan a jugar con esta implementación. Aló vBulletin, a ver si con la versión 4.0 prueban estas cosas en lugar de “innovar con una plataforma de blogs”.

Facebook para PHP es lo que Google para Python

Una de las cosas que más me gusta de como las empresas se casan con una tecnología y le destinan recursos humanos de alto talento a estas plataformas es como las plataformas evolucionan en proyectos funcionales y de gran movimiento. Facebook se viene a empalmar muy fuertemente con PHP con este movimiento, cosa que ya hemos visto en otras empresas del medio, como es el caso de Google y su pasión por Python (tienen a Guido van Rossum, su fundador, trabajando para ellos) y también están trabajando en el Unladen Swallow que ayudará a reconstruir el compilador de Python. Jquery es otra de las tecnologías que Google apoya incondicionalmente y que le ha dado una fuerza importante al framework que nos trajo la fuerza del ajax al mundo web 2.0.

Por cierto que me ha tocado trabajar en recientes meses con excelentes desarrolladores cuya amistad con Facebook es inexistente muchas veces. O bien lo odian o simplemente no le encuentran utilidad (los geeks no son tan sociales supongo) cuando no se puede negar que su ecosistema de aplicaciones y lo que están desarrollando los empalma cada día más a las comunidades desarrolladoras. Me gustaría verlos trabajando con otras cosas de esta empresa aparte del facebook connect (aunque otros también quieren boicotear esta utilidad). Me pregunto si ayudaría un espacio para desarrolladores interno porque todo lo manejan siempre en wikis independientes, listas de correo de google groups o github.

enlace http://www.maestrosdelweb.com/editorial/facebook-hiphop-php/

Según Wikipedia: jQuery es un nuevo tipo de bibliotecas de Javascript que permite simplificar la manera de interactuar con los documentos HTML, permitiendo manejar eventos, desarrollar animaciones y agregar interacción con la tecnología AJAX a nuestras páginas web. jQuery esta diseñado para cambiar la forma de escribir código JavaScript.

En Sastgroup/www.kollermedia.at encontré esta excelente lista de 240 plugins para JQuery.

Validación de formularios

jQuery Validation.
Auto Help.
Simple jQuery form validation.
jQuery XAV – form validations.
jQuery AlphaNumeric.
Masked Input.
TypeWatch Plugin.
Text limiter for form fields.
Ajax Username Check with jQuery.

Subida de archivos

Ajax File Upload.
jQUploader.
Multiple File Upload plugin.
jQuery File Style.
Styling an input type file.
Progress Bar Plugin.

Formularios – cajas de selección

jQuery Combobox.
jQuery controlled dependent (or Cascadign) Select List.
Multiple Selects.
Select box manipulation.
Select Combo Plugin.
jQuery – LinkedSelect
Auto-populate multiple select boxes.
Choose Plugin (Select Replacement).

Formularios básicos, campos de entrada, chechboxes y otros

jQuery Form Plugin.
jQuery-Form.
jLook Nice Forms.
jNice.
Ping Plugin.
Toggle Form Text.
ToggleVal.
jQuery Field Plugin.
jQuery Form’n Field plugin.
jQuery Checkbox manipulation.
jTagging.
jQuery labelcheck.
Overlabel.
3 state radio buttons.
ShiftCheckbox jQuery Plugin.
Watermark Input.
jQuery Checkbox (checkboxes with imags).
jQuery SpinButton Control.
jQuery Ajax Form Builder.
jQuery Focus Fields.
jQuery Time Entry.

Hora, fecha y selectores de color

jQuery UI Datepicker.
jQuery date picker plugin.
jQuery Time Picker.
Time Picker.
ClickPick.
TimePicker.
Farbtastic jQuery Color Picker Plugin.
Color Picker by intelliance.fr.

Complementos para votar (Rating plugins)

jQuery Star Rating Plugin.
jQuery Star Rater.
Content rater with asp.net, ajax and jQuery.
Half-Star Rating Plugin.

Complementos de búsqueda

jQuery Suggest.
jQuery Autocomplete.
jQuery Autocomplete Mod.
jQuery Autocomplete by AjaxDaddy.
jQuery Autocomplete Plugin with HTML formatting.
jQuery Autocompleter.
AutoCompleter (Tutorial with PHP&MySQL).
quick Search jQuery Plugin.

EdiInline Edit & Editors

jTagEditor.
WYMeditor.
jQuery jFrame.
Jeditable – edit in place plugin for jQuery.
jQuery editable.
jQuery Disable Text Select Plugin.
Edit in Place with Ajax using jQuery.
jQuery Plugin – Another In-Place Editor.
TableEditor.
tEditable – in place table editing for jQuery.

Audio, Video, Flash, SVG, etc

jMedia – accessible multi-media embedding.
JBEdit – Ajax online Video Editor.
jQuery MP3 Plugin.
jQuery Media Plugin.
jQuery Flash Plugin.
Embed QuickTime.
SVG Integration.

Fotos/Imagenes/Galerias

ThickBox.
jQuery lightBox plugin.
jQuery Image Strip.
jQuery slideViewer.
jQuery jqGalScroll 2.0.
jQuery – jqGalViewII.
jQuery – jqGalViewIII.
jQuery Photo Slider.
jQuery Thumbs – easily create thumbnails.
jQuery jQIR Image Replacement.
jCarousel Lite.
jQPanView.
jCarousel.
Interface Imagebox.
Image Gallery using jQuery, Interface & Reflactions.
simple jQuery Gallery.
jQuery Gallery Module.
EO Gallery.
jQuery ScrollShow.
jQuery Cycle Plugin.
jQuery Flickr.
jQuery Lazy Load Images Plugin.
Zoomi – Zoomable Thumbnails.
jQuery Crop – crop any image on the fly.
Image Reflection.

Google Map

jQuery Plugin googlemaps.
jMaps jQuery Maps Framework.
jQmaps.
jQuery & Google Maps.
jQuery Maps Interface forr Google and Yahoo maps.
jQuery J Maps – by Tane Piper.

Juegos

Tetris with jQuery.
jQuery Chess.
Mad Libs Word Game.
jQuery Puzzle.
jQuery Solar System (not a game but awesome jQuery Stuff).

Tablas, cuadrículas etc.

UI/Tablesorter.
jQuery ingrid.
jQuery Grid Plugin.
Table Filter – awesome!.
TableEditor.
jQuery Tree Tables.
Expandable “Detail” Table Rows.
Sortable Table ColdFusion Costum Tag with jQuery UI.
jQuery Bubble.
TableSorter.
Scrollable HTML Table.
jQuery column Manager Plugin.
jQuery tableHover Plugin.
jQuery columnHover Plugin.
jQuery Grid.
TableSorter plugin for jQuery.
tEditable – in place table editing for jQuery.
jQuery charToTable Plugin.
jQuery Grid Column Sizing.
jQuery Grid Row Sizing.

Graficos, presentaciones etc.

jQuery Wizard Plugin .
jQuery Chart Plugin.
Bar Chart.

Bordes, esquinas, fondos

jQuery Corner.
jQuery Curvy Corner.
Nifty jQuery Corner.
Transparent Corners.
jQuery Corner Gallery.
Gradient Plugin.

Textos y enlaces

jQuery Spoiler plugin.
Text Highlighting.
Disable Text Select Plugin.
jQuery Newsticker.
Auto line-height Plugin.
Textgrad – a text gradient plugin

Introducción.

Acerca de Sendmail.

Es el más popular agente de transporte de correo (MTA o Mail Transport Agent), responsable quizá de poco más del 70% del correo electrónico del mundo. Aunque por largo tiempo se le ha criticado por muchos incidentes de de seguridad, lo cierto es que éstos siempre han sido resueltos en pocas horas.

URL: http://www.sendmail.org/.

Acerca de Dovecot.

Dovecot es un servidor de POP3 e IMAP de fuente abierta que funciona en Linux y sistemas basados sobre Unix™ y diseñado con la seguridad como principal objetivo. Dovecot puede utilizar tanto el formato mbox como maildir y es compatible con las implementaciones de los servidores UW-IMAP y Courier IMAP.

URL: http://dovecot.procontrol.fi/.

Acerca de SASL y Cyrus SASL.

SASL (Simple Authentication and Security Layer) es un estructura para la seguridad de datos en protocolos de Internet. Desempareja mecanismos de la autenticación desde protocolos de aplicaciones, permitiendo, en teoría, cualquier mecanismo de autenticación soportado por SASL para ser utilizado en cualquier protocolo de aplicación que capaz de utilizar SASL. Actualmente SASL es un protocolo de la IETF (Internet Engineering Task Force) que ha sido propuesto como estándar. Está especificado en el RFC 2222 creado por John Meyers en la Universidad Carnegie Mellon.

Cyrus SASL es una implementación de SASL que puede ser utilizada del lado del servidor o del lado del cliente y que incluye como principales mecanismos de autenticación soportados a ANONYMOUS, CRAM-MD5, DIGEST-MD5, GSSAPI y PLAIN. El código fuente incluye también soporte para los mecanismos LOGIN, SRP, NTLM, OPT y KERBEROS_V4.

URL: http://asg.web.cmu.edu/sasl/sasl-library.html.

Protocolos utilizados.

SMTP (Simple Mail Transfer Protocol).

Es un protocolo estándar de Internet del Nivel de Aplicación utilizado para la transmisión de correo electrónico a través de una conexión TCP/IP. Este es de hecho el único protocolo utilizado para la transmisión de correo electrónico a través de Internet. Es un protocolo basado sobre texto y relativamente simple donde se especifican uno más destinatarios en un mensaje que es transferido. A lo largo de los años han sido muchas las personas que han editado o contribuido a las especificaciones de SMTP, entre las cuales están Jon Postel, Eric Allman, Dave Crocker, Ned Freed, Randall Gellens, John Klensin y Keith Moore.

Para determinar el servidor SMTP para un dominio dado, se utilizan los registros MX (Mail Exchanger) en la Zona de Autoridad correspondiente al ese mismo dominio contestado por un Servidor DNS. Después de establecerse una conexión entre el remitente (el cliente) y el destinatario (el servidor), se inicia una sesión SMTP, ejemplificada a continuación.

Cliente: $ telnet 127.0.0.1 25
Servidor: Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
220 nombre.dominio ESMTP Sendmail 8.13.1/8.13.1; Sat, 18 Mar 2006 16:02:27 -0600
Cliente: HELO localhost.localdomain
Servidor: 250 nombre.dominio Hello localhost.localdomain [127.0.0.1], pleased to meet you
Cliente: MAIL FROM:<fulano@localhost.localdomain>
Servidor: 250 2.1.0 <fulano@localhost.localdomain>... Sender ok
Cliente: RCPT TO:<root@localhost.localdomain>
Servidor: 250 2.1.5 <root@localhost.localdomain>... Recipient ok
Cliente: DATA
Servidor: 354 Enter mail, end with "." on a line by itself
Cliente: Subject: Mensaje de prueba
From: fulano@localhost.localdomain
To: root@localhost.localdomain

Hola. Este es un mensaje de prueba.
Adios.
.

Servidor: 250 2.0.0 k2IM2RjA003987 Message accepted for delivery
Cliente: QUIT
Servidor: 221 2.0.0 nombre.dominio closing connection
Servidor: Connection closed by foreign host.

La descripción completa del protocolo original STMP está definido en el RFC 821, aunque el protocolo utilizado hoy en día, también conocido como ESMTP (Extended Simple Mail Transfer Protocol), está definido en el RFC 2821. SMTP trabaja sobre TCP en el puerto 25.

POP3 (Post Office Protocol version 3).

Es un protocolo estándar de Internet del Nivel de Aplicación que recupera el correo electrónico desde un servidor remoto a través de una conexión TCP/IP desde un cliente local. El diseño de POP3 y sus predecesores es permitir a los usuarios recuperar el correo electrónico al estar conectados hacia una red y manipular los mensajes recuperados sin necesidad de permanecer conectados. A pesar de que muchos clientes de correo electrónico incluyen soporte para dejar el correo en el servidor, todos los clientes de POP3 recuperan todos los mensajes y los almacenan como mensajes nuevos en la computadora o anfitrión utilizado por el usuario, eliminan los mensajes en el servidor y terminan la conexión.

Después de establecerse una conexión entre el cliente y el servidor, se inicia una sesión POP3, ejemplificada a continuación.

Cliente: $ telnet 127.0.0.1 110
Servidor: Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
+OK dovecot ready.
Cliente: USER fulano
Servidor: +OK
Cliente: PASS clave de accceso
Servidor: +OK Logged in.
Cliente: STAT
Servidor: +OK 1 728
Cliente: LIST
Servidor: +OK 1 messages:
1 728
.
Cliente: RETR 1
Servidor: +OK 728 octets
Return-Path: <fulano@localhost.localdomain>
Received: from localhost.localdomain (localhost.localdomain [192.168.1.254])
by localhost.localdomain (8.13.1/8.13.1) with SMTP id k2IM2RjA003987
for <root@localhost.localdomain>; Sat, 18 Mar 2006 16:03:21 -0600
Date: Sat, 18 Mar 2006 16:02:27 -0600
Message-Id: <200603182203.k2IM2RjA003987@localhost.localdomain>
Subject: Mensaje de prueba
From: fulano@localhost.localdomain
To: root@localhost.localdomain
Status: O
Content-Length: 43
Lines: 2
X-UID: 202
X-Keywords:

Hola. Este es un mensaje de prueba.
Adios.
.

Cliente: QUIT
Servidor: +OK Logging out.
Connection closed by foreign host.

POP3 está definido en el RFC 1939. POP3 trabaja sobre TCP en el puerto 110.

IMAP (Internet Message Access Protocol).

Es un protocolo estándar de Internet del Nivel de Aplicación utilizado para acceder hacia el correo electrónico en un servidor remoto a través de una conexión TCP/IP desde un cliente local.

La versión más reciente de IMAP es la 4, revisión 1, y está definida en el RFC 3501. IMAP trabaja sobre TCP en el puerto 143.

Fue diseñado por Mark Crispin en 1986 como una alternativa más moderna que cubriera las deficiencias de POP3. Las características más importantes de IMAP incluyen:

Soporte para los modos de operación conectado (connected) y desconectado (disconnected), permitiendo a los clientes de correo electrónico permanezcan conectados el tiempo que su interfaz permanezca activa, descargando los mensajes conforme se necesite.
A diferencia de POP3, permite accesos simultáneos desde múltiples clientes y proporciona los mecanismos necesarios para éstos para que se detecten los cambios hechos por otro cliente de correo electrónico concurrentemente conectado en el mismo buzón de correo.
Permite a los clientes obtener individualmente cualquier parte MIME (acrónimo de Multi-Purpose Internet Mail Extensions o Extensiones de correo de Internet de propósitos múltiples), así como también obtener porciones de las partes individuales o bien los mensajes completos.
A través de banderas definidas en el protocolo, vigilar la información de estado de los mensajes de correo electrónico que se mantengan en el servidor. Por ejemplo si el estado del mensaje es leído, no leído, respondido o eliminado.
Incluye soporte para soporte para múltiples buzones de correo electrónico que permite crear, renombrar o eliminar mensajes de correo electrónico presentados en el servidor dentro de carpetas, y mover éstos mensajes entre distintas cuentas de correo electrónico. Esta característica también permite al servidor proporcionar acceso hacia los carpetas públicas y compartidas.
Incluye soporte para realizar búsquedas del lado del servidor a través de mecanismos que permiten obtener resultados de acuerdo a varios criterios, permitiendo evitar que los clientes de correo electrónico tengan que descargar todos los mensajes desde el servidor.
Las especificaciones del protocolo IMAP definen un mecanismo explícito mediante el cual puede ser mejorada su funcionalidad a través de extensiones. Un ejemplo es la extensión IMAP IDLE, la cual permite sincronizar ente el servidor y el cliente a través de avisos.

Después de establecerse una conexión entre el cliente y el servidor, se inicia una sesión IMAP, ejemplificada a continuación.

Cliente: $ telnet 127.0.0.1 143
Servidor: Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
* OK dovecot ready.
+OK dovecot ready.
Cliente: x LOGIN fulano clave de acceso
Servidor: x OK Logged in.
Cliente: x SELECT inbox
Servidor: * FLAGS (\Answered \Flagged \Deleted \Seen \Draft)
* OK [PERMANENTFLAGS (\Answered \Flagged \Deleted \Seen \Draft \*)] Flags permitted.
* 1 EXISTS
* 0 RECENT
* OK [UNSEEN 1] First unseen.
* OK [UIDVALIDITY 1100569382] UIDs valid
* OK [UIDNEXT 203] Predicted next UID
x OK [READ-WRITE] Select completed.
Cliente: x FETCH 1 (flags body[header.fields (subject)])
Servidor: * 1 FETCH (FLAGS (\Seen) BODY[HEADER.FIELDS (SUBJECT)] {30}
Subject: Mensaje de prueba

)
x OK Fetch completed.
.

Cliente: x FETCH 1 (body[text])
Servidor: * 1 FETCH (BODY[TEXT] {45}
Hola. Este es un mensaje de prueba.
Adios.
)
x OK Fetch completed.
Cliente: x LOGOUT
Servidor: * BYE Logging out
x OK Logout completed.
Connection closed by foreign host.

Programática requerida.

sendmail make
sendmail-cf cyrus-sasl
dovecot (o bien imap) cyrus-sasl-md5
m4 cyrus-sasl-plain

Instalación a través de yum.

Si se utiliza de CentOS 4 o White Box Enterprise Linux 4, el paquete imap es reemplazado por el paquete dovecot. De tal modo que se ejecuta lo siguiente:

yum -y install sendmail sendmail-cf dovecot m4 make cyrus-sasl cyrus-sasl-md5 cyrus-sasl-plain

Si se utiliza de CentOS 3 o White Box Enterprise Linux 3, el paquete imap es reemplazado por el paquete dovecot. De tal modo que se ejecuta lo siguiente:

yum -y install sendmail sendmail-cf imap m4 make cyrus-sasl cyrus-sasl-md5 cyrus-sasl-plain

Si acaso estuviese instalado, elimine el paquete cyrus-sasl-gssapi, ya que este utiliza el método de autenticación GSSAPI, mismo que requeriría de la base de datos de cuentas de usuario de un servidor Kerberos:

yum -y remove cyrus-sasl-gssapi

Instalación a través de Up2date

Si se utiliza de Red Hat™ Enterprise Linux 4, el paquete imap es reemplazado por el paquete dovecot. De tal modo que se ejecuta lo siguiente:

up2date -i sendmail sendmail-cf dovecot m4 make cyrus-sasl cyrus-sasl-md5 cyrus-sasl-plain

Si se utiliza de Red Hat™ Enterprise Linux 3, el paquete imap es reemplazado por el paquete dovecot. De tal modo que se ejecuta lo siguiente:

up2date -i sendmail sendmail-cf imap m4 make cyrus-sasl cyrus-sasl-md5 cyrus-sasl-plain

Si acaso estuviese instalado, elimine el paquete cyrus-sasl-gssapi, ya que este utiliza el método de autenticación GSSAPI, mismo que requeriría de la base de datos de cuentas de usuario de un servidor Kerberos:

rpm -e cyrus-sasl-gssapi

Procedimientos.

Alta de cuentas de usuario y asignación de claves de acceso.

El alta de usuarios a través de este método será diferente a la manera tradicional, debido a que para utilizar el método de autenticación para SMTP, Sendmail utilizará SASL. Por tal motivo, el alta de cuentas de usuario de correo deberá de seguir el siguiente procedimiento:

1. Alta de la cuenta del usuario en el sistema, la cual se sugiere no deberá tener acceso a intérprete de mandato alguno:

useradd -s /sbin/nologin fulano
2. Asignación de claves de acceso en el sistema para permitir autenticar a través de los métodos PLAIN y LOGIN para autenticar SMTP y a través de los protocolos POP3 e IMAP:

passwd usuario
3. Asignación de claves de acceso para autenticar SMTP a través de métodos cifrados (CRAM-MD5 y DIGEST-MD5) en sistemas con versión de Sendmail compilada contra SASL-2 (Red Hat™ Enterprise Linux 4, CentOS 4 o White Box Enterprise Linux 4), requieren utilizar el mandato saslpasswd2 del siguiente modo:

saslpasswd2 usuario
4. Asignación de claves de acceso para autenticar SMTP a través de métodos cifrados (CRAM-MD5 y DIGEST-MD5) en sistemas con versión de Sendmail compilada contra SASL-1 (Red Hat™ Enterprise Linux 3, CentOS 3 o White Box Enterprise Linux 3), requieren utilizar el mandato saslpasswd del siguiente modo:

saslpasswd usuario
5. La autenticación para SMTP a través de cualquier mecanismo requiere se active e inicie el servicio de saslauthd del siguiente modo:

chkconfig saslauthd on
service saslauthd start

Puede mostrarse la lista de los usuarios con clave de acceso a través de SASL-2 utilizando el mandato sasldblistusers2. Puede mostrarse la lista de los usuarios con clave de acceso a través de SASL-1 utilizando el mandato sasldblistusers. Si ya se cuenta con un grupo de claves de acceso de usuarios dados de alta en SASL-1, se pueden convertir hacia SASL-2 con el mandato dbconverter-2.

Dominios a administrar.

Establecer dominios a administrar en el fichero /etc/mail/local-host-names del siguiente modo:

dominio.com
mail.dominio.com
mi-otro-dominio.com
mail.mi-otro-dominio.com

Establecer dominios permitidos para poder enviar correo en:

vi /etc/mail/relay-domains

Por defecto, no existe dicho fichero, hay que generarlo. Para fines generales tiene el mismo contenido de /etc/mail/local-host-names a menos que se desee excluir algún dominio en particular.

dominio.com
mail.dominio.com
dominio2.com
mail.dominio2.com

Control de acceso

Definir lista de control de acceso en:

vi /etc/mail/access

Incluir solo las IPs locales del servidor, y la lista negra de direcciones de correo, dominios e IPs denegadas. Considere que cualquier IP que vaya acompañada de RELAY se le permitirá enviar correo sin necesidad de autenticar, lo cual puede ser útil si se utiliza un cliente de correo con interfaz HTTP (Webmail) en otro servidor. Ejemplo:

# Check the /usr/share/doc/sendmail/README.cf file for a description
# of the format of this file. (search for access_db in that file)
# The /usr/share/doc/sendmail/README.cf is part of the sendmail-doc
# package.
#
# by default we allow relaying from localhost...
localhost.localdomain	RELAY
localhost		RELAY
127.0.0.1		RELAY
#
# Dirección IP del propio servidor.
192.168.1.254		RELAY
#
# Otros servidores de correo en la LAN a los que se les permitirá enviar
# correo libremente a través del propio servidor de correo.
192.168.1.253		RELAY
192.168.1.252		RELAY
#
# Direcciones IP que solo podrán entregar correo de forma local, es decir,
# no pueden enviar correo fuera del propio servidor.
192.168.2.24		OK
192.168.2.23		OK
192.168.2.25		OK
#
# Lista negra
usuario@molesto.com	REJECT
productoinutil.com.mx	REJECT
10.4.5.6		REJECT
#
# Bloques de Asia Pacific Networks, ISP desde el cual se emite la mayor
# parte del Spam del mundo.
# Las redes involucradas abarcan Australia, Japón, China, Korea, Taiwan,
# Hong Kong e India por lo que bloquear el correo de dichas redes significa
# cortar comunicación con estos países, pero acaba con entre el 60% y 80%
# del Spam.
222			REJECT
221			REJECT
220			REJECT
219			REJECT
218			REJECT
212			REJECT
211			REJECT
210			REJECT
203			REJECT
202			REJECT
140.109			REJECT
133			REJECT
61			REJECT
60			REJECT
59			REJECT
58			REJECT

Alias de la cuenta de root.

No es conveniente estar autenticando la cuenta de root a través de la red para revisar los mensajes originados por el sistema. Se debe definir alias para la cuenta de root a donde re-direccionar el correo en el fichero /etc/aliases del siguiente modo:

root:		fulano

Configuración de funciones de Sendmail.

Modificar el fichero /etc/mail/sendmail.mc y desactivar o habilitar funciones:

vi /etc/mail/sendmail.mc

confSMTP_LOGIN_MSG.

Este parámetro permite establecer el mensaje de bienvenida al establecer la conexión al servidor. Es posible ocultar elnombre y al versión de sendmail, esto con el objeto de agregar seguridad por secreto. Funciona simplemente haciendo que quien se conecte hacia el servidor no pueda saber que software y versión del mismo se está utilizando y con ellos dificultar a un delincuente o abusador de servicio el determinar que vulnerabilidad específica explotar. Recomendamos utilizar lo siguiente:

define(`confSMTP_LOGIN_MSG',`$j ; $b')dnl

Lo anterior regresará algo como lo siguiente al realizar una conexión hacia el puerto 25 del servidor:

$ telnet 127.0.0.1 25
Trying 127.0.0.1...
Connected to nombre.dominio.
Escape character is '^]'.
220 nombre.dominio ESMTP ; Mon, 17 May 2004 02:22:29 -0500
quit
221 2.0.0 nombre.dominio closing connection
Connection closed by foreign host.
$

Está configuración se puede poner justo antes de la líena correspondiente al parámetro confAUTH_OPTIONS.

confAUTH_OPTIONS.

Si se utiliza la siguiente línea, habilitada por defecto, se permitirá realizar autenticación a través del puerto 25 por cualquier método, incluyendo PLAIN, el cual se realiza en texto simple. Esto implica cierto riesgo de seguridad.

define(`confAUTH_OPTIONS',`A')dnl

Si comenta la anterior línea con dnl, y se utiliza en cambio la siguiente línea, se desactiva la autenticación por de texto simple en conexiones no seguras (TLS), de modo tal que solo se podrá autenticar a través de métodos que utilicen ciframiento, como sería CRAM-MD5 y DIGEST-MD5. Esto obliga a utilizar clientes de correo electrónico con soporte para autenticación a través de CRAM-MD5 y DIGEST-MD5.

define(`confAUTH_OPTIONS',`A p')dnl

TRUST_AUTH_MECH y confAUTH_MECHANISMS.

Si se desea utilizar SMTP autenticado para equipos no incluidos dentro del fichero /etc/mail/access, se requieren des-comentar las siguientes dos líneas, eliminando el dnl que les precede:

TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5LOGIN PLAIN')dnl

DAEMON_OPTIONS.

De modo predefinido Sendmail escucha peticiones a través de la interfaz de retorno del sistema a través de IPv4 (127.0.0.1) y no a través de otros dispositivos de red. Solo se necesita eliminar las restricción de la interfaz de retorno para poder recibir correo desde Internet o la LAN. localice la siguiente línea:

DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl

Elimine de dicho parámetro el valor Addr=127.0.0.1 y la coma (,) que le antecede, del siguiente modo:

DAEMON_OPTIONS(`Port=smtp, Name=MTA')dnl

FEATURE(`accept_unresolvable_domains’).

De modo predefinido, como una forma de permitir el correo del propio sistema en una computadora de escritorio o una computadora portátil, está se utiliza el parámetro FEATURE(`accept_unresolvable_domains’). Sin embargo se recomienda desactivar esta función a fin de impedir aceptar correo de dominios inexistentes (generalmente utilizado para el envío de correo masivo no solicitado o Spam), solo basta comentar esta configuración precediendo un dnl, del siguiente modo:

dnl FEATURE(`accept_unresolvable_domains')dnl

Enmascaramiento.

Habilitar las siguientes lineas y adaptar valores para definir la máscara que utilizará el servidor:

MASQUERADE_AS(`dominio.com')dnl
FEATURE(masquerade_envelope)dnl
FEATURE(masquerade_entire_domain)dnl

Si va a administrar múltiples dominios, declare los dominios que no se quiera enmascarar con el parámetro MASQUERADE_EXCEPTION del siguiente modo:

MASQUERADE_AS(`dominio.com')dnl
MASQUERADE_EXCEPTION(`dominio2.net')dnl
MASQUERADE_EXCEPTION(`dominio3.org')dnl
MASQUERADE_EXCEPTION(`dominio4.com.mx')dnl
FEATURE(masquerade_envelope)dnl
FEATURE(masquerade_entire_domain)dnl

Parámetro Cw.

Añadir al final del fichero /etc/mail/sendmail.mc un parámetro que defina que dominio.com se trata de un dominio local. Note que no debe haber espacios entre Cw y dominio.com, y que Cw se escribe con una C mayúscula y una w minúscula.

Cwdominio.com

Usuarios Virtuales.

Si se desea brindar un servicio de hospedaje de dominios virtuales permitiendo que los usuarios envíen y reciban correo utilizando sus propios dominios, se deben añadir los siguientes parámetros debajo de la función de virtusertable del fichero /etc/mail/sendmail.mc:

FEATURE(`virtusertable',`hash -o /etc/mail/virtusertable.db')dnl
FEATURE(`genericstable',`hash -o /etc/mail/genericstable.db')dnl
GENERICS_DOMAIN_FILE(`/etc/mail/generics-domains')dnl

Se generan tres ficheros nuevos dentro del directorio /etc/mail:

touch /etc/mail/{virtusertable,genericstable,generics-domain}

El fichero /etc/mail/virtusertable sirve para definir que cuentas de correo virtuales se entregan en los buzones correspondientes. La separación de columnas se hace con tabuladores. En el ejemplo se entrega el correo de webmaster@dominio1.net en la cuenta mengano y el correo de webmaster@dominio2.com en el buzón del usuario perengano:

webmaster@dominio1.net		mengano
webmaster@dominio2.com		perengano

Para hacer que el correo del usuario mengano salga del servidor como webmaster@dominio1.net y el de perengano salga como webmaster@dominio2.com, es necesario hacer el contenido contrario de /etc/mail/virtusertable del siguiente modo:

mengano			webmaster@dominio1.net
perengano		webmaster@dominio2.com

Para efector prácticos, se puede mantener sincronizados ambos ficheros trabajando directamente con /etc/mail/virtusertable y ejecutando el siguiente guión que se encargará de pasar el texto desde /etc/mail/virtusertable con orden invertido de columnas hacia /etc/mail/genericstable.

while read cuenta usuario garbage
do
echo -e "${usuario}\t${cuenta}" >> /tmp/genericstable
done < /etc/mail/virtusertable
mv /tmp/genericstable /etc/mail/genericstable

El fichero /etc/mail/generics-domains debe contener prácticamente lo mismo que /etc/mail/local-host-names más los dominios que vayan a estar siendo utilizados por dominios virtuales.

dominio.com
dominio1.net
dominio2.com

Invariablemente los ficheros /etc/mail/virtusertable.db y /etc/mail/genericstable.db deben actualizarse con el contenido de /etc/mail/virtusertable y /etc/mail/genericstable, respectivamente, cada vez que se se realicen cualquier tipo de cambio, como actualizar, añadir o eliminar cuentas de correo virtuales.

for f in virtusertable genericstable
do
makemap hash /etc/mail/${f}.db < ${f}
done

Control del correo chatarra (Spam) a través de DNSBLs.

Si se desea cargar listas negras para mitigar el Spam, pueden añadirse las siguientes líneas justo arriba de MAILER(smtp)dnl:

FEATURE(dnsbl, `blackholes.mail-abuse.org', `Rechazado - vea http://www.mail-abuse.org/rbl/')dnl
FEATURE(dnsbl, `dialups.mail-abuse.org', `Rechazado - vea http://www.mail-abuse.org/dul/')dnl
FEATURE(dnsbl, `relays.mail-abuse.org', `Rechazado - vea http://work-rss.mail-abuse.org/rss/')dnl
FEATURE(dnsbl, `sbl-xbl.spamhaus.org', `"550 Su IP esta en lista negra en Spamhaus - Por favor vea http://www.spamhaus.org/query/bl?ip=+"$&{client_addr}')dnl
FEATURE(dnsbl, `bl.spamcop.net', `"550 Su IP esta en lista negra en SpamCOP - Por favor vea http://spamcop.net/bl.shtml?"$&{client_addr}')dnl
FEATURE(dnsbl, `list.dsbl.org', `"550 Su IP esta en lista negra en DSBL - Por favor vea http://dsbl.org/listing?"$&{client_addr}')dnl
FEATURE(dnsbl, `multihop.dsbl.org', `"550 Su IP esta en lista negra en DSBL - Por favor vea http://dsbl.org/listing?"$&{client_addr}')dnl
FEATURE(dnsbl, `dnsbl.ahbl.org',`"550 Su IP esta en lista negra en AHBL - Por favor vea http://www.ahbl.org/tools/lookup.php?ip="$&{client_addr}')dnl
FEATURE(dnsbl, `rhsbl.ahbl.org',`"550 Su IP esta en lista negra en AHBL - Por favor vea http://www.ahbl.org/tools/lookup.php?ip="$&{client_addr}')dnl
FEATURE(dnsbl, `bl.csma.biz', `"550 Su IP esta en lista negra en CSMA - Por favor vea http://bl.csma.biz/cgi-bin/listing.cgi?ip="$&{client_addr}')dnl
FEATURE(dnsbl, `dnsbl.antispam.or.id', `"550 Su IP esta en lista negra en ADNSBL - Por favor vea http://antispam.or.id/?ip="$&{client_addr}')dnl
FEATURE(dnsbl, `blacklist.spambag.org', `"550 Su IP esta en lista negra en SPAMBAG - Por favor vea http://www.spambag.org/cgi-bin/spambag?query="$&{client_addr}')dnl

Protocolos para acceder hacia el correo.

Si utiliza Red Hat™ Enterprise Linux 4, CentOS 4 o White Box Enterprise Linux 4, el paquete imap es reemplazado por dovecot, el cual funciona como otros servicios. Se debe modificar el fichero /etc/dovecot.conf y habilitar los servicios de imap y/o pop3 del siguiente modo (de modo predefinido están habilitados imap e imaps):

# Protocols we want to be serving:
# imap imaps pop3 pop3s
protocols = imap pop3

El servicio se agrega al arranque del sistema y se inicia del siguiente modo:

chkconfig dovecot on
service dovecot start

Si utiliza Red Hat™ Enterprise Linux 3, CentOS 3 o White Box Enterprise Linux 3, el procedimiento utilizará el paquete imap, el cual solo requiere un simple mandato para activar el servicio.

chkconfig imap on
chkconfig ipop3 on

Reiniciando servicio.

Para reiniciar servicio de Sendmail solo bastará ejecutar:

service sendmail restart

Probar servidor enviando/recibiendo mensajes con CUALQUIER cliente estándar de correo electrónico con soporte para POP3/IMAP/SMTP con soporte para autenticar a través de SMTP utilizando los métodos DIGEST-MD5 o CRAM-MD5.

Para depurar posibles errores, se puede examinar el contenido de la bitácora de correo del sistema en /var/log/maillog del siguiente modo:

tail -f /var/log/maillog

Encaminamiento de dominios.

Sendmail incluye soporte para realizar en re-encaminamiento de dominios de correo a través del parámetro FEATURE(`mailertable’,`hash -o /etc/mail/mailertable.db’) que debe estar habilitado de modo predefinido en el fichero /etc/mail/sendmail.mc. Esta función permite a Sendmail realizar traducción de dominios, especificar un agente de entrega y cambiar el encaminamiento establecido en un DNS.

Redundancia del servidor de correo.

Cuando se tiene un dominio de correo electrónico que recibe mucho tráfico, es conveniente establecer redundancia en el servicio para garantizar que el correo siempre será recibido y llegará a los buzones de correo hacia los que está destinado.

Se requieren dos servidores de correo. Uno deberá estar registrado en la zona del dominio en el DNS como servidor de correo primario (mail.dominio.com) y otro deberá estar registrado en la zona del dominio en el DNS como servidor de correo secundario (mail2.dominio.com) a fin de contar con redundancia.

1. Defina en la zona de DNS de dominio.com un servidor de correo primario (mail.dominio.com) y un servidor de correo secundario (mail2.dominio.com)
2. Configure normalmente el servidor de correo primario (mail.dominio.com) para administrar el correo de dominio.com.
3. Configure el servidor de correo secundario (mail2.dominio.com) del mismo modo, pero no añada dominio.com en el fichero /etc/mail/local-host-names ya que de otro modo el correo será tratado como local y jamas podrá ser entregado en el servidor de correo primario.
4. Debe de estar listado dominio.com en el fichero /etc/mail/relay-domains en el servidor de correo secundario (mail2.dominio.com) a fin de permitir la retransmisión de éste hacia el servidor de correo primario (mail.dominio.com).
5. En el servidor de correo secundario (mail2.dominio.com) modifique el fichero /etc/mail/mailertable y defina que dominio.com será entregado en el servidor de correo primario utilizando el nombre plenamente resuelto en la zona del DNS.

dominio.com		smtp:mail.dominio.com

Si lo desea, puede especificar la dirección IP en lugar del nombre:

dominio.com		smtp:[192.168.1.254]
6. Reinicie Sendmail

service sendmail restart
7. En adelante el correo de dominio.com será entregado normalmente y de primera instancia en el servidor de correo primario (mail.dominio.com), pero cuando éste, por alguna razón, se vea imposibilitado para recibir conexiones, el servidor de correo secundario (mail2.dominio.com) definido en la zona de DNS recibirá todo el correo de dominio.com y lo entregará en el servidor de correo primario (mail.dominio.com) cuando éste re-establezca operaciones normalmente.

Servidor de correo intermediario.

Sendmail puede servir de intermediario de correo electrónico ya sea para filtrado de correo con un antivirus, programática para filtrado de correo chatarra o bien como intermediario entre una red pública y un servidor en red local. Se requieren dos servidores de correo. Uno que será el servidor de correo intermediario (proxy.dominio.com), que de forma obligatoria deberá estar definido en la zona de DNS del dominio como servidor de correo primario (un registro MX), y otro que servirá como servidor de correo de destino (mail.dominio.com).

1. El servidor de correo que funcionará como intermediario (proxy.dominio.com) se configura normalmente, pero no añada dominio.com en el fichero /etc/mail/local-host-names ya que de otro modo el correo será tratado como local y jamas podrá ser entregado en el servidor de correo de destino (mail.dominio.com).
2. Debe de estar listado dominio.com en el fichero /etc/mail/relay-domains en el servidor de correo intermediario (proxy.dominio.com) a fin de permitir la retransmisión de éste hacia el servidor de correo primario (mail.dominio.com).
3. La dirección P del servidor de destino (mail.dominio.com) debe estar listada en el fichero /etc/mail/access con RELAY (retransmisión autorizada) del servidor de correo intermediario (proxy.dominio.com).
4. La dirección P del servidor de intermediario (proxy.dominio.com) debe estar listada en el fichero /etc/mail/access con RELAY (retransmisión autorizada) del servidor de correo de destino (mail.dominio.com).
5. En el servidor de correo intermediario (proxy.dominio.com) modifique el fichero /etc/mail/mailertable y defina que dominio.com será entregado en el servidor de correo de destino (mail.dominio.com) utilizando el nombre FQDN (Fully Qualified Domain Name) y plenamente resuelto.

dominio.com		smtp:mail.dominio.com
6. Si lo desea, puede especificar la dirección IP en lugar del nombre:

dominio.com		smtp:[192.168.1.254]
7. En el servidor de correo de destino (mail.dominio.com), des-comente y defina proxy.dominio.com como valor para el parámetro define(`SMART_HOST’,`smtp.your.provider’), de modo que proxy.dominio.com sea el servidor de retransmisión (smart host:

define(`SMART_HOST',`proxy.dominio.com')
8. Reinicie Sendmail en ambos servidores de correo.

service sendmail restart

Verificando el servicio.

Desde una terminal, ejecute el programa telnet dirigido hacia el puerto 25 de la dirección IP principal del sistema:

$ telnet 192.168.0.254 25

Si Sendmail está funcionando correctamente, se establecerá una conexión exitosa y deberá devolver una salida similar a la siguiente:

Trying 192.168.1.254...
Connected to nombre.dominio (192.168.1.254).
Escape character is '^]'.
220 nombre.dominio ESMTP Sendmail 8.13.1/8.13.1; Sun, 5 Mar 2006 21:45:51 -0600

Ejecute el mandato HELO seguido de el nombre del anfitrión:

HELO nombre.dominio

Obtendrá una salida similar a esta:

250 nombre.dominio Hello nombre.dominio [192.168.1.254], pleased to meet you

Ejecute el mandato EHLO seguido del nombre del anfitrión:

EHLO nombre.dominio

Obtendrá una salida similar a esta y que mostrará las funciones del servidor:

250-nombre.dominio Hello nombre.dominio [192.168.1.254], pleased to meet you
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-8BITMIME
250-SIZE
250-DSN
250-ETRN
250-AUTH DIGEST-MD5 CRAM-MD5
250-DELIVERBY
250 HELP

Ejecute el mandato QUIT para cerrar la conexión.

QUIT

El servidor deberá contestar lo siguiente al terminar la conexión:

221 2.0.0 nombre.dominio closing connection
Connection closed by foreign host.

La salida completa de todo el procedimiento anterior debe lucir similar a esto (mandatos utilizados resaltados en negrita):

[fulano@nombre ~]$ telnet 192.168.1.254 25
Trying 192.168.1.254...
Connected to nombre.dominio (192.168.1.254).
Escape character is '^]'.
220 nombre.dominio ESMTP Sendmail 8.13.1/8.13.1; Sun, 5 Mar 2006 21:45:51 -0600
HELO nombre.dominio
250 nombre.dominio Hello nombre.dominio [192.168.1.254], pleased to meet you
EHLO nombre.dominio
250-nombre.dominio Hello nombre.dominio [192.168.1.254], pleased to meet you
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-8BITMIME
250-SIZE
250-DSN
250-ETRN
250-AUTH DIGEST-MD5 CRAM-MD5
250-DELIVERBY
250 HELP
QUIT
221 2.0.0 nombre.dominio closing connection
Connection closed by foreign host.

Pruebas de envío de correo.

Utilizando telnet.

Utilizar el mandato telnet permite conocer y examinar como funciona realmente la interacción entre un servidor de correo y un cliente de correo.

Abra una sesión con telnet dirigido hacia el puerto 25 de la dirección IP principal del sistema.

telnet 192.168.1.254 25

Salude al sistema con el mandato HELO seguido del nombre del anfitrión.

HELO nombre.dominio

El servidor de correo deberá contestarle:

250 nombre.dominio Hello nombre.dominio [192.168.1.254], pleased to meet you

Ejecute el mandato MAIL FROM especificando la cuenta de correo de un usuario local de sus sistema del siguiente modo:

MAIL FROM: <fulano@nombre.dominio>

El servidor de correo deberá contestarle lo siguiente, a menos que especifique una cuenta de correo con un dominio distinto a los especificados en el fichero /etc/mail/relay-domains:

250 2.1.0 <fulano@nombre.dominio>... Sender ok

Ejecute el mandato RCPT TO especificando una cuenta de correo existente en el servidor del siguiente modo:

RCPT TO: <root@nombre.dominio>

El servidor de correo deberá contestarle lo siguiente:

250 2.1.5 <root@nombre.dominio>... Recipient ok

Ejecute el mandato DATA:

DATA

El servidor de correo deberá contestarle lo siguiente:

354 Enter mail, end with "." on a line by itself

Enseguida ingrese el texto que desee incluir en le mensaje de correo electrónico. Al terminar finalice con un punto en una nueva línea.

Hola, este es un mensaje de prueba.
.

El sistema deberá contestarle algo similar a lo siguiente:

250 2.0.0 k263wEKK006209 Message accepted for delivery

Ejecute el mandato QUIT:

QUIT

El servidor deberá contestar lo siguiente al terminar la conexión:

221 2.0.0 nombre.dominio closing connection
Connection closed by foreign host.

La salida completa de todo el procedimiento anterior debe lucir similar a esto (mandatos utilizados resaltados en negrita):

[fulano@nombre ~]$ telnet 192.168.1.254 25
Trying 192.168.1.254...
Connected to nombre.dominio (192.168.1.254).
Escape character is '^]'.
220 nombre.dominio ESMTP Sendmail 8.13.1/8.13.1; Sun, 5 Mar 2006 21:58:14 -0600
HELO nombre.dominio
250 nombre.dominio Hello nombre.dominio [192.168.1.254], pleased to meet you
MAIL FROM: <fulano@nombre.dominio>
250 2.1.0 <fulano@nombre.dominio>... Sender ok
RCPT TO: <root@nombre.dominio>
250 2.1.5 <root@nombre.dominio>... Recipient ok
DATA
354 Enter mail, end with "." on a line by itself
Hola, este es un mensaje de prueba.
.

250 2.0.0 k263wEKK006209 Message accepted for delivery
QUIT
221 2.0.0 nombre.dominio closing connection
Connection closed by foreign host.

Utilizando mutt.

Mutt, término utilizado en la lengua inglesa para referirse a perros mestizos, es un cliente de correo electrónico (MUA o Mail User Agent) para modo texto. Incluye soporte para color, hilos, MIME, PGP/GPG, protocolos POP3, IMAP y NNTP, y para los formatos de correo Maildir y mbox.

Basta ejecutar mutt y pulsar las teclas indicadas la interfaz de texto para realizar diversas tareas. Para enviar un mensaje de correo electrónico siga este procedimiento:

1. Como usuario sin privilegios, ejecute mutt.
2. Responda con la tecla «s» para confirmar que se creará ~/Mail.
3. Una vez iniciada la interfaz de texto de mutt, pulse la tecla «m» para crear un nuevo mensaje.
4. En la parte inferior de la pantalla aparece un diálogo para el destinatario (To: ). Ingrese una cuenta de correo electrónico válida o alguna que exista al menos en el dominio de la Red Local (LAN).
5. En la parte inferior de la pantalla aparece un diálogo para ingresar el asunto del mensaje (Subject: ). Ingrese un título para el mensaje.
6. Enseguida mutt iniciará vi para crear el texto que se enviará en el mensaje. Inicie el modo de insertar texto (i) de vi e ingrese algunas palabras. Al terminar, guarde y salga de vi (:wq).
7. Tras terminar con el editor de texto simple vi, mutt presentará una vista previa del mensaje. Confirme que los datos son los correctos y pulse la tecla «y» para enviar el mensaje. Si necesita cambiar alguno de éstos, pulse «t» para cambiar el destinatario o «s» para cambiar el campo de asunto del mensaje.
8. Mutt le devolverá a la pantalla principal. Si recibe un mensaje de respuesta, seleccione éste y pulse la tecla ENTER para visualizar el contenido.
9. Si desea responder el mensaje, pulse la tecla «r» y repita los procedimientos del paso 4 al 7.

Si lo desea, también puede utilizar mutt desde la linea de mandatos.

echo -e \
"Hola, soy ${USER} en ${HOSTNAME}.\n\
Por favor responde este mensaje.\n\nSaludos." \
| mutt \
-s "Mensaje enviado desde ${HOSTNAME}" \
fulano@maquina.dominio

Lo anterior envía un mensaje de correo electrónico hacia la cuenta fulano@maquina.dominio, con el asunto «Mensaje enviado desde nombre.dominio» con el siguiente contenido como texto del mensaje:

Hola, soy usuario en nombre.dominio
Por favor responde este mensaje.

Saludos.

Referencias.

http://www.ietf.org/rfc/rfc2222.txt
http://www.ietf.org/rfc/rfc821.txt
http://www.ietf.org/rfc/rfc2821.txt
http://www.ietf.org/rfc/rfc1939.txt
http://www.ietf.org/rfc/rfc3501.txt

Fin segunda parte.