我正在从Python程序内部运行mailx命令。该程序在AWS的服务器上运行,我正在使用其简单电子邮件服务发送电子邮件。
到目前为止,我一直在将SMTP服务器的SES用户名和密码直接硬编码到Python脚本中。我现在转而通过对AWS的API调用来获取用户名和密码,以提高安全性。
如何使用存储在变量SESUsername和SESPassword中的用户名和密码来重新构造Python程序以调用mailx命令? mailx命令使用smtp-auth-user和smtp-auth-password参数。
这是两条Python行:
command = "mailx -v -s \"Subject\" -S ssl-verify=ignore -S smtp-auth=login -S smtp=smtps://email-smtp.us-west-2.amazonaws.com:465 -S from=\"A Person<email@domain.com>\" -S replyto=\"Another Person<email2@domain2.com>\" -S smtp-auth-user=XXXXX -S smtp-auth-password=XXXXX -S nss-config-dir=\"/etc/pki/nssdb/\" person3@domain3.com"
subprocess.Popen(command,shell=True)
答案 0 :(得分:0)
您正在构建命令字符串,并且变量中包含字符串参数,因此请将这些内容放在一起。我会使用format:
command = "...{}...{}...".format(SESUsername, SESPassword)
subprocess.Popen(command,shell=True)
只要用户名和密码中不包含会引起Popen
中的命令解析的特殊字符,这将起作用。但是,Popen
确实接受字符串的序列,这在您的情况下更有意义。它将大大提高代码的可读性:
command = ['mailx', '-v', '-s', "Subject",...
'-S', '-smtp-auth-user='+SESUsername,
'-S', 'smtp-auth-password='+SESPassword,
...]
subprocess.Popen(command,shell=True)
答案 1 :(得分:0)
您有两个错误:您想避免使用subprocess.Popen
,而您想使用avoid shell=True
。如果您有足够新的Python,请使用subprocess.run()
:
result = subprocess.run(
['mailx', '-v', '-s', 'Subject',
'-S', 'ssl-verify=ignore', '-S', 'smtp-auth=login',
'-S', 'smtp=smtps://email-smtp.us-west-2.amazonaws.com:465',
'-S', 'from=A Person', '-S', 'replyto=Another Person',
'-S', 'smtp-auth-user={}'.format(user),
'-S', 'smtp-auth-password={}'.format(pass),
'-S', 'nss-config-dir=/etc/pki/nssdb/',
'person3@domain3.com'],
check=True)
(请注意,删除外壳如何消除许多讨厌的外壳引用。)
如果您的Python太旧而无法使用subpsocess.run
,请尝试subprocess.check_call
。低级Popen
本身并没有错,但是它需要大量的工作,当然高级别的功能会为您服务,而您的代码中似乎缺少这些功能。