Diferencia entre revisiones de «Procesando el correo»

De MoodleDocs
m (es aliases y no alias)
 
(No se muestran 28 ediciones intermedias de 3 usuarios)
Línea 1: Línea 1:
{{Pendiente de traducir}}
== Características ==
== Características ==


Ahora moodle hace mejor uso del protocolo SMTP y correo en general. La mayoría de las mejoras provienen de utilizar una técnica conocida como Variable Envelope Return Path(''Variable envolvente de la ruta de retorno'') (VERP).
Ahora moodle hace mejor uso del protocolo SMTP y correo en general. La mayoría de las mejoras provienen de utilizar una técnica conocida como Variable Envelope Return Path (''Variable envolvente de la ruta de retorno'') (VERP).


* Funciona en los más modernos MTAs (al menos en los sistemas Unix).
* Funciona en los más modernos MTAs (al menos en los sistemas Unix).
* Se aseguran todos los procesos de rebotes y réplicas utilizando HMAC-MD5-8.
* Se aseguran todos los procesos de rebotes y réplicas utilizando HMAC-MD5-8.
* Los rebotes(''bounces'') se manejan correctamente e incrementa el almacenamiento de "correo erróneo"("''bad email''") para el usuario.
* Los rebotes (''bounces'') se manejan correctamente e incrementa el almacenamiento de "correo erróneo" ("''bad email''") para el usuario.
* La dirección noreply@host está ahora en el campo '''Reply-to'''(''Responder''), evitando la contaminación accidental de los libros de direcciones( agendas) de los usuarios.
* La dirección noreply@host está ahora en el campo '''Reply-to''' (''Responder''), evitando la contaminación accidental de los libros de direcciones( agendas) de los usuarios.
* noreply@host tiene un autorresponder
* noreply@host tiene un autorresponder
* Facilita a los módulos el envío de correo con la opción VERP '''reply-to'''(''responder'') marcada.
* Facilita a los módulos el envío de correo con la opción VERP '''reply-to''' (''responder'') marcada.
* Manejadores que reciben respuestas VERP: Validan la firma de HMAC-MD5-8 y envían los datos requeridos codificados al módulo indicado
* Maneja la recepción de respuestas VERP: Valida la firma de HMAC-MD5-8 y envía los datos requeridos codificados al módulo indicado.


== Configuración Moodle ==
== Configuración Moodle ==


Edita config.php para habilitar manejo de rebotes(''bounce''), y configura las especificaciones de Moodle para que coincidan con tu configuración MTA. Aquí está cómo: Quita los comentarios a estas líneas en el archivo config.php (si no puedes encontrarlas, cópialas del archivo config-dist.php):
Edite config.php para habilitar manejo de rebotes (''bounce''), y configure las especificaciones de Moodle para que coincidan con su configuración MTA. Aquí está cómo: Quite los comentarios a estas líneas en el archivo config.php (si no puede encontrarlas, cópielas del archivo config-dist.php):


   // once handlebounces is true, we will be using VERP for the return address of every sent<br> email(''con handlebounces en verdadero. utilizaremos VERP para coger la dirección origen de<br> cada email enviado'')
   // once handlebounces is true, we will be using VERP for the return address of every sent<br> email (''con handlebounces en verdadero. utilizaremos VERP para coger la dirección origen de<br> cada email enviado'')
   $CFG->handlebounces = true;
   $CFG->handlebounces = true;
   // minimum bounces allowed per user(''rebotes mínimos por usuario'')
   // minimum bounces allowed per user(''rebotes mínimos por usuario'')
Línea 25: Línea 24:
   $CFG->bounceratio = .20;
   $CFG->bounceratio = .20;


Edita la línea $CFG->maildomain y una de las líneas $CFG->mailprefix (la que coincida con tu MTA).
Edite la línea $CFG->maildomain y una de las líneas $CFG->mailprefix (la que coincida con su MTA).


Asegúrate de que tu servidor tenga un intérprete de línea de comando PHP, y que es posible conectar con mysql (o postgres). Si eres capaz de ejecutar cron.php desde la línea de comandos o desde crontab, significa que PHP funciona.
Asegúrese de que su servidor tenga un intérprete de línea de comando PHP, y que sea posible conectar con mysql (o postgres). Si es capaz de ejecutar cron.php desde la línea de comandos o desde crontab, significa que PHP funciona.


