你是不是也遇到过这样的烦恼:想用Python写个自动发邮件的脚本,结果每次运行都要手动输入邮箱密码,简直太麻烦了!而且,直接把密码写在代码里,总感觉不太安全,万一泄露了可就糟了。别担心,今天我就来分享几个安全又方便的方法,让你彻底告别手动输入密码的烦恼!
方法一:使用 keyring 模块安全存储密码
keyring
是一个专门用来存储和访问密钥的 Python 库,它会将密码存储在操作系统的密钥管理系统中,比如 Windows 的 Credential Manager、macOS 的 Keychain 等。这样,你的密码就不会明文出现在代码里,安全性大大提高。
安装 keyring:
pip install keyring
使用方法:
import keyring
# 设置密码
keyring.set_password("my_email_app", "your_email@example.com", "your_password")
# 获取密码
password = keyring.get_password("my_email_app", "your_email@example.com")
print(password)
代码解释:
keyring.set_password(service_name, username, password)
:用于设置密码,service_name
是你的应用名称,username
是你的邮箱地址,password
是你的邮箱密码。keyring.get_password(service_name, username)
:用于获取密码,需要提供相同的service_name
和username
。
完整示例:
import smtplib
from email.mime.text import MIMEText
import keyring
# 邮箱配置
sender_email = "your_email@example.com"
receiver_email = "recipient@example.com"
subject = "这是一封自动发送的邮件"
body = "邮件内容"
# 从 keyring 获取密码
password = keyring.get_password("my_email_app", sender_email)
# 构造邮件内容
message = MIMEText(body)
message['Subject'] = subject
message['From'] = sender_email
message['To'] = receiver_email
# 连接 SMTP 服务器并发送邮件
try:
with smtplib.SMTP_SSL("smtp.example.com", 465) as server: # 替换为你的 SMTP 服务器地址和端口
server.login(sender_email, password)
server.sendmail(sender_email, receiver_email, message.as_string())
print("邮件发送成功!")
except Exception as e:
print(f"邮件发送失败: {e}")
注意事项:
- 首次运行需要设置密码,之后就可以直接获取了。
- 不同的操作系统,
keyring
的后端存储方式可能不同,具体可以参考keyring
的官方文档。
方法二:使用 dotenv 文件存储密码
.env
文件是一种常用的存储配置信息的文本文件,可以用来存储敏感信息,比如数据库密码、API 密钥等。我们可以把邮箱密码存储在 .env
文件中,然后使用 python-dotenv
库读取。
安装 python-dotenv:
pip install python-dotenv
创建 .env 文件:
在你的脚本所在的目录下创建一个名为 .env
的文件,内容如下:
EMAIL_ADDRESS=your_email@example.com
EMAIL_PASSWORD=your_password
使用方法:
import os
from dotenv import load_dotenv
# 加载 .env 文件
load_dotenv()
# 获取环境变量
email_address = os.getenv("EMAIL_ADDRESS")
email_password = os.getenv("EMAIL_PASSWORD")
print(email_address)
print(email_password)
代码解释:
load_dotenv()
:用于加载.env
文件。os.getenv(key)
:用于获取环境变量,key
是你在.env
文件中定义的变量名。
完整示例:
import smtplib
from email.mime.text import MIMEText
import os
from dotenv import load_dotenv
# 加载 .env 文件
load_dotenv()
# 邮箱配置
sender_email = os.getenv("EMAIL_ADDRESS")
receiver_email = "recipient@example.com"
subject = "这是一封自动发送的邮件"
body = "邮件内容"
# 从 .env 文件获取密码
password = os.getenv("EMAIL_PASSWORD")
# 构造邮件内容
message = MIMEText(body)
message['Subject'] = subject
message['From'] = sender_email
message['To'] = receiver_email
# 连接 SMTP 服务器并发送邮件
try:
with smtplib.SMTP_SSL("smtp.example.com", 465) as server: # 替换为你的 SMTP 服务器地址和端口
server.login(sender_email, password)
server.sendmail(sender_email, receiver_email, message.as_string())
print("邮件发送成功!")
except Exception as e:
print(f"邮件发送失败: {e}")
注意事项:
- 确保将
.env
文件添加到.gitignore
文件中,防止密码泄露到代码仓库。 .env
文件只应该在本地开发环境中使用,不要在生产环境中使用。
方法三:使用配置文件存储密码
除了 .env
文件,你还可以使用其他的配置文件格式,比如 JSON、YAML 等。这种方法更加灵活,可以存储更多的配置信息。
示例(使用 JSON):
创建一个名为 config.json
的文件,内容如下:
{
"email_address": "your_email@example.com",
"email_password": "your_password",
"smtp_server": "smtp.example.com",
"smtp_port": 465
}
使用方法:
import json
# 读取 JSON 文件
with open("config.json", "r") as f:
config = json.load(f)
# 获取配置信息
email_address = config["email_address"]
email_password = config["email_password"]
smtp_server = config["smtp_server"]
smtp_port = config["smtp_port"]
print(email_address)
print(email_password)
print(smtp_server)
print(smtp_port)
完整示例:
import smtplib
from email.mime.text import MIMEText
import json
# 读取 JSON 文件
with open("config.json", "r") as f:
config = json.load(f)
# 邮箱配置
sender_email = config["email_address"]
receiver_email = "recipient@example.com"
subject = "这是一封自动发送的邮件"
body = "邮件内容"
# 从配置文件获取密码
password = config["email_password"]
smtp_server = config["smtp_server"]
smtp_port = config["smtp_port"]
# 构造邮件内容
message = MIMEText(body)
message['Subject'] = subject
message['From'] = sender_email
message['To'] = receiver_email
# 连接 SMTP 服务器并发送邮件
try:
with smtplib.SMTP_SSL(smtp_server, smtp_port) as server:
server.login(sender_email, password)
server.sendmail(sender_email, receiver_email, message.as_string())
print("邮件发送成功!")
except Exception as e:
print(f"邮件发送失败: {e}")
注意事项:
- 和
.env
文件一样,确保将配置文件添加到.gitignore
文件中,防止密码泄露到代码仓库。 - 可以根据需要选择不同的配置文件格式,比如 YAML、TOML 等。
安全建议
无论你选择哪种方法,以下安全建议都应该牢记:
- 不要将密码直接写在代码中! 这是最危险的做法,一旦代码泄露,密码也会跟着泄露。
- 使用强密码! 密码应该足够复杂,包含大小写字母、数字和特殊字符。
- 定期更换密码! 定期更换密码可以降低密码泄露的风险。
- 开启邮箱的两步验证! 两步验证可以大大提高邮箱的安全性,即使密码泄露,攻击者也无法轻易登录你的邮箱。
- 限制脚本的权限! 确保脚本只能访问必要的资源,避免被恶意利用。
总结
以上就是几种安全又方便的 Python 邮件脚本密码存储方法。选择哪种方法取决于你的具体需求和偏好。记住,安全第一!希望这篇文章能帮助你解决问题,让你从此告别手动输入密码的烦恼!祝你编程愉快!
参考资料: