📖 Scenario: You are building a simple Flask web app that can send emails with attachments. This is useful for sending reports, images, or documents directly from your app.
🎯 Goal: Create a Flask app that sends an email with an attachment using Flask-Mail.
📋 What You'll Learn
Create a Flask app instance
Configure Flask-Mail with SMTP server details
Create a route to send an email with an attachment
Use Flask-Mail's Message class to add subject, sender, recipients, body, and attachment
💡 Why This Matters
🌍 Real World
Sending emails with attachments is common in web apps for notifications, reports, invoices, or sharing files directly from the app.
💼 Career
Understanding how to send emails with attachments using Flask-Mail is useful for backend web developers working on user communication features.
Progress0 / 4 steps
1
Set up Flask app and Flask-Mail
Create a Flask app instance called app and initialize Flask-Mail with it using mail = Mail(app). Import Flask and Mail from flask and flask_mail respectively.
Flask
Hint
Remember to import Flask and Mail, then create app and mail.
2
Configure Flask-Mail SMTP settings
Add configuration to app.config for SMTP server: set MAIL_SERVER to 'smtp.example.com', MAIL_PORT to 587, MAIL_USE_TLS to True, MAIL_USERNAME to 'user@example.com', and MAIL_PASSWORD to 'password123'.
Flask
Hint
Set all required mail config keys in app.config before initializing mail.
3
Create a route to send email with attachment
Create a Flask route @app.route('/send-email') with a function send_email(). Inside it, import Message from flask_mail. Create a Message object with subject 'Hello', sender 'user@example.com', recipients list with 'friend@example.com', and body 'This is a test email with attachment.'. Attach a file named 'test.txt' with content 'This is the content of the file.' and MIME type 'text/plain' using msg.attach().
Flask
Hint
Use @app.route to create the route and Message to build the email. Use attach() to add the file.
4
Send the email and return confirmation
Inside the send_email() function, send the email using mail.send(msg). Then return the string 'Email sent!' to confirm the action.
Flask
Hint
Use mail.send(msg) to send the email and return a confirmation string.
Practice
(1/5)
1. What is the main purpose of the attach() method in Flask-Mail when sending emails?
easy
A. To set the email subject
B. To configure the mail server settings
C. To specify the recipient's email address
D. To add files as attachments to the email
Solution
Step 1: Understand Flask-Mail's attach() method
The attach() method is designed to add files as attachments to an email message.
Step 2: Differentiate from other email settings
Setting subject, recipient, or server configuration are done by other methods or configurations, not attach().
Final Answer:
To add files as attachments to the email -> Option D
Quick Check:
attach() adds files to email [OK]
Hint: attach() means adding files to email [OK]
Common Mistakes:
Confusing attach() with setting email subject
Thinking attach() configures server
Using attach() to set recipient address
2. Which of the following is the correct way to attach a file named report.pdf using Flask-Mail's attach() method?
easy
A. msg.attach('report.pdf', 'application/pdf', open('report.pdf', 'r').read())
B. msg.attach('report.pdf', 'application/pdf', open('report.pdf', 'rb').read())
C. msg.attach('report.pdf', 'text/plain', open('report.pdf', 'rb').read())
D. msg.attach('report.pdf', 'application/pdf', 'report.pdf')
Solution
Step 1: Check file mode for reading attachments
Files must be read in binary mode ('rb') to attach correctly, especially PDFs.
Step 2: Verify MIME type correctness
The MIME type for PDF files is 'application/pdf', so it must match the file type.
Final Answer:
msg.attach('report.pdf', 'application/pdf', open('report.pdf', 'rb').read()) -> Option B
A. The attach method requires a filename only, not content
B. The MIME type 'text/plain' is incorrect for text files
C. File should be opened in binary mode ('rb') to attach properly
D. The file should be closed after sending the email
Solution
Step 1: Check file open mode for attachments
Even for text files, Flask-Mail expects file content in bytes, so 'rb' mode is recommended.
Step 2: Validate MIME type and file handling
'text/plain' is correct for text files, and closing file before sending is fine.
Final Answer:
File should be opened in binary mode ('rb') to attach properly -> Option C
Quick Check:
Always open files in 'rb' for attach() [OK]
Hint: Open files in 'rb' mode even for text attachments [OK]
Common Mistakes:
Opening files in text mode ('r') causes attachment issues
Misunderstanding MIME type for text files
Closing file after reading is correct, not an error
5. You want to send an email with multiple attachments using Flask-Mail. Which approach correctly attaches both a PDF and an image file before sending?
msg = Message('Files', sender='me@example.com', recipients=['you@example.com'])
# Attach PDF
with open('doc.pdf', 'rb') as pdf:
msg.attach('doc.pdf', 'application/pdf', pdf.read())
# Attach Image
with open('photo.jpg', 'rb') as img:
msg.attach('photo.jpg', 'image/jpeg', img.read())
mail.send(msg)
hard
A. This code correctly attaches both files and sends the email
B. You must call mail.send() after each attach() call separately
C. Files must be concatenated into one before attaching
D. attach() only supports one file per email, so this fails
Solution
Step 1: Review multiple attach() calls
Flask-Mail allows multiple attach() calls on the same Message object to add multiple files.
Step 2: Confirm file reading and sending
Files are read in binary mode with correct MIME types, and mail.send() is called once after all attachments.
Final Answer:
This code correctly attaches both files and sends the email -> Option A
Quick Check:
Multiple attach() calls before one send() is correct [OK]
Hint: Call attach() multiple times, then send once [OK]
Common Mistakes:
Calling mail.send() multiple times unnecessarily
Trying to merge files before attaching
Believing attach() supports only one file
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.