def send_day_before_reminder(self) -> None: if not self.should_send_reminder(): return # guarantee that we never send an email twice self.day_before_notification_sent = True self.save() template_vars = self._common_email_vars() text_body = render_to_string('events/email/day_before_reminder.txt', template_vars) html_body = mjml2html( render_to_string('events/email/day_before_reminder.mjml', template_vars)) logger.info( f'Sending reminder to {self.user.email} about {self.event.id} ({self.event.title})' ) send_mail( subject=f'Напоминание о событии: {self.event.title}', from_email='Кочерга <*****@*****.**>', message=text_body, html_message=html_body, recipient_list=[self.user.email], )
def resolve(self, _, info, input): email = input['email'] try: validate_email(email) except django.core.exceptions.ValidationError as e: return { 'ok': False, 'error': '\n'.join(e.messages), } magic_token = get_magic_token(email) params_str = urllib.parse.urlencode({ 'token': magic_token, 'next': input.get('next', '/') }) magic_link = info.context.build_absolute_uri('/login/magic-link' + '?' + params_str) html_email_message = mjml2html( render_to_string('auth/email/login.mjml', {'magic_link': magic_link})) plain_email_message = render_to_string('auth/email/login.txt', {'magic_link': magic_link}) send_mail( subject='Войти на сайт Кочерги', from_email='*****@*****.**', html_message=html_email_message, message=plain_email_message, recipient_list=[email], ) return {'ok': True}
def get_mailchimp_content(self, text_before, text_after, image_url): events = self.events() date2events = {} for event in events: d = timezone.localtime(event.start).strftime('%Y-%m-%d') if d not in date2events: date2events[d] = [] date2events[d].append(event) events_by_date = [ {"date": d, "events": date2events[d]} for d in sorted(date2events.keys()) ] start_month = kocherga.dateutils.inflected_month(self.start) end_month = kocherga.dateutils.inflected_month(self.end) title_dates = '' if start_month == end_month: title_dates = f'{self.start.day} – {self.end.day} {start_month}' else: title_dates = f'{self.start.day} {start_month} – {self.end.day} {end_month}' def date2day(d): dt = datetime.strptime(d, '%Y-%m-%d') weekday = kocherga.dateutils.weekday(dt).capitalize() month = kocherga.dateutils.inflected_month(dt) return f"{weekday}, {dt.day} {month}" mjml = render_to_string( 'events/email/weekly_digest.mjml', { 'text_before': markdown.markdown( text_before, extensions=['markdown.extensions.nl2br'] ), 'text_after': markdown.markdown( text_after, extensions=['markdown.extensions.nl2br'] ), 'image_url': image_url, 'title_dates': title_dates, 'events_by_date': events_by_date, 'date2day': date2day, 'utmify': get_utmify('weekly-digest', 'kocherga-newsletter'), }, ) html = mjml2html(mjml) return { 'title': f'Расписание мероприятий Кочерги на {title_dates}', 'html': html, }
def create_any_draft(training, title, main_md, utm_campaign='email', utm_source='email'): logger.info('Creating campaign draft') campaign = kocherga.mailchimp.api_call( 'POST', 'campaigns', { 'type': 'regular', 'recipients': training_recipients(training), 'settings': common_settings(title), }, ) campaign_id = campaign['id'] logger.info('Generating html content') main_html = markdown.markdown(main_md) mjml = render_to_string( 'ratio/email/campaign.mjml', { 'title': title, 'text': main_html, 'utmify': get_utmify(utm_campaign, utm_source), # TODO - training id }, ) html = mjml2html(mjml) logger.info('Filling campaign content') kocherga.mailchimp.api_call('PUT', f'campaigns/{campaign_id}/content', {'html': html}) return { 'draft_link': kocherga.mailchimp.campaign_web_link(campaign['web_id']), }
def send_promocode_email(self, email: str, promocode: Promocode): template_name = self.promocode_email folder = 'promocode' if not template_name: raise Exception("email template is not configured") check_safe_path(template_name) html_message = mjml2html( render_to_string( f'ratio/email/{folder}/{template_name}.mjml', {'code': promocode.code}, )) title = extract_email_title(html_message) send_mail( subject=title, from_email='Кочерга <*****@*****.**>', html_message=html_message, message=html2text(html_message), recipient_list=[email], )
def send_cancellation_emails(self, notification_message: str): start_local = timezone.localtime(self.start) template_vars = { 'event': self, 'notification_message': notification_message, 'event_date': f"{start_local.day} {inflected_month(start_local)}", } message = mjml2html( render_to_string('events/email/cancelled.mjml', template_vars)) for ticket in self.tickets.all(): logger.info( f'Sending cancellation email to {ticket.user.email} about event {self.pk} ({self.title})' ) send_mail( subject=f'{self.title}: ОТМЕНА', from_email='Кочерга <*****@*****.**>', message=html2text(message), html_message=message, recipient_list=[ticket.user.email], )
def send_confirmation_email(self, signed_in: Optional[bool] = None) -> None: if self.from_timepad: return template_vars = self._common_email_vars(signed_in=signed_in) text_body = render_to_string('events/email/registered.txt', template_vars) html_body = mjml2html( render_to_string('events/email/registered.mjml', template_vars)) logger.info( f'Sending confirmation email to {self.user.email} for event {self.event.uuid} ({self.event.title})' ) send_mail( subject=f'Регистрация на событие: {self.event.title}', from_email='Кочерга <*****@*****.**>', message=text_body, html_message=html_body, recipient_list=[self.user.email], ) logger.info(f'Confirmation email sent to {self.user.email}')
def send_notion_created_email(self, ticket): template_name = self.notion_created_email folder = 'notion_created' if not template_name: raise Exception("email template is not configured") check_safe_path(template_name) html_message = mjml2html( render_to_string( f'ratio/email/{folder}/{template_name}.mjml', { "ticket": ticket, "link": ticket.notion_link }, )) title = extract_email_title(html_message) send_mail( subject=title, from_email='Кочерга <*****@*****.**>', html_message=html_message, message=html2text(html_message), recipient_list=[ticket.email], )