django-codenerix-email 4.0.39__py2.py3-none-any.whl → 4.0.40__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Binary file
@@ -1,4 +1,4 @@
1
- __version__ = "4.0.39"
1
+ __version__ = "4.0.40"
2
2
 
3
3
  __authors__ = [
4
4
  "Juan Miguel Taboada Godoy <juanmi@juanmitaboada.com>",
codenerix_email/forms.py CHANGED
@@ -94,7 +94,7 @@ class EmailMessageForm(GenModelForm):
94
94
  return [
95
95
  (
96
96
  _("Details"),
97
- 6,
97
+ 4,
98
98
  ["uuid", 3],
99
99
  ["created", 3],
100
100
  ["updated", 3],
@@ -102,20 +102,27 @@ class EmailMessageForm(GenModelForm):
102
102
  ["eto", 3],
103
103
  ["subject", 3],
104
104
  ["opened", 3],
105
- ["content_subtype", 3],
106
105
  ),
107
106
  (
108
107
  _("System"),
109
- 6,
108
+ 4,
110
109
  ["sending", 3],
111
110
  ["sent", 3],
112
111
  ["error", 3],
113
- ["retries", 3],
114
- ["priority", 3],
115
112
  ["log", 3],
113
+ ["content_subtype", 3],
116
114
  ["unsubscribe_url", 3],
117
115
  ["headers", 3],
118
116
  ),
117
+ (
118
+ _("Status"),
119
+ 4,
120
+ ["retries", 3],
121
+ ["priority", 3],
122
+ ["bounces_total", 3],
123
+ ["bounces_soft", 3],
124
+ ["bounces_hard", 3],
125
+ ),
119
126
  (
120
127
  _("Body"),
121
128
  12,
@@ -453,7 +453,8 @@ class Command(BaseCommand):
453
453
  if self.verbose:
454
454
  self.stdout.write(
455
455
  self.style.SUCCESS(
456
- f"Deleted email with IMAP ID: {imap_id}"
456
+ "Deleted email with "
457
+ f"IMAP ID: {imap_id}"
457
458
  )
458
459
  )
459
460
 
@@ -487,6 +488,10 @@ class Command(BaseCommand):
487
488
  # Save the received email
488
489
  email_received.save()
489
490
 
491
+ # Recalculate the email status if linked to a sent email
492
+ if email_message:
493
+ email_message.recalculate_bounces()
494
+
490
495
  # Count created or overwritten
491
496
  if overwriting:
492
497
  overwrite_count += 1
@@ -543,7 +548,7 @@ class Command(BaseCommand):
543
548
  )
544
549
  )
545
550
  elif getattr(settings, "IMAP_EMAIL_SEEN", True):
546
- # Mark the message as read otherwise (to avoid reprocessing)
551
+ # Mark the message as read otherwise (avoids reprocessing)
547
552
  server.add_flags(imap_id, [b"\\Seen"])
548
553
 
549
554
  return (created_count, overwrite_count)
@@ -0,0 +1,28 @@
1
+ # Generated by Django 5.2.7 on 2025-10-14 05:10
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ('codenerix_email', '0014_emailreceived'),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AddField(
14
+ model_name='emailmessage',
15
+ name='bounces_hard',
16
+ field=models.PositiveIntegerField(default=0, verbose_name='Hard bounces'),
17
+ ),
18
+ migrations.AddField(
19
+ model_name='emailmessage',
20
+ name='bounces_soft',
21
+ field=models.PositiveIntegerField(default=0, verbose_name='Soft bounces'),
22
+ ),
23
+ migrations.AddField(
24
+ model_name='emailmessage',
25
+ name='bounces_total',
26
+ field=models.PositiveIntegerField(default=0, verbose_name='Total bounces'),
27
+ ),
28
+ ]
codenerix_email/models.py CHANGED
@@ -114,6 +114,34 @@ class EmailMessage(CodenerixModel):
114
114
  _("Unsubscribe URL"), blank=True, null=True