Edita el script process_email.php para que contenga la localización de tu binario PHP. Será de la forma ''/usr/bin/php''.
Edite el script process_email.php para que contenga la localización de su binario PHP. Será de la forma ''/usr/bin/php''.


Asegúrate que ''process_email.php'' sea ejecutable utilizando la instrucción "chmod ugo+rx process_email.php".
Asegúrese que ''process_email.php'' sea ejecutable utilizando la instrucción "chmod ugo+rx process_email.php".


== Configuración bajo Postfix ==
== Configuración bajo Postfix ==


Añade una línea a tu archivo alias. La línea contendrá un prefijo de 3 letras, un signo "+" y la ruta al script. Por ejemplo, si el prefijo es ''mdl'' y moodle instalado bajo  /var/www/moodle tendríamos en el alias:
Añada una línea a su archivo aliases. La línea contendrá un prefijo de 3 letras, un signo "+" y la ruta al script. Por ejemplo, si el prefijo es ''mdl'' y moodle instalado bajo  /var/www/moodle tendríamos en el alias:


     mdl:    |/var/www/moodle/admin/process_email.php
     mdl:    |/var/www/moodle/admin/process_email.php
     noreply: |/var/www/moodle/admin/process_email.php
     noreply: |/var/www/moodle/admin/process_email.php


Si estás utilizando dominios virtuales, consulta al administrador de tu sistema para la configuración correcta. Probablemente incluirá editar transportes y mapear tu dirección a una "pila(''"pipe"'')de transporte.
Si está utilizando dominios virtuales, consulte al administrador de su sistema para la configuración correcta. Probablemente incluirá editar transportes y mapear su dirección a una "pila(''"pipe"'')de transporte.


== Configuración bajo Qmail ==
== Configuración bajo Qmail ==
Línea 59: Línea 58:
   echo "|/var/www/moodle/admin/process_email.php" > /var/qmail/alias/.qmail-noreply
   echo "|/var/www/moodle/admin/process_email.php" > /var/qmail/alias/.qmail-noreply


A este prefijo de tres letras, añadiremos un signo '-' cuando enviemos y recibamos mensajes. Para más información, comprueba el manejo de dot-qmail.
A este prefijo de tres letras, añadiremos un signo '-' cuando enviemos y recibamos mensajes. Para más información, compruebe el manejo de dot-qmail.


== Configuración bajo Exim ==
== Configuración bajo Exim ==


Abre ''/etc/exim/exim.conf'' y añade a usuarios de confianza(''trusted_users'') el usuario Apache y cron.php se ejecutará así (generalmente "www-data" o "nobody").
Abra ''/etc/exim/exim.conf'' y añada a usuarios de confianza(''trusted_users'') el usuario Apache y cron.php se ejecutará así (generalmente "www-data" o "nobody").


Añade una ínea a tu archivo alias. La línea contendrá un prefijo de 3 letras, más un signo "+", y la ruta del script. Por ejemplo, para un prefijo de ''mdl'' tendremos en el alias:
Añada una línea a su archivo alias. La línea contendrá un prefijo de 3 letras, más un signo "+", y la ruta del script. Por ejemplo, para un prefijo de ''mdl'' tendremos en el alias:


     mdl:    |/var/www/moodle/admin/process_email.php
     mdl:    |/var/www/moodle/admin/process_email.php
     noreply: |/var/www/moodle/admin/process_email.php
     noreply: |/var/www/moodle/admin/process_email.php


Si estás utilizando dominios virtuales, consulta al administrador de tu sistema para la configuración correcta. Probablemente incluirá editar transportes y mapear tu dirección a una "pila(''"pipe"'')de transporte.
Si está utilizando dominios virtuales, consulte al administrador de su sistema para la configuración correcta. Probablemente incluirá editar transportes y mapear su dirección a una "pila(''"pipe"'')de transporte.


Puedes encontrar aquí mas documentación sobre Exim. Puede que tengas que indicar a Exim que no ponga en minúsculas la parte local(''local-part'').
Puede encontrar aquí mas documentación sobre Exim. Puede que tenga que indicar a Exim que no ponga en minúsculas la parte local(''local-part'').


== Información para el Desarrollador ==
== Información para el Desarrollador ==
Línea 84: Línea 83:
Nuevas funciones:
Nuevas funciones:


