diff --git a/aleksis/apps/paweljong/models.py b/aleksis/apps/paweljong/models.py
index 1f55e56d23119b2a5f88b6ac0aa1dc8faca16c8c..980ca2f1c2babfd3d0293261c95cbd4bd55aa5b1 100644
--- a/aleksis/apps/paweljong/models.py
+++ b/aleksis/apps/paweljong/models.py
@@ -8,10 +8,11 @@ from django.utils.translation import gettext_lazy as _
 
 from ckeditor.fields import RichTextField
 from django_iban.fields import IBANField
+from templated_email import send_templated_mail
 
 from aleksis.core.mixins import ExtensibleModel
 from aleksis.core.models import Group, Person
-from aleksis.core.util.core_helpers import generate_random_code
+from aleksis.core.util.core_helpers import generate_random_code, get_site_preferences
 
 
 class Terms(ExtensibleModel):
@@ -26,12 +27,45 @@ class Terms(ExtensibleModel):
 class InfoMailing(ExtensibleModel):
     subject = models.CharField(max_length=255, verbose_name=_("subject"))
     text = RichTextField(verbose_name=_("Text"))
+    reply_to = models.EmailField(verbose_name=_("Request replies to"), blank=True)
+
+    send_to_person = models.BooleanField(verbose_name=_("Send to registered person"), default=True)
+    send_to_guardians = models.BooleanField(verbose_name=_("Send to guardians"), default=False)
 
     sent_to = models.ManyToManyField(Person, verbose_name=_("Sent to persons"), related_name="received_info_mailings", editable=False, blank=True)
 
     def __str__(self) -> str:
         return self.subject
 
+    def send(self):
+        sent_to = self.sent_to.all()
+
+        for event in self.events.all():
+            for registration in event.registrations:
+                if registration.person in sent_to:
+                    continue
+
+                subject = self.subject.format(event=event, registration=registration, person=registration.person)
+                body = self.text.format(event=event, registration=registration, person=registration.person)
+
+                if self.send_to_person:
+                    to = [registration.person.email]
+                    if self.send_to_guardians:
+                        cc = registration.person.guardians.values_list("email", flat=True).all()
+                    else:
+                        cc = []
+                elif self.send_to_guardians:
+                    to = registration.person.guardians.values_list("email", flat=True).all()
+                    cc = []
+
+                sender = self.sender or get_site_preferences()["mail__address"]
+                reply_to = self.reply_to or sender
+
+                context = {"subject": subject, "body": body}
+                send_templated_email(template_name="info_mailing", context=context, from_email=sender, recipient_list=to, cc=cc)
+
+                self.sent_to.add(self.registration.person)
+
 
 class Event(ExtensibleModel):
     # Event details
@@ -153,7 +187,7 @@ class Voucher(ExtensibleModel):
 
 class EventRegistration(ExtensibleModel):
 
-    event = models.ForeignKey(Event, on_delete=models.CASCADE, verbose_name=_("Event"))
+    event = models.ForeignKey(Event, on_delete=models.CASCADE, verbose_name=_("Event"), related_name="registrations")
     person = models.ForeignKey(Person, on_delete=models.CASCADE, verbose_name=_("Person"))
     date_registered = models.DateTimeField(auto_now_add=True, verbose_name=_("Registration date"))
 
diff --git a/aleksis/apps/paweljong/templates/templated_email/info_mailing.email b/aleksis/apps/paweljong/templates/templated_email/info_mailing.email
new file mode 100644
index 0000000000000000000000000000000000000000..946f635afbdfca45318bf3dda4232cbdf11a3c6c
--- /dev/null
+++ b/aleksis/apps/paweljong/templates/templated_email/info_mailing.email
@@ -0,0 +1,3 @@
+{% block subject %}{{ subject }}{% endblock %}
+
+{% block html %}{{ body|safe }}{% endblock %}