def _send_email(sender, recipients, subject, html, send_async=True): if not isinstance(recipients, list): recipients = list(recipients) if send_async and config['_mailtemplates'][ 'async_sender'] == 'tgext.celery': from mailtemplates.lib.celery_tasks import mailtemplates_async_send_email mailtemplates_async_send_email.delay(subject=subject, sender=sender, recipients=recipients, html=html) elif send_async and config['_mailtemplates'][ 'async_sender'] == 'tgext.asyncjob': from tgext.asyncjob import asyncjob_perform mailer = get_mailer(None) message = Message(subject=subject, sender=sender, recipients=recipients, html=html) asyncjob_perform(mailer.send_immediately, message=message) else: try: mailer = get_mailer(_get_request()) log.debug('using request mailer') except AttributeError: log.debug('using global mailer in not-async context') mailer = get_mailer(None) message = Message(subject=subject, sender=sender, recipients=recipients, html=html) mailer.send_immediately(message)
def test_different_requests_got_different_mailers(self): app = app_with_mailer() resp1 = app.get('/test') mailer1 = get_mailer(resp1.req) resp2 = app.get('/test') mailer2 = get_mailer(resp2.req) self.assertNotEqual(mailer1, mailer2)
def test_registration_duplicate_user(self): resp = self.app.get('/registration') form = resp.form form['email_address'] = '*****@*****.**' form['password_confirm'] = 'p' form['password'] = '******' form['user_name'] = 'user1' resp = form.submit() resp = resp.follow() ctx = resp.req.environ['paste.testing_variables'] assert '<strong>An email</strong> has been sent to <strong>[email protected]</strong>' \ ' to activate the account' in resp.text mailer = get_mailer(ctx['req']) url = find_urls.findall(mailer.outbox[0].body)[0] # Create user in the mean while user = app_model.User(email_address='*****@*****.**', user_name='user1', password='******') try: model.DBSession.add(user) except AttributeError: pass flush_db_changes() resp = self.app.get(url) assert 'Username%20already%20activated' in resp.headers[ 'Set-Cookie'], resp
def test_on_complete_hook(self): def on_complete(reg, email_data): email_data['subject'] = 'CUSTOM SUBJECT: %s' % reg.activation_link email_data['body'] = 'CUSTOM BODY' tg.hooks.register('registration.on_complete', on_complete) resp = self.app.get('/registration') form = resp.form form['email_address'] = '*****@*****.**' form['password_confirm'] = 'p' form['password'] = '******' form['user_name'] = 'user1' resp = form.submit() resp = resp.follow() ctx = resp.req.environ['paste.testing_variables'] assert '<strong>An email</strong> has been sent to <strong>[email protected]</strong>' \ ' to activate the account' in resp.text mailer = get_mailer(ctx['req']) sent_email = mailer.outbox[0] assert sent_email.body == 'CUSTOM BODY' assert sent_email.subject.startswith('CUSTOM SUBJECT') assert sent_email.subject.find('http://localhost') >= 0 try: tg.hooks.disconnect('registration.on_complete', on_complete) except AttributeError: del tg.config['hooks']['registration.on_complete']
def test_registration_activate_twice(self): resp = self.app.get('/registration') form = resp.form form['email_address'] = '*****@*****.**' form['password_confirm'] = 'p' form['password'] = '******' form['user_name'] = 'user1' resp = form.submit() resp = resp.follow() ctx = resp.req.environ['paste.testing_variables'] assert '<strong>An email</strong> has been sent to <strong>[email protected]</strong>' \ ' to activate the account' in resp.text mailer = get_mailer(ctx['req']) url = find_urls.findall(mailer.outbox[0].body)[0] resp = self.app.get(url) assert 'Account%20succesfully%20activated' in resp.headers[ 'Set-Cookie'] resp = self.app.get(url) assert 'Registration%20not%20found%20or%20already%20activated' in resp.headers[ 'Set-Cookie']
def test_arg_is_request(self): app = app_with_mailer() resp = app.get('/test') result = get_mailer(resp.req) self.assertEqual(result, resp.req._mailer) self.assertNotEqual(result, config['tg.app_globals']._mailer)
def test_with_default_prefix(self): settings = {'mail.default_sender': 'sender'} app = app_with_mailer(None, settings) mailer = get_mailer(None) self.assertEqual(mailer.default_sender, 'sender')
def send_email(to_addr, sender, subject, body, rich=None): # Using turbomail if it exists, 'dumb' method otherwise if turbomail and config.get('mail.on'): msg = turbomail.Message(sender, to_addr, subject, encoding='utf-8') msg.plain = body if rich: msg.rich = rich turbomail.enqueue(msg) # Using tgext.mailer pluggable if it exists, 'dumb' method otherwise elif message: mailer = get_mailer(request) message_to_send = message( subject=subject, sender=sender, recipients=[to_addr], body=body, html=rich or None ) if config.get('tm.enabled', False): mailer.send(message_to_send) else: mailer.send_immediately(message_to_send) else: _plain_send_mail(sender, to_addr, subject, body)
def test_arg_is_missing(self): app = app_with_mailer() resp = app.get('/test') mailer = get_mailer(None) self.assertEqual(mailer, config['tg.app_globals']._mailer) self.assertNotEqual(mailer, resp.req._mailer)
def save(self, **kw): if not is_valid_sn(kw['user_name']): flash( _('Caro utonto, inserisci il tuo numero di matricola nel formato indicato.' ), 'error') return redirect('/form/edit') user = User.by_user_name(kw['user_name']) if user: flash(_('Matricola già in uso!'), 'error') return redirect('/form/edit') token = generate_password() passwd = generate_password() user = User() user.user_name = kw['user_name'].lower() user.email_address = user.user_name + \ ('@studenti.polito.it' if user.user_name[0] == 's' else '@polito.it') user.display_name = user.user_name user.first_name = kw['first_name'] user.last_name = kw['last_name'] user.study_course = kw['cdl'] user.year = kw['year'] user.interest = kw['interest'] user.letter = kw['letter'] user.compiled = datetime.now() user.token = token user.password = passwd user.created = datetime.now() DBSession.add(user) DBSession.flush() status_link = url('/form/status?m=', None, True) + user.user_name status_link += '&auth=' + token noreply_email = User.by_user_id(1).email_address mailer = get_mailer(request) message = Message(subject="Reclutamento WEEE Open", sender=noreply_email, recipients=[user.email_address], body=("""Ciao! Abbiamo ricevuto la tua candidatura per il team WEEE Open, questa è la pagina da cui potrai verificare lo stato della tua domanda: %s Se la domanda sarà approvata, riceverai un'email sempre a questo indirizzo con scritto chi contattare per passare al colloquio. Le stesse informazioni saranno visibili anche alla pagina di cui sopra. Buona fortuna ;) Il software WEEEHire per conto del team WEEE Open """ % status_link)) mailer.send(message) flash( _(f"Candidatura inviata con successo!\nSalva questa pagina nei preferiti per controllare lo stato. Ti abbiamo inviato lo stesso link anche a {user.email_address}" )) return redirect(status_link)
def mailtemplates_async_send_email(subject, sender, recipients, html): """Sends email asynchronously throuh tgext.celery""" log.info('mailtemplates_async_send_email started') mailer = get_mailer(None) message = Message(subject=subject, sender=sender, recipients=recipients, html=html) mailer.send_immediately(message) log.info('mailtemplates_async_send_email ended')
def test_send_email_recipients_not_list(self, _): with test_context(self.app): app_globals = tg.app_globals._current_obj() mailer = get_mailer(app_globals) __, mail_model = model.provider.query(model.MailModel, filters=dict(name=u'Email')) mail_model = mail_model[0] send_email(recipients='*****@*****.**', sender='Marco Bosio <*****@*****.**>', mail_model_name=mail_model.name, data=dict(body='body')) assert len(mailer.outbox) > 0, mailer.outbox
def send_email(to_addr, sender, subject, body, rich=None): mailer = get_mailer(request) message_to_send = message( subject=subject, sender=sender, recipients=[to_addr], body=body, html=rich or None, ) if config.get('tm.enabled', False): mailer.send(message_to_send) else: mailer.send_immediately(message_to_send)
def send_email(self, **kw): user = User.by_user_id(kw['user_id']) if user.recruiter: # This line avoids us to pestarci i piedi a vicenda asd abort(403) recruiter = Recruiter.by_telegram(kw['recruiter']) user.recruiter_id = recruiter.id noreply_email = User.by_user_id(1).email_address mailer = get_mailer(request) message = Message(subject="Reclutamento WEEE Open", sender=noreply_email, recipients=[user.email_address], body=kw['mail']) mailer.send(message) flash("Messaggio inviato") return redirect('/soviet')
def create(self, questionary_title=None, document_id=None, email_to_share=None, **kw): owner = request.identity["user"] if email_to_share: user = model.User.by_email_address(email_to_share) if not user: user = model.User( user_name=email_to_share, email_address=email_to_share, display_name=email_to_share, ) else: user = owner questionary = model.Questionary( title=questionary_title, _user=user._id, _owner=owner._id, _document=ObjectId(document_id), ) if email_to_share: from tgext.mailer import get_mailer from tgext.mailer import Message mailer = get_mailer(request) share_url = tg.url("/dashboard", params={"share_id": user._id}, qualified=True) message = Message( subject=_("Invite to a KSWEB document"), sender="*****@*****.**", recipients=[user.email_address], body=_( "Hi, you were invited to compile the following document %s " "at the following url %s" % (questionary_title, share_url)), ) mailer.send_immediately(message) flash( _("Questionary succesfully created and shared to %s" % email_to_share)) return dict(questionary=questionary)
def test_registration_submit(self): resp = self.app.get('/registration') form = resp.form form['email_address'] = '*****@*****.**' form['password_confirm'] = 'p' form['password'] = '******' form['user_name'] = 'user1' resp = form.submit() resp = resp.follow() ctx = resp.req.environ['paste.testing_variables'] assert '<strong>An email</strong> has been sent to <strong>[email protected]</strong>' \ ' to activate the account' in resp.text mailer = get_mailer(ctx['req']) assert len(mailer.outbox) == 1
def test_resetpassword_reset_request(self): user = app_model.User(email_address='*****@*****.**', user_name='test', display_name='Test', password='******') try: app_model.DBSession.add(user) except AttributeError: # Ming DBSession doesn't have/require .add pass old_password = user.password flush_db_changes() resp = self.app.get('/resetpassword') form = resp.form assert form.action == '/resetpassword/reset_request', form.action form['email_address'] = '*****@*****.**' resp = form.submit() ctx = resp.req.environ['paste.testing_variables'] mailer = get_mailer(ctx['req']) resp = resp.follow() assert 'Password reset request sent' in resp.text, resp.text assert len(mailer.outbox) == 1, mailer.outbox url = URLS_RE.findall(mailer.outbox[0].body)[0] resp = self.app.get(url) form = resp.form form['password'] = '******' form['password_confirm'] = 'alfa' resp = form.submit() assert 'Password%20changed%20successfully' in resp.headers[ 'Set-Cookie'] _, users = model.provider.query(app_model.User) assert old_password != users[0].password resp = resp.follow() assert 'HELLO' in resp.text, resp.text
def test_includeme(self): from tgext.mailer.mailer import DummyMailer app = app_with_mailer({'debugmailer': 'dummy'}) self.assertEqual(get_mailer(None).__class__, DummyMailer)
def mailtemplates_async_send_email(message): """Sends email asynchronously throuh tgext.celery""" log.info('mailtemplates_async_send_email started') mailer = get_mailer(None) mailer.send_immediately(message) log.info('mailtemplates_async_send_email ended')
def _get_request(): """Tests fails and can't mock get_mailer, so mock this""" return tg.request def _send_email(sender, recipients, subject, html, async=True): if not isinstance(recipients, list): recipients = list(recipients) if async and config['_mailtemplates']['async_sender'] == 'tgext.celery': from mailtemplates.lib.celery_tasks import mailtemplates_async_send_email mailtemplates_async_send_email.delay(subject=subject, sender=sender, recipients=recipients, html=html) elif async and config['_mailtemplates']['async_sender'] == 'tgext.asyncjob': from tgext.asyncjob import asyncjob_perform mailer = get_mailer(None) message = Message(subject=subject, sender=sender, recipients=recipients, html=html) asyncjob_perform(mailer.send_immediately, message=message) else: mailer = get_mailer(_get_request()) message = Message(subject=subject, sender=sender, recipients=recipients, html=html) mailer.send_immediately(message) def _get_variables_for_template(tmpl): global_vars = [] for elem in dir(tmpl): if elem.startswith('_kj_block') or elem == '__main__': global_vars += _get_variables_for_block(tmpl, elem) return global_vars