* generate_email_processing_address() - utiliza SIEMPRE esta para generar la cabecera de respuesta. La cabecera tendrá este aspecto: (LIMITE: 64 caracteres) prefijo - EXACTAMENTE cuatro caracteres codificados , enpaquetados, id de módulo (0 for core)(2 chars) hasta 42 caracteres para los módulos que los rellenarán con lo que corresponda( puede contener id de usuario( o, p.ej. para el foro, id de remitentes(''postids'') para responderles)),42 caracteres es el LIMITE ABSOLUTO) 16 caracteres hash (half an md5) de la primera parte de la dirección, junto con un website "secreto"(''secret'')
* generate_email_processing_address() - utilice SIEMPRE ésta para generar la cabecera de respuesta. La cabecera tendrá este aspecto: (LIMITE: 64 caracteres) prefijo - EXACTAMENTE cuatro caracteres codificados , enpaquetados, id de módulo (0 for core)(2 chars) hasta 42 caracteres para los módulos que los rellenarán con lo que corresponda( puede contener id de usuario( o, p.ej. para el foro, id de remitentes(''postids'') para responderles)),42 caracteres es el LIMITE ABSOLUTO) 16 caracteres hash (half an md5) de la primera parte de la dirección, junto con un website "secreto"(''secret'')


* moodle_process_email() - cualquier proceso de correo que no corresponde a ningún módulo va aquí( generalmente utilizado para procesar rebotes(''bounces''))
* moodle_process_email() - cualquier proceso de correo que no corresponde a ningún módulo va aquí( generalmente utilizado para procesar rebotes(''bounces''))
Línea 96: Línea 95:
Cómo funciona? Penetra y descodifica la dirección de correo en id de módulo(''moduleid'') y valida half md5 hash, y llama a $modname_process_email (si existe). Estas funciones tienen como argumentos: $modargs (alguna parte de la dirección de correo que no es ni el prefijo, ni el id de módulo ni el hash) y el contenido del correo (leído desde STDIN).
Cómo funciona? Penetra y descodifica la dirección de correo en id de módulo(''moduleid'') y valida half md5 hash, y llama a $modname_process_email (si existe). Estas funciones tienen como argumentos: $modargs (alguna parte de la dirección de correo que no es ni el prefijo, ni el id de módulo ni el hash) y el contenido del correo (leído desde STDIN).


It doubles up as the noreplyaddress autorresponder if you configure it with that address as well. Respondiendo con un mensaje amigable: "this is not a real email address"(''no es una dirección de correo válida'').
Se duplica como el autorresponder a dirección sin respuesta( ''noreplyaddress'') si lo configura como que esa dirección es válida. Respondiendo con un mensaje amigable: "this is not a real email address"(''no es una dirección de correo válida'').


== Module Authors ==
== Creadores de Módulos ==


Take a look at new functions moodle_process_email() and generate_email_processing_address() in moodlelib.php for ideas about how to
Eche una mirada a las funciones nuevas moodle_process_email() y generate_email_processing_address() en el archivo moodlelib.php para idéas acerca de cómo


* encode and unencode the arguments your module needs to do the processing
* codificar y decodificar los argumentos que su módulo necesita para realizar el proceso
* how to deal with multiple "actions" for any given module.
* trabajar con múltiples "acciones"(''"actions"'') para un módulo concreto.


In a nutshell, users can send emails to Moodle using special dynamic addresses. These emails can trigger a call to a module function in the form of modulename_process_email($str, $bodyofemail). The $str part will be up to 42 characters of data generated by Moodle (presumably by your own module), and the $bodyofemailpart is the contents of the email (got by reading STDIN - usually generated by the users MUA).
En resumidas cuentas, los usuarios pueden enviar correo a Moodle utilizando direcciones dinámicas especiales. Estos correos puedel lanzar(''trigger'') una llamada a una función módulo de esta forma nombremodulo_process_email($str, $cuerpodeemail). La parte $str constará de hasta 42 caracteres de datos, generados por Moodle( razonadamente por su propio módulo), y la parte $cuerpodeemail es el contenido del correo( obtenido leyendo la entrada estándar STDIN - generado normalmente por los usuarios MUA).


