电子邮件仍然是现代通信的重要方式,掌握用Python发送邮件的技能可以极大提升工作效率。本文将全面介绍如何使用Python实现邮件发送功能,涵盖多种场景和高级应用。
协议 | 端口 | 加密方式 | 用途 |
---|---|---|---|
SMTP | 25/587/465 | SSL/TLS | 发送邮件 |
POP3 | 110/995 | SSL/TLS | 接收邮件 |
IMAP | 143/993 | SSL/TLS | 管理邮件 |
MAIL_SERVERS = {
'gmail': {
'smtp': 'smtp.gmail.com',
'port': 587,
'ssl_port': 465
},
'qq': {
'smtp': 'smtp.qq.com',
'port': 465,
'ssl_port': 465
},
'163': {
'smtp': 'smtp.163.com',
'port': 25,
'ssl_port': 465
}
}
import smtplib
from email.mime.text import MIMEText
def send_email(sender, password, receiver, subject, content):
# 创建邮件内容
msg = MIMEText(content, 'plain', 'utf-8')
msg['From'] = sender
msg['To'] = receiver
msg['Subject'] = subject
try:
# 连接服务器 (以QQ邮箱为例)
server = smtplib.SMTP_SSL('smtp.qq.com', 465)
server.login(sender, password)
server.sendmail(sender, [receiver], msg.as_string())
server.quit()
print("邮件发送成功")
except Exception as e:
print(f"邮件发送失败: {e}")
# 使用示例
send_email(
sender='[email protected]',
password='your_authorization_code', # 注意是授权码不是登录密码
receiver='[email protected]',
subject='Python邮件测试',
content='这是一封来自Python的测试邮件'
)
from email.mime.text import MIMEText
html_content = """
重要通知
您的订单已发货,点击查看详情
"""
msg = MIMEText(html_content, 'html', 'utf-8')
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email import encoders
def send_with_attachment(sender, password, receiver, subject, content, file_path):
msg = MIMEMultipart()
msg['From'] = sender
msg['To'] = receiver
msg['Subject'] = subject
# 添加正文
msg.attach(MIMEText(content, 'plain', 'utf-8'))
# 添加附件
with open(file_path, 'rb') as f:
part = MIMEBase('application', 'octet-stream')
part.set_payload(f.read())
encoders.encode_base64(part)
part.add_header(
'Content-Disposition',
f'attachment; filename="{file_path.split("/")[-1]}"'
)
msg.attach(part)
# 发送邮件(代码同前)
from email.mime.image import MIMEImage
msg = MIMEMultipart()
msg.attach(MIMEText(html_content, 'html', 'utf-8'))
# 嵌入图片
with open('logo.png', 'rb') as img:
image = MIMEImage(img.read())
image.add_header('Content-ID', '' )
msg.attach(image)
邮箱服务 | 获取方式 |
---|---|
QQ邮箱 | 设置→账户→POP3/IMAP服务→生成授权码 |
163邮箱 | 设置→POP3/SMTP/IMAP→客户端授权密码 |
Gmail | 账号→安全性→应用专用密码 |
import os
from dotenv import load_dotenv
load_dotenv() # 加载.env文件
sender = os.getenv('EMAIL_USER')
password = os.getenv('EMAIL_PASSWORD')
from jinja2 import Template
template = Template("""
尊敬的{{ name }}:
您的订单{{ order_id }}已于{{ ship_date }}发货
""")
content = template.render(
name="张三",
order_id="20230815001",
ship_date="2023-08-16"
)
import pandas as pd
# 从Excel读取收件人列表
df = pd.read_excel('contacts.xlsx')
for _, row in df.iterrows():
personalized_content = f"""
尊敬的{row['姓名']}:
您的{row['产品']}购买申请已受理
"""
send_email(
sender=sender,
password=password,
receiver=row['邮箱'],
subject='购买确认通知',
content=personalized_content
)
try:
server = smtplib.SMTP_SSL('smtp.qq.com', 465)
server.login(sender, password)
server.sendmail(sender, [receiver], msg.as_string())
except smtplib.SMTPAuthenticationError:
print("认证失败,请检查用户名和授权码")
except smtplib.SMTPConnectError:
print("无法连接到服务器")
except smtplib.SMTPException as e:
print(f"邮件发送错误: {e}")
finally:
server.quit() if 'server' in locals() else None
import logging
logging.basicConfig(
filename='email.log',
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s'
)
logging.info(f"发送邮件给{receiver},主题:{subject}")
import yagmail
yag = yagmail.SMTP(
user='[email protected]',
password='your_password',
host='smtp.gmail.com'
)
yag.send(
to='[email protected]',
subject='Yagmail测试',
contents=['正文内容', '/本地路径/附件.pdf']
)
from flask import Flask
from flask_mail import Mail, Message
app = Flask(__name__)
app.config['MAIL_SERVER'] = 'smtp.163.com'
app.config['MAIL_PORT'] = 465
app.config['MAIL_USE_SSL'] = True
app.config['MAIL_USERNAME'] = '[email protected]'
app.config['MAIL_PASSWORD'] = 'your_password'
mail = Mail(app)
@app.route('/send')
def send():
msg = Message(
'Flask邮件测试',
sender='[email protected]',
recipients=['[email protected]']
)
msg.body = "这是邮件正文"
mail.send(msg)
return "邮件已发送"
频率控制:避免被识别为垃圾邮件
内容优化:
DKIM/SPF设置:
# SPF记录示例
example.com. TXT "v=spf1 include:spf.mail.qq.com -all"
# DKIM记录(需从邮件服务商获取)
mail._domainkey.example.com. TXT "k=rsa; p=..."
通过本文,您已经掌握了从基础到高级的Python邮件发送技术。无论是简单的通知邮件,还是复杂的批量营销邮件,现在都可以轻松实现。记得在实际应用中遵守相关法律法规和邮件服务商的使用政策。