Organiza tus páginas con colecciones
Guarda y categoriza el contenido según tus preferencias.
Los mensajes de correo electrónico que se envían a tu app se implementan como solicitudes HTTP que contienen datos MIME. Para procesar los mensajes de correo electrónico entrantes, asocia las direcciones de correo electrónico con los controladores de secuencias de comandos en la configuración de tu aplicación y, luego, incluye los controladores en el código de la aplicación.
El correo electrónico entrante genera solicitudes HTTP, que se pasan a las secuencias de comandos adecuadas. Las secuencias de comando que controlan el correo electrónico entrante deben residir en su servicio predeterminado.
Configurar tu aplicación para recibir correo electrónico
Cuando creas una aplicación nueva, el correo electrónico entrante está inhabilitado de forma predeterminada. Para habilitar el correo electrónico entrante, debes modificar el archivo app.yaml en tu servicio predeterminado.
Agrega una sección inbound_services que habilite el servicio de correo electrónico entrante.
Por ejemplo:
inbound_services:-mail
Si no habilitas el correo electrónico entrante cuando incluyas esta sección en tu archivo de configuración, el correo electrónico entrante se inhabilitará y se omitirán los mensajes de correo electrónico enviados a la aplicación.
Agrega asignaciones que asocien direcciones de correo electrónico asignadas mediante URL con controladores de secuencia de comandos.
En el servicio predeterminado, la dirección de correo electrónico para recibir correos electrónicos tiene el siguiente formato:
[STRING]@[Google Cloud projectID].appspotmail.com
Para los servicios no predeterminados, la dirección de correo electrónico tiene el siguiente formato:
Los mensajes de correo electrónico se envían a tu aplicación como solicitudes HTTP POST con la siguiente URL, en el que [ADDRESS] es una dirección de correo electrónico completa, incluido el nombre del dominio:
/_ah/mail/[ADDRESS]
Para controlar el correo electrónico entrante en tu app, asigna las URL de correo electrónico a los controladores en el archivo app.yaml:
En el ejemplo anterior, /_ah/mail/.+ coincide con todos los correos electrónicos dirigidos a la aplicación. Si lo prefieres, puedes configurar varios controladores para diferentes direcciones de correo electrónico, como en el ejemplo siguiente:
Las URL de los mensajes de correo electrónico entrantes se comparan con esta lista del primero al último, por lo que, si la URL de un mensaje de correo electrónico coincide con más de un patrón, el primer controlador coincidente será el que se ejecute. Esto te permite incluir un controlador "genérico" como la última asignación. Los controladores se ejecutan en el módulo predeterminado (o en la versión de la aplicación).
Controla el correo electrónico entrante
El SDK de Python define InboundMailHandler, una clase de aplicación web para controlar el correo electrónico entrante. InboundMailHandler está en el paquete google.appengine.ext.webapp.mail_handlers.
Para usar InboundMailHandler, ingresa el siguiente comando:
Crea una subclase para InboundMailHandler y anula el método receive().
Llama al método receive() con un argumento de clase InboundEmailMessage, definido por el SDK de Python.
Por ejemplo, puedes crear una instancia de InboundEmailMessage como esta:
importloggingfromgoogle.appengine.ext.webapp.mail_handlersimportInboundMailHandlerimportwebapp2classLogSenderHandler(InboundMailHandler):defreceive(self,mail_message):logging.info("Received a message from: "+mail_message.sender)
InboundMailHandler contiene un método de clase mapping() práctico que muestra una sincronización combinada de todas las direcciones de correo electrónico entrantes con el controlador de correo y, por supuesto, puedes llamarlo en cualquier subclase InboundMailHandler de tu código:
El objeto InboundEmailMessage (mail_message en este ejemplo) contiene el mensaje de correo electrónico. Su método bodies() muestra los cuerpos dentro del mensaje. Si llamas a bodies() sin argumentos, muestra un iterador que genera primero los cuerpos HTML y, luego, los de texto sin formato. Si solo quieres HTML o texto sin formato, puedes pasar un argumento a bodies():
El objeto InboundEmailMessage incluye atributos para acceder a otros campos de mensajes:
subject contiene el asunto del mensaje.
sender es la dirección del remitente, p.Ej., "Nobody <nobody@example.com>".
to es una lista separada por comas de los destinatarios principales del mensaje, por ejemplo, "Joe <joe@example.com>, Bill <bill@example.com>".
cc contiene una lista separada por comas de los destinatarios de cc, por ejemplo, "Joe <joe@example.com>, Bill <bill@example.com>".
date muestra la fecha del mensaje.
attachments es una lista de objetos Attachment, posiblemente vacía.
original es el mensaje completo, incluidos los datos no expuestos por los demás campos, como los encabezados de correo electrónico, como un email.message.Message de Python.
Simular mensajes entrantes con el servidor de desarrollo local
Cuando configures tu aplicación para controlar el correo electrónico entrante, puedes usar la consola del servidor de desarrollo para simular los mensajes de correo electrónico entrantes:
Para acceder al servidor de desarrollo como administrador, ve a http://localhost:8080/console y selecciona Acceder como administrador.
En el servidor de desarrollo, haz clic en Correo entrante en el navegador.
Rellena el formulario que aparece y haz clic en Enviar correo electrónico.
Para obtener más información, incluso cómo conseguir que el servidor de desarrollo se ejecute, consulta el Servidor de desarrollo de Python.
[[["Fácil de comprender","easyToUnderstand","thumb-up"],["Resolvió mi problema","solvedMyProblem","thumb-up"],["Otro","otherUp","thumb-up"]],[["Difícil de entender","hardToUnderstand","thumb-down"],["Información o código de muestra incorrectos","incorrectInformationOrSampleCode","thumb-down"],["Faltan la información o los ejemplos que necesito","missingTheInformationSamplesINeed","thumb-down"],["Problema de traducción","translationIssue","thumb-down"],["Otro","otherDown","thumb-down"]],["Última actualización: 2025-09-04 (UTC)"],[[["\u003cp\u003eIncoming emails to the app are processed as HTTP requests with MIME data, requiring configuration to associate email addresses with specific script handlers.\u003c/p\u003e\n"],["\u003cp\u003eTo enable incoming email, the \u003ccode\u003einbound_services\u003c/code\u003e section with the \u003ccode\u003e- mail\u003c/code\u003e parameter must be added to the \u003ccode\u003eapp.yaml\u003c/code\u003e file in the default service.\u003c/p\u003e\n"],["\u003cp\u003eEmail URLs, formatted as \u003ccode\u003e/_ah/mail/[ADDRESS]\u003c/code\u003e, must be mapped to handlers in the \u003ccode\u003eapp.yaml\u003c/code\u003e file to route incoming emails to the correct script.\u003c/p\u003e\n"],["\u003cp\u003eThe \u003ccode\u003eInboundMailHandler\u003c/code\u003e class, which must be subclassed, should be used to manage incoming emails, and its \u003ccode\u003ereceive()\u003c/code\u003e method should be overridden to process email messages.\u003c/p\u003e\n"],["\u003cp\u003eThe development server allows simulating incoming emails for testing purposes through its console, which can be used to test the email handlers.\u003c/p\u003e\n"]]],[],null,["# Receiving Email\n\nEmail messages sent to your app are implemented as HTTP requests containing MIME\ndata. To process incoming email messages, you associate email addresses with\nscript handlers in your app configuration, then include the handlers in your\napp's code.\n| This page describes how to use the legacy bundled services and APIs. This API can only run in first-generation runtimes in the App Engine standard environment. If you are updating to the App Engine Python 3 runtime, refer to the [migration guide](/appengine/migration-center/standard/migrate-to-second-gen/python-differences) to learn about your migration options for legacy bundled services.\n\nIncoming email generates HTTP requests, which are passed to the appropriate\nscripts. The scripts that handle the incoming email must reside in your default\nservice.\n\nFor more information on the Mail service, see the\n[Mail API Overview](/appengine/docs/legacy/standard/python/mail).\n\nConfiguring your application to receive email\n---------------------------------------------\n\nWhen you create a new app, incoming email is disabled by default. To enable the\nincoming email, you must modify your `app.yaml` file in your default service.\n\n1. Add an `inbound_services` section that enables the incoming email service.\n For example:\n\n inbound_services:\n - mail\n\n If you don't enable incoming email by including this section in your\n configuration file, then incoming email is disabled, and email messages sent\n to the app are ignored.\n2. Add mappings that associate URL-mapped email addresses with script handlers.\n\n For the [default service](/appengine/docs/legacy/standard/python/configuration-files#the_default_service), the email address for receiving email has the following format: \n\n [STRING]@[Google Cloud project ID].appspotmail.com\n\n For non-default services, the email address has the following format: \n\n [STRING]@[servicename]-dot-[Google Cloud project ID].appspotmail.com\n\n Email messages are sent to your app as HTTP POST requests using the\n following URL, where \u003cvar translate=\"no\"\u003e[ADDRESS]\u003c/var\u003e is a full email address, including\n domain name: \n\n /_ah/mail/[ADDRESS]\n\n To handle incoming email in your app, map email URLs to handlers in the\n `app.yaml` file: \n\n - url: /_ah/mail/.+\n script: handle_incoming_email.app\n login: admin\n\n In the above example, `/_ah/mail/.+` matches all email addressed to the app.\n If you prefer, you can set up multiple handlers for different email\n addresses, as in the following example: \n\n - url: /_ah/mail/owner@.*your_app_id\\.appspotmail\\.com\n script: handle_owner.app\n login: admin\n - url: /_ah/mail/support@.*your_app_id\\.appspotmail\\.com\n script: handle_support.app\n login: admin\n - url: /_ah/mail/.+\n script: handle_catchall.app\n login: admin\n\n URLs of incoming email messages are matched to this list from first to last,\n so if an email message URL matches more than one pattern, the first matching\n handler will be the one executed. This allows you to include a \"catchall\"\n handler as the last mapping. The handlers run in the default module (or\n application version).\n\nHandling incoming email\n-----------------------\n\nThe Python SDK defines `InboundMailHandler`, a webapp class for handling\nincoming email. `InboundMailHandler` is in the\n[`google.appengine.ext.webapp.mail_handlers`](/appengine/docs/legacy/standard/python/refdocs/google.appengine.ext.webapp.mail_handlers)\npackage.\n\nTo use `InboundMailHandler`:\n\n1. Create a subclass for `InboundMailHandler` and override the `receive()` method.\n2. Call the `receive()` method with an argument of class `InboundEmailMessage`, defined by the Python SDK.\n\nFor example, you can create an instance of `InboundEmailMessage` like this: \n\n import logging\n\n from google.appengine.ext.webapp.mail_handlers import InboundMailHandler\n import webapp2\n\n\n class LogSenderHandler(InboundMailHandler):\n def receive(self, mail_message):\n logging.info(\"Received a message from: \" + mail_message.sender)\n\n| **Note:** Even if you are using the [webapp2](/appengine/docs/legacy/standard/python/tools/webapp2) framework, you still need to use the `InboundMailHandler` class provided by the old `webapp` framework. This handler is specific to the App Engine mail service, whereas webapp2 is provided by a third party.\n\n`InboundMailHandler` contains a `mapping()` convenience class method that\nreturns a pair matching all incoming email addresses to the mail handler and of\ncourse you can call it on any subclass of `InboundMailHandler` you code: \n\n app = webapp2.WSGIApplication([LogSenderHandler.mapping()], debug=True)\n\nThe `InboundEmailMessage` object (`mail_message` in this example) contains the\nemail message. Its `bodies()` method returns the bodies within the message. If\nyou call `bodies()` without arguments, it returns an iterator that yields HTML\nbodies first, then plain text bodies. If you want just HTML or just plain text,\nyou can pass an argument to `bodies()`: \n\n plaintext_bodies = mail_message.bodies('text/plain')\n html_bodies = mail_message.bodies('text/html')\n\n for content_type, body in html_bodies:\n decoded_html = body.decode()\n # ...\n\nThe `InboundEmailMessage` object includes attributes to access other message\nfields:\n\n- `subject` contains the message subject.\n- `sender` is the sender's address e.g. `\"Nobody \u003cnobody@example.com\u003e\"`.\n- `to` is a comma-separated list of the message's primary recipients e.g. `\"Joe \u003cjoe@example.com\u003e, Bill \u003cbill@example.com\u003e\"`.\n- `cc` contains a comma-separated list of the cc recipients e.g. `\"Joe \u003cjoe@example.com\u003e, Bill \u003cbill@example.com\u003e\"`.\n- `date` returns the message date.\n- `attachments` is a list of [`Attachment`](/appengine/docs/legacy/standard/python/refdocs/google.appengine.api.mail#google.appengine.api.mail.Attachment) objects, possibly empty.\n- `original` is the complete message, including data not exposed by the other fields such as email headers, as a Python [`email.message.Message`](http://docs.python.org/library/email.message.html).\n\nSimulating incoming messages with the local development server\n--------------------------------------------------------------\n\nOnce you set up your app to handle incoming email, you can use the\ndevelopment server console to simulate incoming email messages:\n\n1. Access the development server as an administrator by going to \u003chttp://localhost:8080/console\u003e and selecting **Sign in as administrator**.\n2. In the development server, click **Inbound Mail** in the navigation.\n3. Fill out the form that appears, and click **Send Email**.\n\n To learn more, including how to get the development server running, see\n [the Python Development Server](/appengine/docs/legacy/standard/python/tools/using-local-server)."]]