The 42 characters come from the "local part" of an email address (the part before the @ sign) which can have up to 64 chars. Out of those 64 chars, Moodle uses 22 characters, leaving you with 42 characters to encode data.
Los 42 caracteres provienen de la "parte local"(''local part'') de una dirección de correo( lo anterior al signo @) que puede tener hasta 64 caracteres. De esos 64 caracteres, Moodle utiliza 22, dejándole 42 caracteres para codificar datos.


What do we do with the 22 chars? Four go to the prefix, which we need to let the MTA know to pass the message to our script. Two go to identify the module ID so we know which module has generated the message (and so we dispatch the request to that module). The remaining 16 are a signature (HMAC-MD5-8) we use to authenticate the message.
Qué hace Moodle con los 22 caracteres? Cuatro para el prefijo, ya que necesita permitir a MTA saber cómo pasar el mensaje a su script. Dos para el identificador de módulo (ID) y así sabrá para qué módulo se generó el mensaje( y así enviar la petición al módulo). Los 16 caracteres restantes son la firma (HMAC-MD5-8) utilizada para autentificar el mensaje.


Forty-two characters isn't a lot (although it could be the answer to life, the universe, and everything!) so make sure you use those characters wisely.
Cuarenta y dos caracteres no es mucho (aunque podrían ser la respuesta de su vida, el universo, todo!) asegúrese de utilizarlos con sabiduría.


