如何从Python程序内部调用linux mailx命令,以及如何使用存储在变量中的值?

时间:2019-06-21 19:10:42

标签: python mailx

我正在从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)

2 个答案:

答案 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本身并没有错,但是它需要大量的工作,当然高级别的功能会为您服务,而您的代码中似乎缺少这些功能。