Обеспечение того, чтобы электронная почта контактной формы не была потеряна (python)

У меня есть сайт с формой обратной связи. Пользователь отправляет имя, адрес электронной почты и сообщение, и сайт отправляет мне подробности по электронной почте.

Очень редко на моем сервере возникают проблемы с системой электронной почты, поэтому пользователь получает сообщение об ошибке, и эти контактные данные теряются. (Не говорите: найдите лучший сервер, на любом сервере может время от времени падать электронная почта, и мы получаем много заявок).

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

Но как хранить данные?

Я использую python, поэтому подумал об использовании shelve (однофайловая полубаза данных) . Или, может быть, кто-то может предложить лучший формат данных? (Я действительно думаю, что полное решение для базы данных было бы излишним.)

Проблема, которую я вижу при подходе с одним файлом, заключается в условиях гонки: два или более ошибочных сообщения электронной почты в одно и то же время вызовут два изменения в файле данных, что приведет к повреждению данных.

Так что делать? Многофайловое решение, блокировка файлов или что-то еще?


person Tom Viner    schedule 12.01.2009    source источник


Ответы (3)


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

person Jeremy    schedule 12.01.2009
comment
+1: Сохранить в базе данных. Электронная почта отдельно. Всегда один и тот же процесс. Никаких особых случаев. - person S.Lott; 12.01.2009

попробуйте sqlite. Он имеет привязки python по умолчанию в стандартной библиотеке и должен работать при полезном уровне нагрузки. (или мне так сказали)

person Andrew Cox    schedule 12.01.2009

Вы можете, как было предложено, использовать sqlite для этого. Главный вопрос: как у человека "много представлений"? Я ниже нескольких в секунду, это сработает. В противном случае файл базы данных будет постоянно заблокирован, и у вас возникнет другая проблема.

Но вы также можете сделать это простым, глупым и простым: записывать файлы на диск. При каждой отправке файл записывается во временную директорию (если почтовый сервер не работает). Затем вы добавляете несколько строк в сценарий запуска почтового сервера, который считывает каталог и отправляет почту. Никаких баз данных, никаких проблем с блокировкой, и если вы используете каталог, для которого установлена ​​квота (или виртуальный диск с фиксированным размером), вы не должны столкнуться с какими-либо проблемами.

person Martin Thurau    schedule 12.01.2009