Para explicar el funcionamiento de los correos electrónicos, vamos a comenzar a explicar desde el momento cuando se envía un email.
Asumamos que escribes un email en tu laptop, al terminar de redactarlo eliges su destinatario y oprimes Enter, en el momento que oprimes Enter el teclado emite una señal eléctrica a la tarjeta madre de tu laptop.
Esta señal eléctrica es intervenida por el procesador conocido como CPU, el cual es el centro de procesamiento de todo tu computador. El CPU básicamente es un chip especial que procesa señales eléctricas y operaciones matemáticas. Es donde se ejecuta el código de programación.
El teclado le dice al CPU que ocurrió algo. Esta señal se traslada a través de la tarjeta madre. Esta es una placa electrónica por donde van las señales de todos los dispositivos que funcionan con electricidad dentro de un computador.
Una vez que el CPU recibe la señal eléctrica utilizada para informar que la tecla Enter fue oprimida, entonces manda una señal a una capa más arriba que es donde corre el sistema operativo.
Hay muchos tipos de sistemas operativos (Microsoft Windows, macOS de Apple, GNU/Linux). Asumamos que en este caso el laptop funciona con Windows; entonces, Windows a través de la CPU recibe la señal de que el teclado fue oprimido.
Windows entiende que existe un teclado y que la señal significa Enter, porque Windows y, en general, todos los sistemas operativos, tienen capas de software diseñadas para entender las señales eléctricas de dispositivos externos de hardware. Ese tipo de capas de software se llaman drivers.
Una vez capturado hay que enviárselo a alguien para que haga algo.
El sistema operativo entiende algo que se llama “el estado” en el instante en el que estoy, dónde estoy y dónde tengo el foco.
Si estábamos en un navegador Gmail escribiendo un email y oprimimos Enter, el sistema operativo sube una capa aún más arriba y, en esa capa del software en la que corre el sistema operativo, le envía al navegador la señal de que alguien oprimió Enter. Asumamos que ese navegador es Google Chrome, entonces Google Chrome entiende otra capa de software aún más arriba.
El software sobre el que corre internet usa algo que nosotros llamamos tecnologías de Frontend que son HTML, CSS y Javascript.
Un HTML es el representante del botón enviar y Javascript es el que hace algo, es decir, el que ejecuta una acción.
Por consiguiente, al escribir el email y oprimir Enter, recibimos una señal a través de Javascript que significa enviar el email. De esta manera ocurre algo que llamamos un evento.
Los eventos son los que disparan que algo ocurra en un sistema operativo moderno, sobre todo, en la programación orientada a objetos y en la programación visual.
Un evento puede ser un “clic” a la tecla enter o hacer “touch” con mis dedos a una pantalla táctil de un móvil o una Tablet.
Igualmente, cuando le doy la vuelta a la Tablet, este es un evento de rotación que es percibido por el acelerómetro, el cual es una pieza de hardware dentro de la tablet que indica la posición respecto a la gravedad de la tierra y, en consecuencia, el sistema operativo cambia la representación en pantalla.
Este evento lo recibe el sistema operativo a través de una conexión con los drivers. Así funciona casi todo en la programación. El evento, en este caso, es el Enter y ese evento está pegado a un código de programación que como ya mencionamos es Jevascript.
En el caso de Javascript, este va a tomar todo lo que nosotros escribimos en el navegador y lo va a encapsular para enviárselo a internet a la nube; pero, realmente lo que está pasando por detrás, es que Javascript usa una cosa llamada API o Application Program Interface (Interfaz de programación de aplicaciones).
Las API son usadas por los programadores para comunicarse entre sí sin hablar entre ellos.
En el contexto de las API, la palabra aplicación se refiere a cualquier software con una función distinta. La interfaz puede considerarse como un contrato de servicio entre dos aplicaciones.
Este contrato define cómo se comunican entre sí mediante solicitudes y respuestas. La documentación de su API contiene información sobre cómo los desarrolladores deben estructurar esas solicitudes y respuestas.
En el mundo de la programación los navegadores le dijeron a los programadores nosotros vamos a crear un API que se llama Ajax (JavaScript asíncrono y XML - Asynchronous JavaScript and XML) .
El navegador le dice a los programadores con Ajax cuál es su API para que se puedan enviar cualquier cosa que quieran a un servidor en internet sin necesidad de recargar la página.
Hay muchas API, por ejemplo, Twitter les puede decir, yo les doy esta API para que ustedes programen una aplicación de software basada en lo que quieran que escriba tweets o, también, puede existir una API de Strike para poder cargar con tarjetas de crédito, así tú me mandas a través de Ajax o a través de cualquier forma los datos de una tarjeta de crédito y mi API los captura y los procesa.
Hay muchos tipos de API, por ahora arranquemos por explicar Ajax. Con Ajax voy a tomar todos los datos que escribí como usuario, los encapsulo y se los envío al servidor. Una tecnología como Ajax lo puede lograr y eso es un API.
AJAX es un conjunto de técnicas de desarrollo web que permiten que las aplicaciones web funcionen de forma asíncrona, procesando cualquier solicitud al servidor en segundo plano.
¿Y cómo encapsula esos datos? Hay muchas formas y estas se llaman formatos de archivo. Por ejemplo, cuando ustedes guardan un archivo jpg que sería una imagen, ese es el formato de un archivo JPG; cuando guardan un archivo de Word usan un formato de archivo llamado punto doc (.doc) o en los Office más modernos es .docx.
Cuando se transfiere información por internet hay muchos formatos, por ejemplo, uno que se llama HTML, otro que se llama XML y uno de los formatos más populares de nuestra época es conocido como Jason.
Jason significa JavaScript Object Notation, el cual es un formato ligero de intercambio de información de fácil lectura y escritura para los usuarios.
Ajax y JavaScript lo que hacen es encapsular los datos del usuario, en este caso un email, en Jason y los envían a un servidor a través de protocolos preestablecidos. Ese protocolo normalmente es conocido como un API Rest .
Api Rest, en resumen, es una técnica para enviarle datos al servidor.
En el nivel más básico, una API es un mecanismo que permite a una aplicación o servicio acceder a un recurso dentro de otra aplicación o servicio. La aplicación o servicio que realiza el acceso se denomina cliente y la aplicación o servicio que contiene el recurso se denomina servidor.
Algunas API, como SOAP o XML-RPC, imponen una estructura estricta a los desarrolladores. Sin embargo, las API REST se pueden desarrollar mediante el uso de prácticamente cualquier lenguaje de programación y son compatibles con una variedad de formatos de datos. El único requisito es que se ajusten a los siguientes seis principios de diseño de REST, también conocidos como restricciones de arquitectura: Interfaz uniforme, separación entre cliente y servidor, sin estado, capacidad de almacenamiento en memoria caché, arquitectura de sistema de capas y código bajo de demanda (opcional). Fuente: https://www.ibm.com/pe-es/cloud/learn/rest-apis
¿Y por dónde se envía esos datos? Ese canal por el cual viajan los datos normalmente en internet se llaman protocolos y existe un protocolo de transferencia de hipertexto que se llama HTTP.
Entonces, una vez le doy Enter hay un evento que se dispara en el navegador y que a través de JavaScript encapsula los datos en formato Jason y usando Ajax los envía a una API rest del lado del servidor que se transmite por HTTP.
HTTP es muy interesante porque es cómo funciona internet. HTTP es eso que está al principio de todos los sitios web. Así que ahí vamos a otra capa que es la capa de internet. En esa capa ustedes saben que existen direcciones, por ejemplo https://platzi.com.
Imaginemos que hay un lugar llamado https://gmail.com/enviar_mail. Las URL están compuestas de múltiples partes, la primera de ellas es el protocolo a través del cual yo estoy transmitiendo la información que puede ser HTTP, HTTPS, FTP, etc.
Hay muchos tipos de protocolos. El protocolo http (Hypertext Transfer Protocol o Protocolo de Transferencia de Hipertexto) es el protocolo a través del cual funciona normalmente internet, pero si envías archivos grandes probablemente vas a usar en algún punto un protocolo llamado FTP (File Transfer Protocol).
FTP es un protocolo que permite transferir archivos directamente de un dispositivo a otro. Es un protocolo que ha estado vigente por más de 50 años, motivo por el cual está un poco obsoleto, pero todavía existe.
Adicionalmente, cuando quieres controlar de manera remota un servidor a través de una consola de texto, como un hacker por ejemplo, usas un protocolo llamado SSH, también conocido como Secure Shell. Este es un protocolo de administración remota que le permite a los usuarios controlar y modificar sus servidores remotos por medio de Internet a través de un mecanismo de autenticación.
SSH proporciona un mecanismo para autenticar un usuario remoto, transferir entradas desde el cliente al host y retransmitir la salida de vuelta al cliente. El servicio se creó como un reemplazo seguro para el Telnet sin cifrar y utiliza técnicas criptográficas para garantizar que todas las comunicaciones hacia y desde el servidor remoto sucedan de manera encriptada.
Así mismo, cuando descargas distribuciones de Linux u otros archivos de manera masiva peer to peer usas un protocolo llamado BitTorrent. Este es el mismo protocolo que usa por ejemplo Blizzard para actualizar sus juegos como StarCraft, Warcraft, Overwatch, etc. y también es un protocolo usado para transmitir la información de juegos multiplayer.
Hay muchos protocolos y el protocolo fundamental de internet por donde se mueve HTML, CSS, JavaScript, Ajax, Jason, los API Rest se llama HTTP.
A veces te encuentras con el protocolo HTTPS con una “S” enfrente, esta “S” es súper importante porque significa que el protocolo va cifrado o encriptado, lo cual simboliza que del lado del servidor se envió una llave que encriptó la conexión para que sólo tú y el servidor la vean, sin que nadie más la intervenga.
Hay un ataque muy común en el que hay personas que intervienen las conexiones de internet mientras están viajando, porque una conexión de internet no viaja en línea recta.
Después del protocolo se escribe el dominio, por ejemplo http://gmail.com.
El dominio es muy importante porque es el nombre con el cual nosotros encontramos en internet al servidor. A él se llega a través de algo llamado DNS de lo que vamos a hablar luego.
Al final como ya llegamos al servidor tenemos que saber qué instrucción específica mandarle. Así, por ejemplo, platzi.com/login para entrar a la página, platzi.com/clases para ver todos los cursos que tiene, platzi.com/agenda para ver la lista de los cursos nuevos, clases en vivo, clases grabadas y lanzamientos.
Retomando el caso de gmail existe una URL que a veces son mucho más complejas por ejemplo https://mail.google.com/mail/u/6/?tab=rm&&%#ogbl#5%inbox/WhctKKXXKz76ty3f&#!Tw; que como puedes ver es una larga combinación de letras, números y símbolos. En definitiva, por ahora solamente tienes que recordar que lo que va después del slash (/) del dominio es la instrucción dentro del servidor y esa instrucción es la que está directamente conectada al DNS.
DNS significa Domain Name Server o servidor de nombres de dominio.
Ahora bien, como se mencionó anteriormente gmail.com es un dominio, pero internamente internet funciona con direcciones IP. Al igual que en el mundo real ustedes dicen yo vivo en la casa 26 de la calle Obregón en la Ciudad de México; pues bien, eso también funciona en internet. Los nombres luego se convierten en IP, es decir en direcciones exactas donde están los servidores.
Hay una serie de servidores globales que es un proceso común en el cual todas las personas de internet y todos los países colaboran llamados DNS.
Una IP es una dirección única en internet, equivale a un nombre. Si ustedes quieren saber a qué IP equivale un nombre en sus computadores es muy fácil abran una terminal en Windows, se hace con las teclas Windows + X y eligiendo la terminal de comandos o el Power Shell.
En macOS se hace buscando una aplicación llamada terminal. Una vez lo hayan abierto escriban el comando ping google.com todo en minúscula. Van a salir muchas cosas, pero una de esas es una IP.
Estas IP son direcciones de internet donde está alojado Google. El caso de Google es especial porque lo más probable es que salgan direcciones IP diferentes, ya que Google depende del país donde intenten abrirlo, pues va a buscar el servidor más cercano al país desde donde lo están consultando.
Si lo abres desde México, España o Japón vas a tener direcciones diferentes, con el fin de ser más rápido.
Retomando la explicación de los emails, una vez encontrada la IP se manda la petición al servidor. Este servidor puede ser una serie de computadores o un computador gigantesco donde normalmente se ejecuta el código real con el que está escrito Gmail, el cual es famosamente escrito en un lenguaje llamado Java; pero, para llegar a Java tenemos que pasar por varias capas. La primera capa es el sistema operativo.
El sistema operativo que corre un servidor es Linux, el cual tiene drivers que le permiten conectarse a la electricidad del cable de red a través de una serie de routers o switches que son los que transmiten esta información de la IP; es decir, estos impulsos eléctricos son interpretados por los drivers en una capa de red que conocemos como Ethernet.
Ethernet envía esta señal a Linux y la convierte en datos que son encapsulados en un súper protocolo llamado TCP/IP, a través del cual se transmite todo sobre internet. Luego TCP/IP crea los datos hacia el protocolo HTTP que es la forma en la que los navegadores se conectan.
HTTP es recibido por un servidor dentro de Linux, siendo uno de ellos nginx y otro de ellos es Apache.
Los servidores a nivel de software son aplicaciones que corren en el sistema operativo, en este caso de ejemplo es Linux, y en ese sistema operativo se capturan las señales que llegan como Jason, http o como cualquier otra que es enviada por un navegador. Estas son procesadas, pero no por el servidor sino por el código de programación que normalmente está hecho en lenguaje Java, aunque existen otros lenguajes de programación como PHP, Python, Go, etc. Estos lenguajes procesan los datos.
En este caso que estamos discutiendo, el lenguaje sabe que se le ordenó enviar un email, pero antes de enviarlo lo guarda en una base de datos (MySQL, Oracle, PostgreSQL, etc).
¿por qué se guarda en una base de datos? porque los usuarios en algún momento van a querer consultar el archivo de esos emails, y para ello se necesita acceder de una manera estructurada.
Lo siguiente que hacemos es enviar el mail. Estos tienen su propio protocolo y se envían con sus propios servidores.
Para enviar ese email a internet, en general, tenemos que usar un servidor de correo, por ejemplo, digamos que estamos mandando un mail a [email protected] estos tienen un dominio y a través de ese dominio se conoce el IP al cual se debe conectar para mandar el correo. Así mismo, tienen un nombre que representa la casilla de correo al que se va a enviar el email.
Los email normalmente funcionan con un protocolo diferente al http, el cual se tiende a llamar SMTP y POP3 uno es de envío y otros de recepción.
Asumiendo que Platzi tiene sus propios servidores, son estos protocolos sumados a los otros protocolos que existen para enviar correo los que se conectan a un servidor final.
Platzi puede tener un servidor de email que no es necesariamente el mismo servidor de http o el mismo servidor de otros protocolos, ya que se pueden tener múltiples servidores diferentes.
Digamos que el servidor de email de Platzi corre en macOS Server que es el sistema operativo del servidor, el cual funciona igual que mandarle el email a gmail, es decir, llega a un DNS se cambia una IP, se conecta un protocolo, este protocolo se conecta por un impulso eléctrico, este impulso es interpretado por un driver que conecta el mensaje al sistema operativo y este lo convierte en las diferentes capas de red TCP/IP, POP3 o SMTP, lo manda al servidor de email.
El servidor de email más popular es postfix que interpreta a quién le mandaron el email. Entonces, asigna el email a una base de datos que internamente los servidores de correo llaman bandeja.
Luego los servidores de correo crean una notificación de email para que el usuario se entere de que posee un email en su bandeja.
¿Cómo funcionan estas notificaciones? Si asumimos que el destinatario del email tiene un iPhone entonces el iOS Notification Server que es un servidor que tiene una base de datos de todos los teléfonos Apple con un id único y un IP al que se encuentra conectado el teléfono. Constantemente hay una conexión entre el teléfono y ese servidor. A través de esta conexión llega la notificación de que hay un correo en la bandeja.
Aun cuando se han omitido algunos pasos de este proceso, básicamente este es el recorrido que explica el funcionamientos de los correos electrónicos.
Aporte de Avilio Muñoz Vilchez