问题描述
我已经尝试解决这个问题有一段时间了,但一直在寻找不完美的解决方案 - 我认为我想做的事情是可能的,但也许我没有正确地表达我的 Google 搜索。
我有一个 Python 脚本,可以向用户发送电子邮件通知 - 为了发送所述电子邮件,我需要在脚本中提供密码才能发送电子邮件。代码运行良好,但它要求我将密码传递给脚本:
def send_email():
import smtplib
import ssl
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
sender_email = "my-generic-email@gmail.com"
receiver_email = "recipient@gmail.com"
password = "my_password_here"
message = MIMEMultipart("alternative")
message["Subject"] = "subject_here"
message["From"] = sender_email
message["To"] = receiver_email
# Create the plain-text and HTML version of your message
text = f"""\
Plain text body here
"""
# Create secure connection with server and send email
context = ssl.create_default_context()
with smtplib.SMTP_SSL("smtp.gmail.com",465,context=context) as server:
server.login(sender_email,password)
server.sendmail(
sender_email,receiver_email,message.as_string()
)
出于显而易见的原因,我不想将密码存储为纯文本。我想过环境变量,但这不起作用,因为这将部署在 GitHub 上供其他人使用(或作为 EXE 安装),因此这会破坏电子邮件功能。
我曾尝试查看 PyCryptodome,但到目前为止我发现的任何内容都建议使用密钥加密密码,然后将密钥存储在脚本中以在您使用密码时解密密码。这对我来说似乎是个坏主意,因为任何新手(比如我!)都可以轻松解密,因为密钥存储在脚本中。
有人能帮助我朝着正确的方向前进吗?我完全没有想法,因为坦率地说,我对密码存储/安全几乎一无所知,所以我什至不确定我应该在谷歌上搜索什么!
解决方法
如果其他人必须使用您的密码才能使用您的脚本,那不可能。如果计算机可以读取它,那么用户也会找到读取它的方法。
我建议使用电子邮件服务,用户可以在其中输入自己的 API 密钥或让他们输入自己的 GMail 凭据。
如果我错了,请纠正我,但我认为在这种情况下无法使用您的密码,除非您编写 API 并从您的服务器发送电子邮件。但请不要忘记,在这种情况下,用户可能会使用您的 API 作为发送垃圾邮件的方式。
TL;DR:让用户使用自己的密码。