Я экспериментировал со скриптом 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:
ОК, я опубликовал его как актуальный ответ.