WebBlocks Campaigns
Requisitos
Versión del paquete documentado: 0.7.0. WebBlocks CMS ^1.45.5; PHP >=8.3.
A Complemento WebBlocks CMS para enviar un correo electrónico con plantilla a su propia lista de clientes, con el nombre, la dirección y otros campos completados por destinatario.
Consentimiento y por qué la supresión es separada
El consentimiento se registra por canal. Los mensajes operativos y de marketing son cosas diferentes: alguien que opta por no recibir publicidad aún debe recibir "su factura vence", por lo que una bandera obligaría a elegir entre enviar spam a las personas que optaron por no recibir publicidad y retener los mensajes que necesitan.
Ecada contacto registra por qué se puede escribir: la base, de dónde vino, cuándo y, para el consentimiento explícito, la redacción exacta acordada. Una importación registra lo mismo contra sí misma, entonces "¿por qué esta dirección está aquí?" tiene una respuesta un año después.
El registro de supresión es una tabla propia, codificada por dirección en lugar de por contacto, y ninguna importación la toca jamás. Eso es lo que hace que esta secuencia sea segura: alguien se da de baja, el operador luego borra la lista y vuelve a importar la hoja de cálculo original, y la persona que se dio de bajanoregresar. Publicar una dirección es la única salida y es deliberada.
El consentimiento solo se genera mediante una importación, nunca se reduce: un retiro sobrevive a una reimportación y una importación de cliente existente no degrada a alguien que ya cuenta con un consentimiento explícito.
Importación
Ucargar, mapear, obtener vista previa, confirmar. No se escribe nada hasta el último paso y cada fila rechazada se informa con su número de línea en el archivo fuente para que el operador arregle la hoja de cálculo en lugar de adivinar qué se eliminó.
Los archivos separados por punto y coma y una lista de materiales UTF-8 se leen sin quejas, porque eso es lo que producen las exportaciones de hojas de cálculo alemanas y turcas. Se sugiere una asignación de columnas y nunca se aplica por sí sola: una suposición que asigna nombres al campo de correo electrónico es peor que ninguna suposición, porque parece que funcionó.
A la celda en blanco es una ausencia, no un valor. Una reimportación llena los vacíos y no borra lo que ya existe.
Escribir una plantilla
{{ first_name }} toma el valor. {{ first_name | Kunde }} dice lo que aparece cuando falta, que es la diferencia entre "Hola Ada" y "Hola", la forma en que se recuerda una combinación de correspondencia.
Los valores combinados se escapan en HTML; la plantilla no lo es. La plantilla es tuya, los valores provienen de una hoja de cálculo.
Se verifican dos cosas antes de poder enviar una prueba:
- An bloques de campo desconocidos.
{{ firstname }}donde el campo esfirst_namese muestra vacío para every destinatario y se ve perfectamente bien en el editor. Los campos disponibles se derivan de los contactos que realmente importó, por lo que el error tipográfico se puede detectar. - A faltan advertencias de respaldo. Es un juicio, no un error: "Hola" sin nombre a veces es exactamente correcto.
La vista previa se muestra frente a un contacto real en lugar de datos inventados, porque los datos inventados siempre están bien formados y, por lo tanto, no prueban nada. Un envío de prueba entrega las cadenas ya procesadas, por lo que lo que llega es lo que enviaría una campaña, con el prefijo [TEST].
Enviando
Una campaña combina una plantilla con una lista y declara qué tipo de mensaje es:
- Comerciales publicidad. Sólo llega a los contactos cuyo consentimiento permite la publicidad, y su plantilla.debecontener
{{ unsubscribe_url }}— en caso contrario se rechaza la cola. - Operacionalse refiere a un contrato existente. No es publicidad, por lo que una opción de exclusión de marketing no la retiene y no necesita un enlace para cancelar la suscripción.
La cola no envía. Materializa el conjunto de destinatarios: un envío lleva horas y derivarlo de la lista a mitad de ejecución permitiría que una edición cambie silenciosamente a quién se escribe. Entonces cron hace el trabajo:
php artisan webblocks-campaigns:dispatch
Cada ejecución envía un lote por campaña, delimitado por el tamaño del lote por sitio y el límite por hora. Ese es el punto: un envío masivo realizado a través del SMTP de un host compartido es la forma en que se bloquea un dominio de envío, y eso lleva meses deshacerlo.
La instantánea no es confiable. La supresión y el consentimiento se vuelven a verificar para cada destinatario en el momento del envío, por lo que alguien que se cancele la suscripción una hora después de un período de dos horas no recibirá el resto. La pausa se vuelve a leer entre lotes y detiene la ejecución inmediatamente.
Cancelar suscripción
Cada mensaje comercial lleva un enlace creado a partir de un token por destinatario, por lo que una opción de exclusión registra qué campaña lo provocó. El encabezado List-Unsubscribe también está configurado, ya que su ausencia es una de las señales que clasifica el correo masivo como spam.
El GET muestra una página de confirmación y el POST hace el trabajo: los clientes de correo y los dispositivos de seguridad siguen enlaces sin que se les solicite, por lo que actuar en GET cancelaría la suscripción de personas que nunca hicieron clic. Un segundo clic dice "usted se ha dado de baja" en lugar de fallar.
List-Unsubscribe-Post (un clic) se anuncia deliberadamente not: le pide al cliente que realice una PUBLICACIÓN sin un token CSRF, lo cual el CMS rechaza con un 419. Reclamar una capacidad que falla es peor que no reclamarla.
A Una cancelación de suscripción escribe dos registros: una supresión, que es absoluta y sobrevive a una reimportación, y un retiro de consentimiento en el contacto, que es lo que ve un operador y lo que evidencia que el sitio se detuvo cuando se le preguntó.
Leyendo el resultado
El registro de envío enumera cada destinatario con su estado y el motivo detrás de él, filtrable. Encima, se agrupan los motivos de omisión y error: "412 omitido" no es procesable, mientras que "390 suprimido, 22 consentimiento retirado" es una tranquilidad o una tarea.
Los fallos se pueden volver a intentar; los saltos no pueden. Saltarse era una decisión, y volver a intentarlo la repetiría o la anularía; la segunda es cómo alguien que optó por no participar recibe el correo nuevamente. Los destinatarios reintentados pasan por los mismos controles de consentimiento y supresión que todos los demás.
Settings
Por sitio: tamaño del lote, límite por hora, nombre y dirección del remitente, respuesta. Los límites son la razón por la que existe el procesamiento por lotes: un envío masivo a través del SMTP de un host compartido es la forma en que se bloquea un dominio de envío, y eso lleva meses deshacerlo. La pantalla también indica claramente cuándo el correo saliente no se puede utilizar, por lo que una campaña llena de omisiones no se confunde con un error.
Rebotes
Las expulsiones se clasifican de tres maneras, y solo una de ellas suprime:
Medios
Suprime
Dirección muerta
"no existe tal usuario", "dominio no encontrado"
YSí, inmediatamente
Temporal
buzón lleno, en lista gris, tarifa limitada
Solo después de repetidos fallos
Rechazado por el receptor
spam, política, SPF/DKIM/DMARC, retransmisión denegada
Nunca
La tercera fila es el punto de toda la característica. Esos rechazos llegan con códigos 5xx permanentes y parecen idénticos a un buzón inactivo, pero se trata del envío your, no del destinatario. Suprimirlos eliminaría clientes válidos debido a una reputación o un error de configuración, de forma silenciosa, una campaña a la vez. Los casos ambiguos se resuelven hacia la no supresión: mantener una dirección muerta cuesta un rebote, suprimir una activa cuesta un cliente.
La clasificación ocurre en el momento del envío debido a la falla de SMTP, por lo que no necesita webhook, ni buzón de ruta de retorno ni integración de proveedor; funciona con cualquier transporte que el sitio ya utilice.
Cada rechazo se mantiene como historia, no solo como una supresión. Una supresión no puede decir por qué ni con qué frecuencia, y una serie de rechazos del receptor es invisible sin ella. La pantalla Problemas de entrega advierte cuando aparece ese patrón y dice qué verificar.
Instalar
composer plugin:build
Luego instale el artefacto a través de System → Plugins en el administrador de CMS. Instalación de complementos deshabilitada; habilitar explícitamente después de revisar.
Convenciones
handle webblocks-campaigns
settings namespace webblocks_campaigns
database prefix webblocks_campaigns_
admin routes /webadmin/plugins/webblocks-campaigns
public routes /plugins/webblocks-campaigns
route names webblocks.plugins.webblocks_campaigns.*
permissions webblocks-campaigns.view, .manage, .send, .settings
send está separado de manage a propósito: editar un borrador y publicarlo entre dos mil personas son actos diferentes, y una organización debería poder otorgar uno sin el otro.
Recoge suscriptores con doble opt-in
Agregue el bloque de registro a una página y elija la lista de destino, el encabezado, la introducción, el texto de consentimiento y el campo de nombre opcional. Una solicitud crea una suscripción pendiente. El destinatario debe utilizar el enlace de confirmación enviado por correo electrónico y confirmar antes de que la dirección pueda enviarse. Los enlaces de confirmación caducan después de siete días.
El complemento registra el texto de consentimiento que se muestra al registrarse. Una confirmación puede levantar una cancelación de suscripción o un rebote permanente; no anula una queja de spam ni un bloqueo manual del operador. Se conservan los nombres de contactos existentes.