diff --git a/aleksis/apps/tezor/migrations/0002_client_email.py b/aleksis/apps/tezor/migrations/0002_client_email.py
new file mode 100644
index 0000000000000000000000000000000000000000..6633ae74361e1b6b0651b62f2c32586f0fb714b9
--- /dev/null
+++ b/aleksis/apps/tezor/migrations/0002_client_email.py
@@ -0,0 +1,19 @@
+# Generated by Django 3.2.12 on 2022-03-09 20:36
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('tezor', '0001_initial'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='client',
+            name='email',
+            field=models.EmailField(default='', max_length=254, verbose_name='Email'),
+            preserve_default=False,
+        ),
+    ]
diff --git a/aleksis/apps/tezor/models/base.py b/aleksis/apps/tezor/models/base.py
index 459f9b22b924289f33a4f192e28b2794973184e0..85f85ccf9f3d67cc362c6704852c81602f958101 100644
--- a/aleksis/apps/tezor/models/base.py
+++ b/aleksis/apps/tezor/models/base.py
@@ -6,6 +6,7 @@ from aleksis.core.mixins import ExtensibleModel
 
 class Client(ExtensibleModel):
     name = models.CharField(verbose_name=_("Name"), max_length=255)
+    email = models.EmailField(verbose_name=_("Email"))
 
     class Meta:
         constraints = [
diff --git a/aleksis/apps/tezor/models/invoice.py b/aleksis/apps/tezor/models/invoice.py
index fd6be73de84a1e3113009a4d38351adc9d7db4c2..7dcad881b85266d1eb099b49d5ab7a318b200932 100644
--- a/aleksis/apps/tezor/models/invoice.py
+++ b/aleksis/apps/tezor/models/invoice.py
@@ -50,6 +50,12 @@ class Invoice(BasePayment, PureDjangoModel):
             models.UniqueConstraint(fields=["transaction_id", "group"], name="number_uniq_per_group")
         ]
 
+    def get_billing_email_recipients(self):
+        if hasattr(self.for_object, "get_billing_email_recipients"):
+            return self.for_object.get_billing_email_recipients()
+        else:
+            return list(self.billing_email)
+
     @property
     def purchased_items_table(self):
         items = [i._asdict() for i in self.get_purchased_items()]
diff --git a/aleksis/apps/tezor/templates/templated_email/invoice.email b/aleksis/apps/tezor/templates/templated_email/invoice.email
new file mode 100644
index 0000000000000000000000000000000000000000..d6496f320baa0c33e2a132fa4dea7d0f971b5372
--- /dev/null
+++ b/aleksis/apps/tezor/templates/templated_email/invoice.email
@@ -0,0 +1,26 @@
+{% extends "templated_email/base.email" %}
+
+{% load i18n %}
+
+{% block subject %}{% trans "Invoice" %} {{ invoice }}{% endblock %}
+
+{% block plain %}
+    {% blocktrans with invoice=invoice %}
+    Please find attached invoice number {{ invoice.transaction_id }} for {{
+    invoice.description }} please carefully read the PDF file concerning all
+    payment details.
+    {% endblocktrans %}
+
+{% endblock %}
+
+{% block html %}
+
+<p>
+    {% blocktrans with invoice=invoice %}
+    Please find attached invoice number {{ invoice.transaction_id }} for {{
+    invoice.description }} please carefully read the PDF file concerning all
+    payment details.
+    {% endblocktrans %}
+</p>
+
+{% endblock %}
diff --git a/aleksis/apps/tezor/urls.py b/aleksis/apps/tezor/urls.py
index 627d64f756e6bd336acfe3be02a244a15ae069de..baf77d09ab2a7254074da33d2403cf273e776294 100644
--- a/aleksis/apps/tezor/urls.py
+++ b/aleksis/apps/tezor/urls.py
@@ -55,4 +55,9 @@ urlpatterns = [
         views.InvoiceDetailView.as_view(),
         name="invoice_by_pk",
     ),
+    path(
+        "invoice/<int:pk>/send/",
+        views.SendInvoiceEmail.as_view(),
+        name="send_invoice_by_pk",
+    ),
 ]
diff --git a/aleksis/apps/tezor/views.py b/aleksis/apps/tezor/views.py
index 27939605b54e85cf57ce36abaad31d147e8132da..f6618033972bf245e12faf564412aabcedf083be 100644
--- a/aleksis/apps/tezor/views.py
+++ b/aleksis/apps/tezor/views.py
@@ -9,9 +9,11 @@ from django.views.generic.detail import DetailView
 
 from rules.contrib.views import PermissionRequiredMixin
 from django_tables2.views import SingleTableView, RequestConfig
+from templated_email import InlineImage, send_templated_mail
 
 from aleksis.core.views import RenderPDFView
 from aleksis.core.mixins import AdvancedCreateView, AdvancedDeleteView, AdvancedEditView
+from aleksis.core.util.pdf import generate_pdf_from_template
 
 from .tables import ClientsTable, InvoiceGroupsTable, InvoicesTable
 from .forms import EditClientForm, EditInvoiceGroupForm
@@ -153,3 +155,21 @@ class InvoiceDetailView(PermissionRequiredMixin, DetailView):
     model = Invoice
     permission_required = "tezor.view_invoice"
     template_name = "tezor/invoice/full.html"
+
+
+class SendInvoiceEmail(View):
+
+    def get(self, request, pk):
+        context = {}
+        invoice = Invoice.objects.get(id=pk)
+        context["invoice"] = invoice
+        invoice_pdf, result = generate_pdf_from_template(invoice.group.template_name, context, request)
+        attachment = InlineImage(filename=f"{invoice.transaction_id}.pdf", content=invoice_pdf.file.read())
+        context["invoice_pdf"] = attachment
+
+        send_templated_mail(
+            template_name="invoice",
+            from_email=invoice.group.client.email,
+            recipient_list=invoice.get_billing_email_recipients(),
+            context=context,
+        )