The most efficient way to encode database IDs in their full range (so that they can be placed in an email address) we have found is base64_encode(pack('V',2147483647)), which returns "/ / / / f w = =". The two trailing "= =" are redundant and you can remove them (you'll need to reappend them when retrieving your data). Join your parameters as encoded IDs in positional slots for efficiency.
La forma más eficiente de codificar identificadores(IDs), en bases de datos es su rango completo (y así puedan situarse en una dirección de correo), que hemos encontrado es base64_encode(pack('V',2147483647)), que devuelve "/ / / / f w = =". Los dos caracteres( o la cadena entre ellos) "= =" son redundantes y puede borrarles (necesitará reañadirles cuando recupere sus datos). Encadene sus parámetros como IDs codificadas en celdas(''slots'') posicionales por efectividad.


To retrieve your data, use substr() to separate your parameters, and then unpack('V',base64_decode($str)). Note that it'll return a one-element array.
Para recuperar sus datos, utilice substr() para separar los parámetros, y entonces desempaquételos(''unpack'')('V',base64_decode($str)). Dese cuenta que devolverá una matriz(''array'') de un elemento.
Note:


Using 'V' reaches 2147483647, half the range of mySQL's INT. Additionally, 'V' behaves like a signed value, rather than an unsigned, so I suspect there's a bug in PHP's documentation of pack().
'''Nota''':
Utilizando 'V' alcanza 2147483647, la mitad del rango de un INT en mySQL. Además, 'V' se comporta como un valor con signo, más bien que sin signo, así pues sospecho que hay un '''bug''' en la documentación PHP de pack().


With each ID taking 6-chars (8 chars if we find a way to use the full range of 'V'), you have a limited number of parameters. If you need to encode more information, store it in the DB and send emails that point to your stored data. Remember to cleanup this temporary data after a safe period of time.
Con cada ID tomamos 6 caracteres (8 si encontramos la forma de utilizar el rango completo de 'V'), tiene un número limitado de parámetros. Si necesita codificar más información, almacénela en la BD y envíe correos que enlacen sus datos almacenados. Recuerde borrar esos datos temporales después de un periodo de tiempo prudencial.


Note:
'''Nota''':
No intente utilizar codificación de ancho de variable(''variable-width'')en sus IDs, funciona en pequeñas instalaciones, pero falla en las grandes.


Do not try to use variable-width encoding to put IDs, as it'll work in small installations and break in larger ones.
== Términos de Seguridad ==


== Security issues ==
Cualquier código en nombremodulo_process_email()  debe suponer que verá respuestas repetidas y manejarlas con garbo. La definición de ''con garbo(gracefully)'' depende de lo que realice el código.


Any code in modulename_process_email() _must_ assume it will see repeat replies and handle them gracefully. The definition of 'gracefully' depends on what the code does.
Algunas veces los servidores de correo (MTAs) re-transmitirán un mensaje si no están seguros de que el MTA receptor lo ha recibido -- y algunas veces ''sysadmins'' puede repetir(''replay'') una cola de correo entera si algo ha ido mal. En ese caso, los cuerpos del correo serán idénticos, las cabeceras ligeramente diferentes.


Email servers (MTAs) will sometimes re-transmit a message if they are unsure that the receiving MTA got it -- and sysadmins may sometimes replay a whole email queue if something's gone wrong. In that case, they email body will be identical, the headers slightly different.
Un caso diferente, el usuario puede ''contestar(reply)'' el mensaje dos veces. Quizás por error, quizás a propósito. Qué hacer depende del contexto específico.


In a different case, the user may 'reply' to the message twice. Perhaps in error, perhaps purposefully. What to do depends on the specific scenario.
Usted /podría/ apoyar mejor protección al nivel de entorno de trabajo(''framework''), manteniendo la pista de cada dirección de respuesta que envía. Estamos en contra de esta opción por  (a) el impacto en la ejecución sería importante y (b) queremos que el primero destaque y sea simple de cambiar en caso de necesidad.


We /could/ support better protection at the framework level, by keeping track of every reply-to address we send out. We decided against that because (a) the performance impact will be important (b) we want the 1st cut to be lightweight and simple to change in case we need to.
Con esto la implementación inicial, los módulos deberían poseer funciones que manejasen esos casos de "repeticiones"(''"replay"'') correctamente. Si quiere añadir funciones adicionales, puede añadir "seguimiento"(''"tracking"'') como opción posteriormente. Sería horrible tener cruzados todos los correos enviados desde Moodle.
 
With this the initial implementation, modules should expose functions that handle these "replay" cases correctly. If later we want to expose additional functions, we can add such tracking as an optional thing. It'd be awful to have it across all emails sent from Moodle.


[[Category:Administrador]]
[[Category:Administrador]]
[[Category:Desarrollador]]
[[Category:Desarrollador]]
[[en:Email_processing]]
[[en:Email_processing]]

Revisión actual - 14:15 7 jun 2007

Características

Ahora moodle hace mejor uso del protocolo SMTP y correo en general. La mayoría de las mejoras provienen de utilizar una técnica conocida como Variable Envelope Return Path (Variable envolvente de la ruta de retorno) (VERP).

  • Funciona en los más modernos MTAs (al menos en los sistemas Unix).
  • Se aseguran todos los procesos de rebotes y réplicas utilizando HMAC-MD5-8.
  • Los rebotes (bounces) se manejan correctamente e incrementa el almacenamiento de "correo erróneo" ("bad email") para el usuario.
  • La dirección noreply@host está ahora en el campo Reply-to (Responder), evitando la contaminación accidental de los libros de direcciones( agendas) de los usuarios.
  • noreply@host tiene un autorresponder
  • Facilita a los módulos el envío de correo con la opción VERP reply-to (responder) marcada.
  • Maneja la recepción de respuestas VERP: Valida la firma de HMAC-MD5-8 y envía los datos requeridos codificados al módulo indicado.

Configuración Moodle

Edite config.php para habilitar manejo de rebotes (bounce), y configure las especificaciones de Moodle para que coincidan con su configuración MTA. Aquí está cómo: Quite los comentarios a estas líneas en el archivo config.php (si no puede encontrarlas, cópielas del archivo config-dist.php):

 // once handlebounces is true, we will be using VERP for the return address of every sent
email (con handlebounces en verdadero. utilizaremos VERP para coger la dirección origen de
cada email enviado
) $CFG->handlebounces = true; // minimum bounces allowed per user(rebotes mínimos por usuario) $CFG->minbounces = 10; // ratio of bad emails to sent emails(estadística de correo erróneo en correo enviado) // if we get more than 20% bounces ( si es mayor del 20% los rebotes) // for a given user, his/her email is marked bad(de un usuario concreto, su email se marca
como erróneo
) $CFG->bounceratio = .20;

Edite la línea $CFG->maildomain y una de las líneas $CFG->mailprefix (la que coincida con su MTA).

Asegúrese de que su servidor tenga un intérprete de línea de comando PHP, y que sea posible conectar con mysql (o postgres). Si es capaz de ejecutar cron.php desde la línea de comandos o desde crontab, significa que PHP funciona.

Edite el script process_email.php para que contenga la localización de su binario PHP. Será de la forma /usr/bin/php.

Asegúrese que process_email.php sea ejecutable utilizando la instrucción "chmod ugo+rx process_email.php".

