Enviar y recibir correo con la API Mail

En esta guía se describe cómo usar la API Mail para enviar y recibir correo.

Antes de empezar

Debes registrar tus correos de remitente como remitentes autorizados. Para obtener más información, consulta quién puede enviar correos.

Enviar correo

Para enviar correo desde tu aplicación, sigue estos pasos:

  1. Usa el tipo mail.Message para definir el remitente, el destinatario, el asunto y el cuerpo del mensaje.

  2. Envía el correo con la función mail.Send.

En el siguiente ejemplo se envía un mensaje de correo al usuario para confirmar que ha creado una cuenta en la aplicación:

import (
	"bytes"
	"fmt"
	"net/http"

	"google.golang.org/appengine"
	"google.golang.org/appengine/log"
	"google.golang.org/appengine/mail"
)

func confirm(w http.ResponseWriter, r *http.Request) {
	ctx := appengine.NewContext(r)
	addr := r.FormValue("email")
	url := createConfirmationURL(r)
	msg := &mail.Message{
		Sender:  "Example.com Support <support@example.com>",
		To:      []string{addr},
		Subject: "Confirm your registration",
		Body:    fmt.Sprintf(confirmMessage, url),
	}
	if err := mail.Send(ctx, msg); err != nil {
		log.Errorf(ctx, "Couldn't send email: %v", err)
	}
}

const confirmMessage = `
Thank you for creating an account!
Please confirm your email address by clicking on the link below:

%s
`

Recibir correo

Puedes configurar tu aplicación para que reciba correos en direcciones con el siguiente formato:

anything@appid.appspotmail.com

Para recibir correos, haz lo siguiente:

  1. Habilita el correo entrante en el archivo app.yaml de tu aplicación:

    inbound_services:
    - mail
  2. Configura un controlador para procesar los correos entrantes, que se proporcionan a tu aplicación como datos MIME en una solicitud HTTP POST.

    1. En tu aplicación, registra un controlador en la ruta /_ah/mail/:

      func init() {
      	http.HandleFunc("/_ah/mail/", incomingMail)
      }
      
    2. En el controlador, lee los datos del correo del *http.Request:

      func incomingMail(w http.ResponseWriter, r *http.Request) {
      	ctx := appengine.NewContext(r)
      	defer r.Body.Close()
      	var b bytes.Buffer
      	if _, err := b.ReadFrom(r.Body); err != nil {
      		log.Errorf(ctx, "Error reading body: %v", err)
      		return
      	}
      	log.Infof(ctx, "Received mail: %v", b)
      }
      

    Puedes usar el paquete net/mail de la biblioteca estándar para analizar mensajes de correo.