Launchd и cron не могут отправлять электронные письма из автоматизированных скриптов python и завершаются ошибкой с помощью: smtplib.SMTPServerDisconnected: пожалуйста, сначала запустите connect()

#python #macos #cron #smtplib #launchd

#python #macos #cron #smtplib #launchd

Вопрос:

Я хочу настроить автоматическое резервное копирование для своего веб-сайта и создал для этого рабочий скрипт python. Сначала я попробовал планирование launchd , а затем cron и для них обоих я получил тот же результат: резервное копирование работает, но уведомление по электронной почте завершается с ошибкой.

Скрипт на 100% работает так, как задумано, при запуске из Terminal или Sublime Text 3 , и я использую macOS Catalina версии 10.15.7.

Журнал ошибок для обоих launchd и cron таков:

 Exception in thread Thread-1:
Traceback (most recent call last):
  File "/usr/local/Cellar/python/3.7.6_1/Frameworks/Python.framework/Versions/3.7/lib/python3.7/threading.py", line 926, in _bootstrap_inner
    self.run()
  File "/usr/local/Cellar/python/3.7.6_1/Frameworks/Python.framework/Versions/3.7/lib/python3.7/threading.py", line 870, in run
    self._target(*self._args, **self._kwargs)
  File "/usr/local/lib/python3.7/site-packages/fast_email/fast_email.py", line 95, in send
    server.ehlo()
  File "/usr/local/Cellar/python/3.7.6_1/Frameworks/Python.framework/Versions/3.7/lib/python3.7/smtplib.py", line 440, in ehlo
    self.putcmd(self.ehlo_msg, name or self.local_hostname)
  File "/usr/local/Cellar/python/3.7.6_1/Frameworks/Python.framework/Versions/3.7/lib/python3.7/smtplib.py", line 367, in putcmd
    self.send(str)
  File "/usr/local/Cellar/python/3.7.6_1/Frameworks/Python.framework/Versions/3.7/lib/python3.7/smtplib.py", line 359, in send
    raise SMTPServerDisconnected('please run connect() first')
smtplib.SMTPServerDisconnected: please run connect() first
  

Часть моего пакета fast_email, в которой возникает ошибка ( server.ehlo() строка):

 def send(msg_data, d):
    server = smtplib.SMTP_SSL(d['EMAIL_SERVER'], d['EMAIL_PORT'])
    server.ehlo()
    server.login(d['EMAIL_SENDER'], d['EMAIL_PASSWORD'])

    message = MIMEMultipart("alternative")
    message["From"] = d['EMAIL_SENDER']
  

Если это может иметь значение, я использую threads ( threading.Thread ) в своем пакете fast_email, потому что иногда я хочу быстро отправлять электронные письма людям в моей компании.

Проблема очень неприятная, и я потратил на нее целый день в одиночку, не говоря уже о других проблемах с launchd… Пожалуйста, если у вас есть какие-либо подсказки, я буду очень благодарен.

PS моя строка задания cron:

 0 9 * * * (/usr/local/bin/python3 my/script/pathname.py > /Users/my_username/Desktop/cronjob.log 2>amp;1)
  

и у меня есть

 <key>AbandonProcessGroup</key>
<true/>
  

в моем файле launchd .plist .

Комментарии:

1. Некоторые серверы требуют ehlo повторной проверки подлинности.

2. Круглые скобки в cron задании не добавляют ценности и стоят вам процесса.

3. @tripleee Если бы это было серверной задачей, это также привело бы к сбою при запуске с терминала. И он вылетает на первом ehlo, поэтому у второго не будет возможности помочь. Спасибо за подсказку в скобках, я просто использовал то, что видел в каком-то руководстве. Почему использование круглых скобок будет стоить мне процесса?

4. Вот что делают круглые скобки; выполняйте команды в отдельной подоболочке.