Configuración bajo Postfix

Añada una línea a su archivo aliases. La línea contendrá un prefijo de 3 letras, un signo "+" y la ruta al script. Por ejemplo, si el prefijo es mdl y moodle instalado bajo /var/www/moodle tendríamos en el alias:

   mdl:     |/var/www/moodle/admin/process_email.php
   noreply: |/var/www/moodle/admin/process_email.php

Si está utilizando dominios virtuales, consulte al administrador de su sistema para la configuración correcta. Probablemente incluirá editar transportes y mapear su dirección a una "pila("pipe")de transporte.

Configuración bajo Qmail

Dependiendo de su configuración, su alias se controlará por una o más de

  • /etc/aliases
  • /var/qmail/alias/.qmail-PREFIX

Si edita /etc/aliases añadiendo una línea como (para un prefijo 'mdl'):

   mdl:     |/var/www/moodle/admin/process_email.php
   noreply: |/var/www/moodle/admin/process_email.php

Si crea /var/qmail/alias/.qmail-PREFIX, simplemente realice

 echo "|/var/www/moodle/admin/process_email.php" > /var/qmail/alias/.qmail-mdl
 echo "|/var/www/moodle/admin/process_email.php" > /var/qmail/alias/.qmail-noreply

A este prefijo de tres letras, añadiremos un signo '-' cuando enviemos y recibamos mensajes. Para más información, compruebe el manejo de dot-qmail.

Configuración bajo Exim

Abra /etc/exim/exim.conf y añada a usuarios de confianza(trusted_users) el usuario Apache y cron.php se ejecutará así (generalmente "www-data" o "nobody").

Añada una línea a su archivo alias. La línea contendrá un prefijo de 3 letras, más un signo "+", y la ruta del script. Por ejemplo, para un prefijo de mdl tendremos en el alias:

   mdl:     |/var/www/moodle/admin/process_email.php
   noreply: |/var/www/moodle/admin/process_email.php

Si está utilizando dominios virtuales, consulte al administrador de su sistema para la configuración correcta. Probablemente incluirá editar transportes y mapear su dirección a una "pila("pipe")de transporte.

Puede encontrar aquí mas documentación sobre Exim. Puede que tenga que indicar a Exim que no ponga en minúsculas la parte local(local-part).

Información para el Desarrollador

Funciones cambiadas:

  • email_to_user() pondrá la dirección del remitente en un rebote(bounce)especial de procesamiento de direcciones (basado en las especificaciones de $CFG)
  • email_to_user() aceptará (y pondrá) una cabecera de respuesta(reply-to), que se generará en el módulo que llame a la función.
  • cambios/adiciones en cadenas asociadas

Nuevas funciones:

  • generate_email_processing_address() - utilice SIEMPRE ésta para generar la cabecera de respuesta. La cabecera tendrá este aspecto: (LIMITE: 64 caracteres) prefijo - EXACTAMENTE cuatro caracteres codificados , enpaquetados, id de módulo (0 for core)(2 chars) hasta 42 caracteres para los módulos que los rellenarán con lo que corresponda( puede contener id de usuario( o, p.ej. para el foro, id de remitentes(postids) para responderles)),42 caracteres es el LIMITE ABSOLUTO) 16 caracteres hash (half an md5) de la primera parte de la dirección, junto con un website "secreto"(secret)
  • moodle_process_email() - cualquier proceso de correo que no corresponde a ningún módulo va aquí( generalmente utilizado para procesar rebotes(bounces))

Nuevos archivos:

admin/process_email.php

Este script necesita ser llamado desde su MTA por algo que comience con el prefijo de 3 caracteres descrito anteriormente( y opcionalmente, la dirección noreply(sin respuesta)).

Cómo funciona? Penetra y descodifica la dirección de correo en id de módulo(moduleid) y valida half md5 hash, y llama a $modname_process_email (si existe). Estas funciones tienen como argumentos: $modargs (alguna parte de la dirección de correo que no es ni el prefijo, ni el id de módulo ni el hash) y el contenido del correo (leído desde STDIN).

Se duplica como el autorresponder a dirección sin respuesta( noreplyaddress) si lo configura como que esa dirección es válida. Respondiendo con un mensaje amigable: "this is not a real email address"(no es una dirección de correo válida).

