bton/prohibit_sending_empty_emails #100
21 changed files with 9544 additions and 32 deletions
|
@ -0,0 +1,26 @@
|
|||
Subject: test
|
||||
From: test1@test
|
||||
To: test2@test
|
||||
Message-ID: <1@test>
|
||||
Content-Type: multipart/alternative; boundary="abc"
|
||||
|
||||
--abc
|
||||
Content-Type: text/plain; charset=utf-8
|
||||
|
||||
test1
|
||||
|
||||
--abc
|
||||
Content-Type: image/jpeg; name="test.jpg"
|
||||
Content-Disposition: inline; filename="test.jpg"
|
||||
Content-Transfer-Encoding: base64
|
||||
Content-ID: <1>
|
||||
X-Attachment-Id: 1
|
||||
|
||||
dGVzdGltYWdl
|
||||
|
||||
--abc
|
||||
Content-Type: text/plain; charset=utf-8
|
||||
|
||||
test2
|
||||
|
||||
--abc--
|
|
@ -0,0 +1,5 @@
|
|||
Subject: test
|
||||
From: <test1@test>
|
||||
To: test2@test
|
||||
Message-ID: <1@test>
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
Subject: test
|
||||
From: test1@test
|
||||
To: test2@test
|
||||
Message-ID: <1@test>
|
||||
Content-Type: text/html; charset=utf-8
|
||||
Content-Transfer-Encoding: quoted-printable
|
||||
|
||||
hello =C3=A4=C3=B6=C3=BC
|
|
@ -0,0 +1,6 @@
|
|||
Subject: test
|
||||
From: test3@test
|
||||
To: test4@localhost
|
||||
Message-ID: <1@test>
|
||||
|
||||
test
|
|
@ -0,0 +1,6 @@
|
|||
Subject: =?UTF-8?Q?suche_M=C3=BCtze?=
|
||||
From: test3@test
|
||||
To: test4@test
|
||||
Message-ID: <1@test>
|
||||
|
||||
Text mit Quoted-Printable-Kodierung: =?utf-8?Q?=C3=A4=C3=B6=C3=BC=C3=9F?=
|
|
@ -0,0 +1,7 @@
|
|||
Subject: test
|
||||
From: test1@test
|
||||
To: test2@test
|
||||
Message-ID: <1@test>
|
||||
Content-Type: text/html; charset=iso-8859-1
|
||||
|
||||
hello äöü
|
|
@ -0,0 +1,21 @@
|
|||
Subject: test
|
||||
From: test1@test
|
||||
To: test2@test
|
||||
Message-ID: <1@test>
|
||||
Content-Type: multipart/mixed; boundary="abc"
|
||||
|
||||
--abc
|
||||
Content-Type: text/plain; charset=utf-8
|
||||
|
||||
test1
|
||||
|
||||
--abc
|
||||
Content-Type: image/jpeg; name="test.jpg"
|
||||
Content-Disposition: attachment; filename="test.jpg"
|
||||
Content-Transfer-Encoding: base64
|
||||
Content-ID: <1>
|
||||
X-Attachment-Id: 1
|
||||
|
||||
dGVzdGltYWdl
|
||||
|
||||
--abc--
|
|
@ -0,0 +1,11 @@
|
|||
Subject: test
|
||||
From: test1@test
|
||||
To: test2@test
|
||||
Message-ID: <1@test>
|
||||
Content-Type: text/html; charset=utf-8
|
||||
|
||||
<div>
|
||||
<div>
|
||||
<p>test</p>
|
||||
</div>
|
||||
</div>
|
|
@ -0,0 +1,6 @@
|
|||
Subject: test =?utf-8?Q?=C3=A4?=
|
||||
From: test3@test
|
||||
To: test4@test
|
||||
Message-ID: <1@test>
|
||||
|
||||
Text mit Quoted-Printable-Kodierung: =?utf-8?Q?=C3=A4=C3=B6=C3=BC=C3=9F?=
|
|
@ -0,0 +1,6 @@
|
|||
Subject: =?utf-8?B?dGVzdA==?=
|
||||
From: test3@test
|
||||
To: test4@test
|
||||
Message-ID: <1@test>
|
||||
|
||||
Text mit Base64-Kodierung: =?utf-8?B?w6TDtsO8w58=?=
|
|
@ -0,0 +1,6 @@
|
|||
Subject: test
|
||||
From: test1@test
|
||||
To: test_event@localhost
|
||||
Message-ID: <1@test>
|
||||
|
||||
test
|
|
@ -0,0 +1,5 @@
|
|||
From: noreply@test
|
||||
To: test2@test
|
||||
Message-ID: <1@test>
|
||||
|
||||
test
|
|
@ -0,0 +1,7 @@
|
|||
Subject: test
|
||||
From: test1@test
|
||||
To: test2@test
|
||||
Message-ID: <1@test>
|
||||
Content-Type: text/html; charset=utf-8
|
||||
|
||||
thank you =?utf-8?Q?=F0=9F=98=8A?=
|
|
@ -93,11 +93,11 @@ def make_reply(reply_email, references=None, event=None):
|
|||
reply_email.save()
|
||||
if references:
|
||||
reply["References"] = " ".join(references)
|
||||
|
||||
reply.set_content(reply_email.body)
|
||||
|
||||
return reply
|
||||
|
||||
if reply_email.body != "":
|
||||
reply.set_content(reply_email.body)
|
||||
return reply
|
||||
else:
|
||||
raise SpecialMailException("mail content emty")
|
||||
|
||||
async def send_smtp(message):
|
||||
await aiosmtplib.send(message, hostname="127.0.0.1", port=25, use_tls=False, start_tls=False)
|
||||
|
@ -299,10 +299,10 @@ class LMTPHandler:
|
|||
systemevent = await database_sync_to_async(SystemEvent.objects.create)(type='email received',
|
||||
reference=email.id)
|
||||
log.info(f"Created system event {systemevent.id}")
|
||||
channel_layer = get_channel_layer()
|
||||
await channel_layer.group_send(
|
||||
'general', {"type": "generic.event", "name": "send_message_to_frontend", "event_id": systemevent.id,
|
||||
"message": "email received"})
|
||||
#channel_layer = get_channel_layer()
|
||||
#await channel_layer.group_send(
|
||||
# 'general', {"type": "generic.event", "name": "send_message_to_frontend", "event_id": systemevent.id,
|
||||
# "message": "email received"})
|
||||
log.info(f"Sent message to frontend")
|
||||
if new and reply:
|
||||
log.info('Sending message to %s' % reply['To'])
|
||||
|
|
0
core/testdata.py
Normal file
0
core/testdata.py
Normal file
|
@ -102,12 +102,6 @@ def manual_ticket(request, event_slug):
|
|||
subject=request.data['name'],
|
||||
body=request.data['body'],
|
||||
)
|
||||
systemevent = SystemEvent.objects.create(type='email received', reference=email.id)
|
||||
channel_layer = get_channel_layer()
|
||||
async_to_sync(channel_layer.group_send)(
|
||||
'general', {"type": "generic.event", "name": "send_message_to_frontend", "event_id": systemevent.id,
|
||||
"message": "email received"}
|
||||
)
|
||||
|
||||
return Response(IssueSerializer(issue).data, status=status.HTTP_201_CREATED)
|
||||
|
||||
|
@ -133,12 +127,6 @@ def add_comment(request, pk):
|
|||
issue_thread=issue,
|
||||
comment=request.data['comment'],
|
||||
)
|
||||
systemevent = SystemEvent.objects.create(type='comment added', reference=comment.id)
|
||||
channel_layer = get_channel_layer()
|
||||
async_to_sync(channel_layer.group_send)(
|
||||
'general', {"type": "generic.event", "name": "send_message_to_frontend", "event_id": systemevent.id,
|
||||
"message": "comment added"}
|
||||
)
|
||||
return Response(CommentSerializer(comment).data, status=status.HTTP_201_CREATED)
|
||||
|
||||
|
||||
|
|
|
@ -7,6 +7,7 @@ services:
|
|||
environment:
|
||||
- HTTP_HOST=core
|
||||
- DB_FILE=dev.db
|
||||
- DEBUG_MODE_ACTIVE=true
|
||||
volumes:
|
||||
- ../../core:/code
|
||||
- ../testdata.py:/code/testdata.py
|
||||
|
|
9399
web/package-lock.json
generated
Normal file
9399
web/package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load diff
|
@ -203,4 +203,4 @@ a {
|
|||
}
|
||||
|
||||
|
||||
</style>
|
||||
</style>
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
<template>
|
||||
<button @click.stop="handleClick" :disabled="disabled">
|
||||
<button @click.stop="handleClick" :disabled="disabled || inProgress">
|
||||
<span class="spinner-border spinner-border-sm" role="status" aria-hidden="true"
|
||||
:class="{'d-none': !disabled}"></span>
|
||||
<span class="ml-2" :class="{'d-none': !disabled}">In Progress...</span>
|
||||
<span :class="{'d-none': disabled}"><slot></slot></span>
|
||||
:class="{'d-none': !inProgress}"></span>
|
||||
<span class="ml-2" :class="{'d-none': !inProgress}">In Progress...</span>
|
||||
<span :class="{'d-none': inProgress}"><slot></slot></span>
|
||||
</button>
|
||||
</template>
|
||||
|
||||
|
@ -13,7 +13,7 @@ export default {
|
|||
name: 'AsyncButton',
|
||||
data() {
|
||||
return {
|
||||
disabled: false,
|
||||
inProgress: false,
|
||||
};
|
||||
},
|
||||
props: {
|
||||
|
@ -21,17 +21,21 @@ export default {
|
|||
type: Function,
|
||||
required: true,
|
||||
},
|
||||
disabled: {
|
||||
type: Boolean,
|
||||
required: false,
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
async handleClick() {
|
||||
if (this.task && typeof this.task === 'function') {
|
||||
this.disabled = true;
|
||||
this.inProgress = true;
|
||||
try {
|
||||
await this.task();
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
} finally {
|
||||
this.disabled = false;
|
||||
this.inProgress = false;
|
||||
}
|
||||
}
|
||||
},
|
||||
|
@ -43,4 +47,4 @@ export default {
|
|||
.spinner-border {
|
||||
vertical-align: -0.125em;
|
||||
}
|
||||
</style>
|
||||
</style>
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
<textarea placeholder="add comment..." v-model="newComment"
|
||||
class="form-control">
|
||||
</textarea>
|
||||
<AsyncButton class="btn btn-secondary float-right" :task="addCommentAndClear">
|
||||
<AsyncButton class="btn btn-secondary float-right" :task="addCommentAndClear" :disabled="!newComment">
|
||||
<font-awesome-icon icon="comment"/>
|
||||
Save Comment
|
||||
</AsyncButton>
|
||||
|
@ -35,7 +35,7 @@
|
|||
<div>
|
||||
<textarea placeholder="reply mail..." v-model="newMail" class="form-control">
|
||||
</textarea>
|
||||
<AsyncButton class="btn btn-primary float-right" :task="sendMailAndClear">
|
||||
<AsyncButton class="btn btn-primary float-right" :task="sendMailAndClear" :disabled="!newMail">
|
||||
<font-awesome-icon icon="envelope"/>
|
||||
Send Mail
|
||||
</AsyncButton>
|
||||
|
|
Loading…
Add table
Reference in a new issue