115
115
  )
116
116
  headers = models.JSONField(_("Headers"), blank=True, null=True)
117
+ bounces_soft = models.PositiveIntegerField(
118
+ _("Soft bounces"), blank=False, null=False, default=0
119
+ )
120
+ bounces_hard = models.PositiveIntegerField(
121
+ _("Hard bounces"), blank=False, null=False, default=0
122
+ )
123
+ bounces_total = models.PositiveIntegerField(
124
+ _("Total bounces"), blank=False, null=False, default=0
125
+ )
126
+
127
+ def recalculate_bounces(self):
128
+ bounces_soft = self.receiveds.filter(bounce_type=BOUNCE_SOFT).count()
129
+ bounces_hard = self.receiveds.filter(bounce_type=BOUNCE_HARD).count()
130
+ bounces_total = self.receiveds.filter(
131
+ bounce_type__isnull=False
132
+ ).count()
133
+ changed = False
134
+ if self.bounces_soft != bounces_soft:
135
+ self.bounces_soft = bounces_soft
136
+ changed = True
137
+ if self.bounces_hard != bounces_hard:
138
+ self.bounces_hard = bounces_hard
139
+ changed = True
140
+ if self.bounces_total != bounces_total:
141
+ self.bounces_total = bounces_total
142
+ changed = True
143
+ if changed:
144
+ self.save()
117
145
 
118
146
  def __fields__(self, info):
119
147
  fields = []
@@ -127,6 +155,7 @@ class EmailMessage(CodenerixModel):
127
155
  # fields.append(("efrom", _("From")))
128
156
  fields.append(("eto", _("To")))
129
157
  fields.append(("subject", _("Subject")))
158
+ fields.append(("bounces_total", _("Bounces")))
130
159
  fields.append(("retries", _("Retries")))
131
160
  fields.append(("next_retry", _("Next retry")))
132
161
  fields.append(("pk", _("ID")))
@@ -169,7 +198,6 @@ class EmailMessage(CodenerixModel):
169
198
  return {
170
199
  "sent": (_("Sent"), lambda x: mailstatus(x), mailoptions),
171
200
  "uuid": (_("UUID"), lambda x: Q(uuid__icontains=x), "input"),
172
- "priority": (_("Priority"), lambda x: Q(priority=x), "input"),
173
201
  "opened": (
174
202
  _("Opened"),
175
203
  lambda x: ~Q(opened__isnull=x),
@@ -177,25 +205,12 @@ class EmailMessage(CodenerixModel):
177
205
  ),
178
206
  # "efrom": (_("From"), lambda x: Q(efrom__icontains=x), "input"),
179
207
  "eto": (_("To"), lambda x: Q(eto__icontains=x), "input"),
180
- "retries": (_("Retries"), lambda x: Q(retries=x), "input"),
181
208
  "pk": (_("ID"), lambda x: Q(pk=x), "input"),
182
209
  }
183
210
 
184
211
  def __unicode__(self):
185
212
  return "{} ({})".format(self.eto, self.pk)
186
213
 
187
- @property
188
- def bounces_soft(self):
189
- return self.receiveds.filter(bounce_type=BOUNCE_SOFT).count()
190
-
191
- @property
192
- def bounces_hard(self):
193
- return self.receiveds.filter(bounce_type=BOUNCE_HARD).count()
194
-
195
- @property
196
- def bounces_total(self):
197
- return self.receiveds.filter(bounce_type__isnull=False).count()
198
-
199
214
  def clean(self):
200
215
  if not isinstance(self.headers, dict):
201
216
  raise ValidationError(_("HEADERS must be a Dictionary"))
@@ -14,7 +14,7 @@
14
14
  </td>
15
15
  <td>{{row.eto|codenerix}}</td>
16
16
  <td><nobr>{{row.subject|codenerix}}</nobr></td>