Creadores de Módulos

Eche una mirada a las funciones nuevas moodle_process_email() y generate_email_processing_address() en el archivo moodlelib.php para idéas acerca de cómo

  • codificar y decodificar los argumentos que su módulo necesita para realizar el proceso
  • trabajar con múltiples "acciones"("actions") para un módulo concreto.

En resumidas cuentas, los usuarios pueden enviar correo a Moodle utilizando direcciones dinámicas especiales. Estos correos puedel lanzar(trigger) una llamada a una función módulo de esta forma nombremodulo_process_email($str, $cuerpodeemail). La parte $str constará de hasta 42 caracteres de datos, generados por Moodle( razonadamente por su propio módulo), y la parte $cuerpodeemail es el contenido del correo( obtenido leyendo la entrada estándar STDIN - generado normalmente por los usuarios MUA).

Los 42 caracteres provienen de la "parte local"(local part) de una dirección de correo( lo anterior al signo @) que puede tener hasta 64 caracteres. De esos 64 caracteres, Moodle utiliza 22, dejándole 42 caracteres para codificar datos.

Qué hace Moodle con los 22 caracteres? Cuatro para el prefijo, ya que necesita permitir a MTA saber cómo pasar el mensaje a su script. Dos para el identificador de módulo (ID) y así sabrá para qué módulo se generó el mensaje( y así enviar la petición al módulo). Los 16 caracteres restantes son la firma (HMAC-MD5-8) utilizada para autentificar el mensaje.

Cuarenta y dos caracteres no es mucho (aunque podrían ser la respuesta de su vida, el universo, todo!) asegúrese de utilizarlos con sabiduría.

La forma más eficiente de codificar identificadores(IDs), en bases de datos es su rango completo (y así puedan situarse en una dirección de correo), que hemos encontrado es base64_encode(pack('V',2147483647)), que devuelve "/ / / / f w = =". Los dos caracteres( o la cadena entre ellos) "= =" son redundantes y puede borrarles (necesitará reañadirles cuando recupere sus datos). Encadene sus parámetros como IDs codificadas en celdas(slots) posicionales por efectividad.

Para recuperar sus datos, utilice substr() para separar los parámetros, y entonces desempaquételos(unpack)('V',base64_decode($str)). Dese cuenta que devolverá una matriz(array) de un elemento.

Nota: Utilizando 'V' alcanza 2147483647, la mitad del rango de un INT en mySQL. Además, 'V' se comporta como un valor con signo, más bien que sin signo, así pues sospecho que hay un bug en la documentación PHP de pack().

Con cada ID tomamos 6 caracteres (8 si encontramos la forma de utilizar el rango completo de 'V'), tiene un número limitado de parámetros. Si necesita codificar más información, almacénela en la BD y envíe correos que enlacen sus datos almacenados. Recuerde borrar esos datos temporales después de un periodo de tiempo prudencial.

Nota: No intente utilizar codificación de ancho de variable(variable-width)en sus IDs, funciona en pequeñas instalaciones, pero falla en las grandes.

Términos de Seguridad

Cualquier código en nombremodulo_process_email() debe suponer que verá respuestas repetidas y manejarlas con garbo. La definición de con garbo(gracefully) depende de lo que realice el código.

Algunas veces los servidores de correo (MTAs) re-transmitirán un mensaje si no están seguros de que el MTA receptor lo ha recibido -- y algunas veces sysadmins puede repetir(replay) una cola de correo entera si algo ha ido mal. En ese caso, los cuerpos del correo serán idénticos, las cabeceras ligeramente diferentes.

Un caso diferente, el usuario puede contestar(reply) el mensaje dos veces. Quizás por error, quizás a propósito. Qué hacer depende del contexto específico.

Usted /podría/ apoyar mejor protección al nivel de entorno de trabajo(framework), manteniendo la pista de cada dirección de respuesta que envía. Estamos en contra de esta opción por (a) el impacto en la ejecución sería importante y (b) queremos que el primero destaque y sea simple de cambiar en caso de necesidad.

Con esto la implementación inicial, los módulos deberían poseer funciones que manejasen esos casos de "repeticiones"("replay") correctamente. Si quiere añadir funciones adicionales, puede añadir "seguimiento"("tracking") como opción posteriormente. Sería horrible tener cruzados todos los correos enviados desde Moodle.