app.config.update(
MAIL_SERVER='smtp.sendgrid.net',
MAIL_PORT=587,
MAIL_USERNAME='apikey', # literal string, not your key
MAIL_USE_TLS=True,
MAIL_DEFAULT_SENDER='[YOUR_VERIFIED_SENDER]' # verified sender
)
Set MAIL_PASSWORD from the SENDGRID_API_KEY environment variable (for example via os.environ when building config). Do not hardcode it.
Then:
from flask_mail import Mail, Message
mail = Mail(app)
msg = Message('subject here', recipients=['[RECIPIENT_EMAIL]'])
msg.body = 'plain body'
mail.send(msg)
Checklist:
1. MAIL_USERNAME is exactly 'apikey'.
2. MAIL_USE_TLS True with port 587. Port 465 wants MAIL_USE_SSL instead.
3. MAIL_DEFAULT_SENDER must be a verified sender.
4. In tests, suppress sending (MAIL_SUPPRESS_SEND) or point at sandbox mode so CI stays quiet.