@@ 358-426 (lines=69) @@ | ||
355 | message |
|
356 | ) |
|
357 | ||
358 | def notify_created_account( |
|
359 | self, |
|
360 | user: User, |
|
361 | password: str, |
|
362 | ) -> None: |
|
363 | """ |
|
364 | Send created account email to given user. |
|
365 | ||
366 | :param password: choosed password |
|
367 | :param user: user to notify |
|
368 | """ |
|
369 | # TODO BS 20160712: Cyclic import |
|
370 | logger.debug(self, 'user: {}'.format(user.user_id)) |
|
371 | logger.info(self, 'Sending asynchronous email to 1 user ({0})'.format( |
|
372 | user.email, |
|
373 | )) |
|
374 | ||
375 | async_email_sender = EmailSender( |
|
376 | self.config, |
|
377 | self._smtp_config, |
|
378 | self.config.EMAIL_NOTIFICATION_ACTIVATED |
|
379 | ) |
|
380 | ||
381 | subject = \ |
|
382 | self.config.EMAIL_NOTIFICATION_CREATED_ACCOUNT_SUBJECT \ |
|
383 | .replace( |
|
384 | EST.WEBSITE_TITLE, |
|
385 | str(self.config.WEBSITE_TITLE) |
|
386 | ) |
|
387 | message = MIMEMultipart('alternative') |
|
388 | message['Subject'] = subject |
|
389 | message['From'] = self._get_sender() |
|
390 | message['To'] = formataddr((user.get_display_name(), user.email)) |
|
391 | ||
392 | text_template_file_path = self.config.EMAIL_NOTIFICATION_CREATED_ACCOUNT_TEMPLATE_TEXT # nopep8 |
|
393 | html_template_file_path = self.config.EMAIL_NOTIFICATION_CREATED_ACCOUNT_TEMPLATE_HTML # nopep8 |
|
394 | ||
395 | context = { |
|
396 | 'user': user, |
|
397 | 'password': password, |
|
398 | 'logo_url': get_email_logo_frontend_url(self.config), |
|
399 | 'login_url': get_login_frontend_url(self.config), |
|
400 | } |
|
401 | translator = Translator(self.config, default_lang=user.lang) |
|
402 | body_text = self._render_template( |
|
403 | mako_template_filepath=text_template_file_path, |
|
404 | context=context, |
|
405 | translator=translator |
|
406 | ) |
|
407 | ||
408 | body_html = self._render_template( |
|
409 | mako_template_filepath=html_template_file_path, |
|
410 | context=context, |
|
411 | translator=translator |
|
412 | ) |
|
413 | ||
414 | part1 = MIMEText(body_text, 'plain', 'utf-8') |
|
415 | part2 = MIMEText(body_html, 'html', 'utf-8') |
|
416 | ||
417 | # Attach parts into message container. |
|
418 | # According to RFC 2046, the last part of a multipart message, |
|
419 | # in this case the HTML message, is best and preferred. |
|
420 | message.attach(part1) |
|
421 | message.attach(part2) |
|
422 | ||
423 | send_email_through( |
|
424 | config=self.config, |
|
425 | sendmail_callable=async_email_sender.send_mail, |
|
426 | message=message |
|
427 | ) |
|
428 | ||
429 | def notify_reset_password( |
|
@@ 429-494 (lines=66) @@ | ||
426 | message=message |
|
427 | ) |
|
428 | ||
429 | def notify_reset_password( |
|
430 | self, |
|
431 | user: User, |
|
432 | reset_password_token: str, |
|
433 | ) -> None: |
|
434 | """ |
|
435 | Reset password link for user |
|
436 | :param user: user to notify |
|
437 | :param reset_password_token: token for resetting password |
|
438 | """ |
|
439 | logger.debug(self, 'user: {}'.format(user.user_id)) |
|
440 | logger.info(self, 'Sending asynchronous email to 1 user ({0})'.format( |
|
441 | user.email, |
|
442 | )) |
|
443 | translator = Translator(self.config, default_lang=user.lang) |
|
444 | async_email_sender = EmailSender( |
|
445 | self.config, |
|
446 | self._smtp_config, |
|
447 | self.config.EMAIL_NOTIFICATION_ACTIVATED |
|
448 | ) |
|
449 | subject = self.config.EMAIL_NOTIFICATION_RESET_PASSWORD_SUBJECT.replace( |
|
450 | EST.WEBSITE_TITLE, |
|
451 | str(self.config.WEBSITE_TITLE) |
|
452 | ) |
|
453 | message = MIMEMultipart('alternative') |
|
454 | message['Subject'] = subject |
|
455 | message['From'] = self._get_sender() |
|
456 | message['To'] = formataddr((user.get_display_name(), user.email)) |
|
457 | ||
458 | text_template_file_path = self.config.EMAIL_NOTIFICATION_RESET_PASSWORD_TEMPLATE_TEXT # nopep8 |
|
459 | html_template_file_path = self.config.EMAIL_NOTIFICATION_RESET_PASSWORD_TEMPLATE_HTML # nopep8 |
|
460 | # TODO - G.M - 2018-08-17 - Generate token |
|
461 | context = { |
|
462 | 'user': user, |
|
463 | 'logo_url': get_email_logo_frontend_url(self.config), |
|
464 | 'reset_password_url': get_reset_password_frontend_url( |
|
465 | self.config, |
|
466 | token=reset_password_token, |
|
467 | email=user.email, |
|
468 | ), |
|
469 | } |
|
470 | body_text = self._render_template( |
|
471 | mako_template_filepath=text_template_file_path, |
|
472 | context=context, |
|
473 | translator=translator, |
|
474 | ) |
|
475 | ||
476 | body_html = self._render_template( |
|
477 | mako_template_filepath=html_template_file_path, |
|
478 | context=context, |
|
479 | translator=translator, |
|
480 | ) |
|
481 | ||
482 | part1 = MIMEText(body_text, 'plain', 'utf-8') |
|
483 | part2 = MIMEText(body_html, 'html', 'utf-8') |
|
484 | ||
485 | # Attach parts into message container. |
|
486 | # According to RFC 2046, the last part of a multipart message, |
|
487 | # in this case the HTML message, is best and preferred. |
|
488 | message.attach(part1) |
|
489 | message.attach(part2) |
|
490 | ||
491 | send_email_through( |
|
492 | config=self.config, |
|
493 | sendmail_callable=async_email_sender.send_mail, |
|
494 | message=message |
|
495 | ) |
|
496 | ||
497 | def _render_template( |