17
- <td class="text-nowrap">{{row.bounces_total_count|codenerix}}</td>
17
+ <td class="text-nowrap">{{row.bounces_total|codenerix}}</td>
18
18
  <td><center>{{row.retries|codenerix}}</center></td>
19
19
  <td class="text-nowrap">{{row.next_retry|codenerix}}</td>
20
20
  <td><center>{{row.pk|codenerix}}</center></td>
codenerix_email/views.py CHANGED
@@ -28,7 +28,7 @@ from django.shortcuts import get_object_or_404
28
28
  from django.utils.translation import gettext as _
29
29
  from django.conf import settings
30
30
  from django.http import HttpRequest, Http404
31
- from django.db.models import Q, Count
31
+ from django.db.models import Q
32
32
 
33
33
  from codenerix.multiforms import MultiForm # type: ignore
34
34
  from codenerix.views import ( # type: ignore
@@ -40,15 +40,12 @@ from codenerix.views import ( # type: ignore
40
40
  GenDelete,
41
41
  GenDetail,
42
42
  GenDetailModal,
43
- SearchFilters,
44
43
  )
45
44
  from codenerix_email.models import (
46
45
  EmailTemplate,
47
46
  EmailMessage,
48
47
  EmailReceived,
49
48
  MODELS,
50
- BOUNCE_SOFT,
51
- BOUNCE_HARD,
52
49
  )
53
50
  from codenerix_email.forms import (
54
51
  EmailTemplateForm,
@@ -106,7 +103,7 @@ class EmailFollow(View):
106
103
  # Return an image of 1x1 pixel
107
104
  return HttpResponse(
108
105
  base64.b64decode(
109
- "R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw=="
106
+ "R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==" # noqa: E501
110
107
  ),
111
108
  content_type="image/gif",
112
109
  )
@@ -186,90 +183,6 @@ class EmailMessageList(GenList):
186
183
  "menu": ["codenerix_email", "emailmessages"],
187
184
  "bread": [_("Emails"), _("Email Messages")],
188
185
  }
189
- annotations = {
190
- # "bounces_soft_count": Count(
191
- # "receiveds__pk", filter=Q(receiveds__bounce_type=BOUNCE_SOFT)
192
- # ),
193
- # "bounces_hard_count": Count(
194
- # "receiveds__pk", filter=Q(receiveds__bounce_type=BOUNCE_HARD)
195
- # ),
196
- "bounces_total_count": Count(
197
- "receiveds__pk", filter=Q(receiveds__bounce_type__isnull=False)
198
- ),
199
- }
200
-
201
- def __fields__(self, info):
202
- fields = []
203
- fields.append(("sending", None))
204
- fields.append(("error", None))
205
- fields.append(("sent", _("Send")))
206
- fields.append(("priority", _("Priority")))
207
- fields.append(("created", _("Created")))
208
- fields.append(("updated", _("Updated")))
209
- fields.append(("opened", _("Opened")))
210
- # fields.append(("efrom", _("From")))
211
- fields.append(("eto", _("To")))
212
- fields.append(("subject", _("Subject")))
213
- fields.append(("bounces_total_count", _("Bounces")))
214
- # fields.append(("bounces_soft_count", _("Soft bounces")))
215
- # fields.append(("bounces_hard_count", _("Hard bounces")))
216
- fields.append(("retries", _("Retries")))
217
- fields.append(("next_retry", _("Next retry")))
218
- fields.append(("pk", _("ID")))
219
- fields.append(("uuid", _("UUID")))
220
- fields.append(("unsubscribe_url", _("Unsubscribe")))
221
- fields.append(("content_subtype", _("Content Subtype")))
222
- return fields
223
-
224
- def __searchF__(self, info): # noqa: N802
225
- def mailstatus(x):
226
- if x == "D":
227
- return Q(error=False, sent=True)
228
- elif x == "P":
229
- return Q(error=False, sent=False, sending=False)
230
- elif x == "S":
231
- return Q(error=False, sent=False, sending=True)
232
- elif x == "E":
233
- return Q(error=True)
234
- else:
235
- return Q()
236
-
237
- mailoptions = [
238
- ("D", _("Sent")), # Sent - Done
239
- ("P", _("Pending")), # Pending - Pending
240
- ("S", _("Sending")), # Sending - Sending
241
- ("E", _("Error")), # Error - Error
242
- ]
243
-
244
- return {
245
- "sent": (_("Sent"), lambda x: mailstatus(x), mailoptions),
246
- "uuid": (_("UUID"), lambda x: Q(uuid__icontains=x), "input"),
247
- "priority": (_("Priority"), lambda x: Q(priority=x), "input"),
248
- "opened": (
249
- _("Opened"),
250
- lambda x: ~Q(opened__isnull=x),
251
- [(True, _("Yes")), (False, _("No"))],
252
- ),
253
- # "efrom": (_("From"), lambda x: Q(efrom__icontains=x), "input"),
254
- "eto": (_("To"), lambda x: Q(eto__icontains=x), "input"),
255
- "retries": (_("Retries"), lambda x: Q(retries=x), "input"),
256
- "pk": (_("ID"), lambda x: Q(pk=x), "input"),
257
- "bounces_total_count": (
258
- _("Bounces"),
259
- SearchFilters.number("bounces_total_count"),
260
- "input",
261
- ),
262
- "bounces_soft_count": (
263
- _("Soft bounces"),
264
- SearchFilters.number("bounces_soft_count"),
265
- "input",
266
- ),
267
- "bounces_hard_count": (
268
- _("Hard bounces"),
269
- SearchFilters.number("bounces_hard_count"),
270
- "input",
271
- ),
272
- }
273
186
 
274
187
 
275
188
  class EmailMessageCreate(GenCreate):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: django-codenerix-email
3
- Version: 4.0.39
3
+ Version: 4.0.40
4
4
  Summary: Codenerix Email is a module that enables CODENERIX to set send emails in a general manner.
5
5
  Home-page: https://github.com/codenerix/django-codenerix-email
6
6
  Author: Juan Miguel Taboada Godoy <juanmi@juanmitaboada.com>, Juan Soler Ruiz <soleronline@gmail.com>
@@ -1,13 +1,14 @@
1
- codenerix_email/__init__.py,sha256=jy3doviOd16K4l2OxN9UBbjhtzx2zjQmwaHgbqXosnw,149
1
+ codenerix_email/.models.py.swp,sha256=sktik9iVIMa7EutN3nhqiJvvO3pAA4ZPGkD4cFvMxp0,40960
2
+ codenerix_email/__init__.py,sha256=iu8TZi-9JIsQubz2hdtLDE1F9L-XrdUGhgRaDCNilME,149
2
3
  codenerix_email/admin.py,sha256=w259UKFk_opGEl6PJjYHXWAHQ_8emgqmiixKT5Rid4A,1180
3
4
  codenerix_email/apps.py,sha256=WXqu1XQibDDyCvvQYt2JbTK4GIpW8BNv5DCbRJS2mmk,149
4
- codenerix_email/forms.py,sha256=38byLGxg1MOLAY1kAYChxYZj64tSgyfRvDcSbIOdV0I,5521
5
- codenerix_email/models.py,sha256=e1BqaycD0sVTYwpeUlow50ijyW55Da-9kQDXaABxZrw,25311
5
+ codenerix_email/forms.py,sha256=P5w-ebxLR1V10RFDqO_R5vvZV-vY6SLTzVb1OLdFZE0,5710
6
+ codenerix_email/models.py,sha256=z0tcaOy1LCs8QBelJmn5O9Fn3GAS3_bQT59RBi-Otm4,25948
6
7
  codenerix_email/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
8
  codenerix_email/test_settings.py,sha256=A9WT-2MMuqvW5Mrd3lkmjrf0xJZmJl3McOEeyJug1Xc,633
8
9
  codenerix_email/urls.py,sha256=M760qDSVV3EoY9aIPdnk8DtUv5tyWO-FQWdody4KTeM,3996
9
10
  codenerix_email/urls_frontend.py,sha256=DG5WS_fGQJC9sezNebPwG-E_WtUWy3Kwz4VUxh82xuc,873
10
- codenerix_email/views.py,sha256=9HXoWbO9ZMhmpIqTWAr9P65HJTluh-NPsl24JgQcgcA,10078
11
+ codenerix_email/views.py,sha256=7j9lIUJ8TMZlFx6GzDZ_R9QC6Krt__z3Dfr0ZO_IcKE,6707
11
12
  codenerix_email/.mypy_cache/.gitignore,sha256=amnaZw0RUw038PDP3HvtMLeOpkNOJPenMgi5guKdMiw,34
12
13
  codenerix_email/.mypy_cache/CACHEDIR.TAG,sha256=8cE6_FVTWMkDOw8fMKqhd_6IvaQPS4okWYQA1UeHatw,190
13
14
  codenerix_email/.mypy_cache/3.10/@plugins_snapshot.json,sha256=RBNvo1WzZ4oRRq0W9-hknpT7T8If536DEMBg9hyq_4o,2
@@ -827,8 +828,8 @@ codenerix_email/.mypy_cache/3.10/zoneinfo/_common.data.json,sha256=e4xbNKL_yQ5h5
827
828
  codenerix_email/.mypy_cache/3.10/zoneinfo/_common.meta.json,sha256=5K19XWobpSjKwiv7bZFZRcxsEfoh7b-FhYcmqB-2Iic,1737
828
829
  codenerix_email/.mypy_cache/3.10/zoneinfo/_tzpath.data.json,sha256=CFx7Q1XfUhhuNX69prkxyirG8rfvEDCNgEHWQigKC_A,5632
829
830
  codenerix_email/.mypy_cache/3.10/zoneinfo/_tzpath.meta.json,sha256=d1HJ_xFBI1orlZSVhH0gHWLI-dJG3zY-ZOlctOl62yU,1765
830
- codenerix_email/__pycache__/__init__.cpython-310.pyc,sha256=jR8Y-ZqrC_AzgwY3EjpVl3TOkhtTgWepEoei20YfoQw,313
831
- codenerix_email/__pycache__/__init__.cpython-311.pyc,sha256=VHHEae6bOdMZRv4BoHz1g5HaZMN7_WmD3aXcpvu2mAY,337
831
+ codenerix_email/__pycache__/__init__.cpython-310.pyc,sha256=eWWSyDve9FPvyJlFakWAx-ukvTzE6-yzrdbtlV30aaE,313
832
+ codenerix_email/__pycache__/__init__.cpython-311.pyc,sha256=TXTEa1LmC28a-J-IxfH9kCJ0ZXggGZexMZDC4yPBvdM,337
832
833
  codenerix_email/__pycache__/__init__.cpython-35.pyc,sha256=dl9lYAgrokJptUj3JAhiqTlX7d_CbncOxZeTc1USc88,308
833
834
  codenerix_email/__pycache__/__init__.cpython-37.pyc,sha256=5d1CeFU5DrfnwrRpvSw1bHvLN9hoHXjUA3ln3rXCDo8,306
834
835
  codenerix_email/__pycache__/__init__.cpython-39.pyc,sha256=0c6KWU_eOTlF5l9fNWv8l41b0LcfVQNUsqDvJTv2YyU,300
@@ -840,11 +841,11 @@ codenerix_email/__pycache__/apps.cpython-310.pyc,sha256=PzDChfGmY_KnNkDrqSdEAQbl
840
841
  codenerix_email/__pycache__/apps.cpython-311.pyc,sha256=U51a_9uWzb1nkGnGLqZL5X4d-LBMi83MiPMlUtBYobo,560
841
842
  codenerix_email/__pycache__/apps.cpython-39.pyc,sha256=d5Hd-YMSDmSzyxDmQ_nwXjcEcHASDm6MxFblb1TATf4,439
842
843
  codenerix_email/__pycache__/forms.cpython-310.pyc,sha256=-oq5NlQGH7VkMUUMB4lXmBoUhkTVO14AOIZetrpgqck,4004
843
- codenerix_email/__pycache__/forms.cpython-311.pyc,sha256=zNvq_Xc_bdUsG59tq9OWUiy5hoyZ035z4E5fEovr4NE,5854
844
+ codenerix_email/__pycache__/forms.cpython-311.pyc,sha256=jUjgCTZFkAE2iTueIoG0mZ7CunsFX4EH2zh2OhLA_-c,5999
844
845
  codenerix_email/__pycache__/forms.cpython-35.pyc,sha256=z1aCJ2d8yyKJMuf5aVz0mGE6Nqi9bjU7HyDZPKxpUWc,3233
845
846
  codenerix_email/__pycache__/forms.cpython-39.pyc,sha256=NORLA0i3bmWx-mUn3wh3JtObuR7UYKZemSU6Cl5gHM8,2988
846
- codenerix_email/__pycache__/models.cpython-310.pyc,sha256=tJ-ff7rjubUvp21PUTwvWd5LAKZzRCOXzXJO8-aGtTc,18097
847
- codenerix_email/__pycache__/models.cpython-311.pyc,sha256=_ketRfcsx3QB9uplTrFGkqs_D69iM_lwL_UYziboJBc,36756
847
+ codenerix_email/__pycache__/models.cpython-310.pyc,sha256=glpYvUi4CpWxUfW8zUzo60woiHa_YdvIz5MS6SFnbns,17995
848
+ codenerix_email/__pycache__/models.cpython-311.pyc,sha256=p5V6pZ7oTWjBFJNlexW7mM29QnJVMnc3wCn5fk4A7Lo,36820
848
849
  codenerix_email/__pycache__/models.cpython-35.pyc,sha256=oGheSKlh8Ttc6bB-qZ1JY5_6RySM9M6GY5-GCATxfes,9481
849
850
  codenerix_email/__pycache__/models.cpython-39.pyc,sha256=ugyNNDG3k6rqsunwlcUIWADaLNvJ8snCgQwMZu9Ahac,8849
850
851
  codenerix_email/__pycache__/test_settings.cpython-310.pyc,sha256=HH5CsPxLlq7_jW4ZCGBc1KzcV4HNQcI6YTh0wcz_F0w,715
@@ -855,7 +856,7 @@ codenerix_email/__pycache__/urls.cpython-39.pyc,sha256=EZTAIjMTQLfB4lVdxaQrspy93
855
856
  codenerix_email/__pycache__/urls_frontend.cpython-310.pyc,sha256=byQ8k-Hcfft-DzwWVvO5CEt_DBazuNPK_lNXkDV8HhY,381
856
857
  codenerix_email/__pycache__/urls_frontend.cpython-311.pyc,sha256=GmCqHFwOVkzllal3pnLe5BYg1Rj5SAm5WTGKQrfzVGk,498
857
858
  codenerix_email/__pycache__/views.cpython-310.pyc,sha256=vB2BqnTPYMYxiihKQAr6DZZ1-7SoGfC7dE41JHp-jPI,8707
858
- codenerix_email/__pycache__/views.cpython-311.pyc,sha256=Z8OEWBF0DIzhN8vtyNKk2gXhg5uukALDpHCxaDbjMGA,15763
859
+ codenerix_email/__pycache__/views.cpython-311.pyc,sha256=urp3a_ATSfAza2O4A-D_Vnf_zfTMzRO6jG9BxwR8MZA,10251
859
860
  codenerix_email/__pycache__/views.cpython-35.pyc,sha256=ZiDircDZ5B_MEFZu2H4ca7OZop10EyZF2PRR6JRgUGc,3988
860
861
  codenerix_email/__pycache__/views.cpython-39.pyc,sha256=SV_-RTnh7w_7oMUkD0mUWhSs5lqMuw-HUGU40hV56YY,3657
861
862
  codenerix_email/locale/en/LC_MESSAGES/django.po,sha256=NzL-kG6Z7lVnp_YDsUOMz-HAKqC37J-2elkU_Ce1zL8,7198
@@ -868,7 +869,7 @@ codenerix_email/management/__pycache__/__init__.cpython-35.pyc,sha256=sBoEWs6zdI
868
869
  codenerix_email/management/__pycache__/__init__.cpython-39.pyc,sha256=uPXklfliVd3b8pLOJQT9ZeKcqmJMrGychvt68BsPulY,168
869
870
  codenerix_email/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
870
871
  codenerix_email/management/commands/email_test.py,sha256=SPsiq0s48sEX_G3piNHq-c1gDOH800H2zTvM19ei2LY,5605
871
- codenerix_email/management/commands/emails_recv.py,sha256=4QfIQ2M97T4Y3o7BR1d4nA8UF8bqe81wCMUpiooSzxs,35872
872
+ codenerix_email/management/commands/emails_recv.py,sha256=iksLQQKh-oXWBe5PAg16KsdjZQfdVFfO5y_sI4BBf84,36089
872
873
  codenerix_email/management/commands/emails_send.py,sha256=scCFklro4WVMYm-1ataSjUMsPT-Ie5u_DdA55CQcTCQ,7944
873
874
  codenerix_email/management/commands/recv_emails.py,sha256=aXmhdXlamiNxRpMIDSKBXUBhkOcwi5l_Pme7jSQUCME,273
874
875
  codenerix_email/management/commands/send_emails.py,sha256=a1MnpvZKAEFdXNfmI5oFUkVxy4PZ1AjaJS6GH90zeD0,273
@@ -1634,6 +1635,7 @@ codenerix_email/migrations/0011_alter_emailmessage_content_subtype_and_more.py,s
1634
1635
  codenerix_email/migrations/0012_emailmessage_unsubscribe_url.py,sha256=tPQt1W2LJcXMvt_ecB-2npu7wQ-Og29M99ZJjukYnWA,501
1635
1636
  codenerix_email/migrations/0013_emailmessage_headers.py,sha256=1T0lryajjfXhnMgU-aqJUW-CKDvVe6zLrYu_FygcFE4,441
1636
1637
  codenerix_email/migrations/0014_emailreceived.py,sha256=U--Zhb9JkihuL3w-lNnhCfWT1dkVbgEWBHE3RHXtAnA,3406
1638
+ codenerix_email/migrations/0015_emailmessage_bounces_hard_emailmessage_bounces_soft_and_more.py,sha256=68A8DtX_77s0KwhocOuyUyExkx3AMndAEnYahdok3rE,835
1637
1639
  codenerix_email/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1638
1640
  codenerix_email/migrations/__pycache__/0001_initial.cpython-310.pyc,sha256=Sm54OKfGHUMvSVgbXiFAe9E2d85HqlLoMEaBEBP53mE,2005
1639
1641
  codenerix_email/migrations/__pycache__/0001_initial.cpython-311.pyc,sha256=KsQcRgyLOFbYfAHj9C5i7uQNWt9_wMJg2MOwpOa1B10,3852
@@ -1681,14 +1683,15 @@ codenerix_email/migrations/__pycache__/0013_emailmessage_headers.cpython-310.pyc
1681
1683
  codenerix_email/migrations/__pycache__/0013_emailmessage_headers.cpython-311.pyc,sha256=-fFwK7UWVLCbaVh3ej4EQbee44wVC3hBezdgW875ncg,891
1682
1684
  codenerix_email/migrations/__pycache__/0014_emailreceived.cpython-310.pyc,sha256=cN48X4p05m2tZafTP1pHgQOcoz9qrROwGqII6G1FjsQ,1923
1683
1685
  codenerix_email/migrations/__pycache__/0014_emailreceived.cpython-311.pyc,sha256=0FC9aa_p8Ojxq0IISCbJbmNlySYNr-UkI1W1Y6b6jIU,2924
1686
+ codenerix_email/migrations/__pycache__/0015_emailmessage_bounces_hard_emailmessage_bounces_soft_and_more.cpython-311.pyc,sha256=-4y6CXG8s9cn_rpvQcWvxi1-farfomE6yIf6Dy1kBos,1231
1684
1687
  codenerix_email/migrations/__pycache__/__init__.cpython-310.pyc,sha256=PdaaABMdLCzCMnJmxaylT_jnLb8l7rr6n5C4CGDX37A,151
1685
1688
  codenerix_email/migrations/__pycache__/__init__.cpython-311.pyc,sha256=RbbUUEhcJ_eAVNFAdNbkjv60hyF7BsnNOlti5xplQsY,195
1686
1689
  codenerix_email/migrations/__pycache__/__init__.cpython-35.pyc,sha256=2g70xiMW6oJNkIpRM-0Dr5h7AUac-3xyCXPONxp9BBw,147
1687
1690
  codenerix_email/migrations/__pycache__/__init__.cpython-39.pyc,sha256=qNj2NH0YvoWPnCKxkVZPsEFsbM05y7t1njMskNISdVQ,168
1688
- codenerix_email/static/codenerix_email/emailmessages_rows.html,sha256=NyZpKPSHAAIywJX2ncS0H2bkqOVtMUwAdbYmkC4dKmk,2202
1691
+ codenerix_email/static/codenerix_email/emailmessages_rows.html,sha256=cA2ru5ti9WnPhhvFNEpI2tTR7gZzUYXWdzngRKU6a7k,2196
1689
1692
  codenerix_email/static/codenerix_email/emailreceiveds_rows.html,sha256=u9DXVdzKhx9WlJgcK_cT2DfGp9bGIKTBn3LDQplB4g4,2032
1690
- django_codenerix_email-4.0.39.dist-info/LICENSE,sha256=IXMIpi75XsrJt1Sznt4EftT9c_4X0C9eqK4tHhH8H48,11339
1691
- django_codenerix_email-4.0.39.dist-info/METADATA,sha256=et_AOcJOU0_8V_DL_Br12lR3UkKeJEI06F1mH-A9o2k,2676
1692
- django_codenerix_email-4.0.39.dist-info/WHEEL,sha256=z9j0xAa_JmUKMpmz72K0ZGALSM_n-wQVmGbleXx2VHg,110
1693
- django_codenerix_email-4.0.39.dist-info/top_level.txt,sha256=lljSA0iKE_UBEM5gIrGQwioC_i8Jjnp-aR1LFElENgw,16
1694
- django_codenerix_email-4.0.39.dist-info/RECORD,,
1693
+ django_codenerix_email-4.0.40.dist-info/LICENSE,sha256=IXMIpi75XsrJt1Sznt4EftT9c_4X0C9eqK4tHhH8H48,11339
1694
+ django_codenerix_email-4.0.40.dist-info/METADATA,sha256=n1dhoEWbAVnuKJfC3Xy9uyoITL0owxv6hKaRLeRQEB8,2676
1695
+ django_codenerix_email-4.0.40.dist-info/WHEEL,sha256=z9j0xAa_JmUKMpmz72K0ZGALSM_n-wQVmGbleXx2VHg,110
1696
+ django_codenerix_email-4.0.40.dist-info/top_level.txt,sha256=lljSA0iKE_UBEM5gIrGQwioC_i8Jjnp-aR1LFElENgw,16
1697
+ django_codenerix_email-4.0.40.dist-info/RECORD,,