Как вызвать команду linux mailx из программы Python, а также использовать значение, хранящееся в переменной? - PullRequest
0 голосов
/ 21 июня 2019

Я запускаю команду mailx из программы Python. Программа работает на сервере в AWS, и я использую их Simple Email Service для отправки электронных писем.

До сих пор я жестко программировал имя пользователя и пароль SES для SMTP-сервера непосредственно в скрипте Python. Сейчас я переключаюсь на получение имени пользователя и пароля с помощью вызова API для AWS для повышения безопасности.

Как я могу переработать программу Python для вызова команды mailx, используя имя пользователя и пароль, хранящиеся в переменных SESUsername и SESPassword? Команда 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 голосов
/ 21 июня 2019

У вас есть две ошибки: вы хотите избежать subprocess.Popen и хотите избежать 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 сам по себе не является неправильным, но он требует много работы, о которой, конечно же, заботятся высокоуровневые функции и которая отсутствует в вашем коде.

0 голосов
/ 21 июня 2019

Вы строите командную строку, и у вас есть строковые аргументы в переменных, поэтому соберите все вместе. Я бы использовал формат :

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)
...