Compare commits
	
		
			4 Commits
		
	
	
		
			0b4891703d
			...
			83d6799e53
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 83d6799e53 | |||
| 4181ff8455 | |||
| b58e8c188b | |||
| ea8490747f | 
							
								
								
									
										39
									
								
								client/index.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								client/index.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,39 @@ | ||||
| function message (level, text) { | ||||
|     const messageContainer = document.getElementById('contact-mailer-message') | ||||
|     const messageElement   = document.createElement('p') | ||||
|     messageContainer.appendChild(messageElement) | ||||
|     messageElement.textContent = text | ||||
|     messageElement.classList.add('contact-mailer-message') | ||||
|     messageElement.classList.add('contact-mailer-message-'+level) | ||||
|     setTimeout(() => { | ||||
|         messageContainer.removeChild(messageElement) | ||||
|     }, 10000) | ||||
| } | ||||
| 
 | ||||
| function interceptForm (formId) { | ||||
|     /* | ||||
|      * This function intercepts a form submission and send it via XHR. | ||||
|      * Param formId is the HTML id of the form | ||||
|      */ | ||||
|     const formElem = document.getElementById(formId) | ||||
|     formElem.onsubmit = async (e) => { | ||||
|         e.preventDefault() | ||||
|         fetch(formElem.action, { | ||||
|             method: formElem.method, | ||||
|             body: new FormData(formElem) | ||||
|         }) | ||||
|         .then(data => { | ||||
|             if (!data.ok || data.status == 500) { | ||||
|                 message('error', 'Erreur du service d’envoi. Réessayez plus tard ou contactez https://jean-cloud.net') | ||||
|             } else if (data.ok || data.status == 200) { | ||||
|                 message('success', 'Le message a bien été envoyé !') | ||||
|                 formElem.reset() | ||||
|             } | ||||
|         }) | ||||
|         .catch((error) => { | ||||
|             message('error', 'Impossible d’envoyer le formulaire. Vérifiez votre connexion internet ou réessayez plus tard.') | ||||
|         }) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| interceptForm ('contact-mailer-form') | ||||
							
								
								
									
										24
									
								
								client/style.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								client/style.css
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,24 @@ | ||||
| .contact-mailer-form { | ||||
|      | ||||
| } | ||||
| 
 | ||||
| .contact-mailer-message { | ||||
|     border: 1px solid; | ||||
|     padding: 3px; | ||||
|     border-radius: 2px; | ||||
| } | ||||
| 
 | ||||
| .contact-mailer-message-error { | ||||
|     color: red; | ||||
|     border-color: red; | ||||
| } | ||||
| 
 | ||||
| .contact-mailer-message-success { | ||||
|     color: green; | ||||
|     border-color: green; | ||||
| } | ||||
| 
 | ||||
| .contact-mailer-message-info { | ||||
|     color: blue; | ||||
|     border-color: blue; | ||||
| } | ||||
							
								
								
									
										22
									
								
								main.py
									
									
									
									
									
								
							
							
						
						
									
										22
									
								
								main.py
									
									
									
									
									
								
							| @ -1,7 +1,6 @@ | ||||
| import bottle | ||||
| request  = bottle.request | ||||
| response = bottle.response | ||||
| redirect = bottle.redirect | ||||
| import smtplib | ||||
| from email.mime.text import MIMEText | ||||
| from email.mime.multipart import MIMEMultipart | ||||
| @ -17,11 +16,6 @@ import datetime # to name unsent mails | ||||
| 
 | ||||
| ##################################################### Bottle stuff ############################################ | ||||
| 
 | ||||
| # The exception that is thrown when an argument is missing | ||||
| class MissingParameterException (Exception): | ||||
|     pass | ||||
| 
 | ||||
| 
 | ||||
| class StripPathMiddleware(object): | ||||
|     ''' | ||||
|     Get that slash out of the request | ||||
| @ -37,6 +31,11 @@ app = application = bottle.Bottle(catchall=False) | ||||
| 
 | ||||
| 
 | ||||
| ##################################################### Configuration ############################################ | ||||
| 
 | ||||
| # The exception that is thrown when an argument is missing | ||||
| class MissingParameterException (Exception): | ||||
|     pass | ||||
| 
 | ||||
| def get_env(var, default=None): | ||||
|     """var is an env var name, default is the value to return if var does not exist. If no default and no value, an exception is raised.""" | ||||
|     if var in os.environ: | ||||
| @ -92,13 +91,14 @@ mongodb_database = mongodb_client[mongodb_dbname] | ||||
| 
 | ||||
| @app.post('/submit') | ||||
| def submission (): | ||||
|     # Getting subject | ||||
|     # Getting token | ||||
|     if 'token' in request.forms: | ||||
|         token = request.forms.getunicode('token') | ||||
|     else: | ||||
|         response.status = 400 | ||||
|         return 'Le jeton d’autentification est requis' | ||||
| 
 | ||||
|     # Getting mail address | ||||
|     if 'mail' in request.forms: | ||||
|         from_address = request.forms.getunicode('mail') | ||||
|     else: | ||||
| @ -109,13 +109,11 @@ def submission (): | ||||
|     try: | ||||
|         form = mongodb_database['forms'].find({'token': token})[0] | ||||
|     except IndexError as e: | ||||
|         save_mail (token, form['mail'], from_address, subject, content) | ||||
|         response.status = 400 | ||||
|         return 'Le formulaire est introuvable. Le mail a été sauvegardé et sera traité à la main.' | ||||
|         return 'Le formulaire demandé est introuvable, merci de vérifier que le token utilisé est le bon' | ||||
|     except pymongo.errors.ServerSelectionTimeoutError as e: | ||||
|         save_mail (token, form['mail'], from_address, subject, content) | ||||
|         response.status = 500 | ||||
|         return 'La base de donnée n’est pas accessible. Votre message a été enregistré, il sera remis manuellement à son destinataire.' | ||||
|         return 'La base de donnée n’est pas accessible.' | ||||
| 
 | ||||
|     try: | ||||
|         subject_fields = fill_fields(request, get_fields(form['subject'])) | ||||
| @ -145,7 +143,7 @@ def submission (): | ||||
| 
 | ||||
| 
 | ||||
|     # Redirection | ||||
|     #redirect(success_redirect_default) | ||||
|     #bottle.redirect(success_redirect_default) | ||||
|     origin = request.headers.get('origin') | ||||
|     return '<p>Mail envoyé !</p>' + ('<p>Retour au <a href="{}">formulaire de contact</a></p>'.format(origin) if origin else '') | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										31
									
								
								test.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								test.html
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,31 @@ | ||||
| <!DOCTYPE html> | ||||
| <html> | ||||
| <head> | ||||
|     <meta charset="utf-8" /> | ||||
|     <link rel="stylesheet" href="./client/style.css" /> | ||||
| </head> | ||||
| <body> | ||||
| <div id="contact-mailer-message"></div> | ||||
| <form action="http://localhost:8080/submit" method="POST" id="contact-mailer-form"> | ||||
|     <input type="hidden" name="token" value="s0y6WANzU1XnYERoJxMwekP9pqilSVLK5Gbf3hmZadHB2rQ4u8" /> | ||||
|     <div> | ||||
|       <label for="nom">Votre nom :</label> | ||||
|       <input type="text" name="nom" required="required"/> | ||||
|     </div> | ||||
|     <div> | ||||
|       <label for="mail">Adresse mail :</label> | ||||
|       <input type="email" name="mail" required="required"/> | ||||
|     </div> | ||||
|     <div> | ||||
|       <label for="objet">Objet :</label> | ||||
|       <input type="text" name="objet" /> | ||||
|     </div> | ||||
|     <div> | ||||
|       <label for="objet">Votre message :</label> | ||||
|       <textarea name="message" required="required"></textarea> | ||||
|     </div> | ||||
|     <input type="submit" /> | ||||
| </form> | ||||
| <script src="./client/index.js"></script> | ||||
| </body> | ||||
| </html> | ||||
							
								
								
									
										25
									
								
								test/docker-compose.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								test/docker-compose.yml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,25 @@ | ||||
| version: '3' | ||||
| services: | ||||
|     db: | ||||
|         image: mongo | ||||
|      | ||||
|     mailer: | ||||
|         build: .. | ||||
|         volumes: | ||||
|             - ../main.py:/usr/src/app/main.py | ||||
|             - ./uwsgi:/tmp/uwsgi | ||||
|         depends_on: | ||||
|             - db | ||||
|         environment: | ||||
|             MONGODB_HOST: db | ||||
|             SMTP_SERVER_ADDRESS: 'lol' | ||||
|             SMTP_SERVER_PORT: 994 | ||||
|             SMTP_SERVER_USERNAME: toto | ||||
|             SMTP_SERVER_PASSWORD: lol | ||||
|             SMTP_SERVER_SENDER: moi | ||||
|             ADMIN_PASSWORD: admin | ||||
|             SMTP_SSL: 'true' | ||||
|     proxy: | ||||
|         image: nginx | ||||
|         ports: | ||||
|             - 8080:8080 | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user