Сценарий CGI электронной почты Python отправляет дубликаты электронной почты - PullRequest
2 голосов
/ 28 июня 2011

Я экспериментировал со скриптом Python CGI для отправки электронного письма (размещенного на коммерческом веб-хосте - 123reg), и проблема заключается в том, что всякий раз, когда я запускаю скрипт из своего веб-браузера, он отправляет два идентичных электронных сообщения. почты.

Код для отправки почты определенно выполняется только один раз, нет циклов, которые могли бы вызвать его дважды, я определенно не нажимаю кнопку дважды. Не выдается никаких исключений, и страница «успеха» отправляется в браузер как обычно.

Самое странное, что когда я закомментирую код для печати страницы результатов (которая очень проста и не имеет побочных эффектов, всего 3 оператора печати в строке) и заменю ее фиктивным оператором печати (print) Content -type: text / plain \ n \ ntest "), работает правильно и отправляет только одно электронное письмо.

Я пытался найти решение проблемы, но безрезультатно.

Я нахожусь в конце своего ума, потому что эта проблема не имеет никакого смысла для меня. Я почти уверен, что это мой сценарий, потому что он необъяснимо работает, когда вы закомментируете эти операторы печати. ​​

Буду признателен за любую помощь, спасибо.

EDIT:

Вот код, который, закомментировав, исправляет проблему:

  print "Content-type: text/html"
  print
  print page

EDIT:

Код для отправки электронного письма:

#send_email function: sends message from from_addr, assumes valid input
def send_email(from_addr, message):
  #form the email headers/text:
  email =  "From: " + from_addr + "\n"
  email += "To: " + TO[0] + "\n"
  email += "Subject: " + SUBJECT + "\n"
  email += "\n"
  email += message

  #return true for success, false for failure:
  try:
      server = smtplib.SMTP(SERVER)
      server.sendmail(from_addr, TO, email)
      server.quit()
      return True;
  except smtplib.SMTPException:
      return False;
#end of send_email function

Я бы опубликовал код для форматирования переменной страницы, но все, что он делает, это читает из файла, форматирует строку и возвращает строку. Ничего необычного не происходит.

EDIT

ОК, я закомментировал код ввода-вывода файла в функции create_page, и это решает проблему, но я не понимаю, почему, и я не знаю, как изменить его, чтобы он работал правильно.

Функция create_page, и, следовательно, файл IO, все еще выполнялась, когда я обнаружил, что комментирование операторов печати решило проблему.

Это код файлового ввода-вывода, который был до того, как я его закомментировал (он находится в самом начале функции create_page, а остальная часть функции просто изменяет строку страницы, а затем возвращает ее):

  #read the template from the file:
  frame_f = open(FRAME)
  page = frame_f.read()
  frame_f.close()

EDIT:

Я только что заменил файловый ввод-вывод, скопировав и вставив текст файла непосредственно в строку в моем исходном файле, поэтому файловый ввод-вывод больше не существует. Это до сих пор не решило проблему. На данный момент моя единственная теория - компьютеры ненавидят меня ...

EDIT:

Мне придется опубликовать это здесь, так как stackoverflow не позволит мне ответить на мой собственный вопрос, так как я новичок здесь ...

EDIT:

ОК, я опубликовал его как актуальный ответ.

Ответы [ 3 ]

2 голосов
/ 28 июня 2011

ПРОБЛЕМА РЕШЕНА!

Оказывается, это была ошибка браузера все время. Причина, по которой я не заметил этого раньше, заключалась в том, что я тестировал его в Firefox и Chrome давным-давно, чтобы исключить браузер, однако оказалось, что и Chrome, и Firefox имеют одну и ту же ошибку.

Я понял, что происходило, когда наконец обновлялись журналы сервера, я понял, что часто GET-запросы немедленно (через 1 секунду) сопровождались другим GET-запросом. Я немного погуглил и нашел это:

Что заставляет Firefox делать запрос GET после отправки формы методом POST?

Оказывается, если у вас есть тег img с пустым атрибутом src, например

<img src=""/>

(у меня был какой-то javascript, который изменил этот тег), Firefox отправит дублирующий GET-запрос вместо запроса на изображение. Также оказывается, что Chrome имеет ту же проблему. Это также объясняет, почему проблема возникала только тогда, когда я пытался включить свой HTML-шаблон.

1 голос
/ 28 июня 2011

Было бы полезно, если бы вы разместили больше кода, но содержит ли переменная «page» код, который будет запускать сервер электронной почты во второй раз, или вызвать обновление страницы, которое вызовет электронную почту во второй раз.

0 голосов
/ 11 июня 2013

То же самое произойдет, если у вас есть вызов Javascript с пустым src или "#" как src:

<script type="text/javascript" src="#"></script>

Возможно, также с пустым href для ссылки css.Я не испытывал этого, но ожидал бы того же поведения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...