Files
api/app/email.py
2025-12-30 11:27:14 +07:00

149 lines
5.2 KiB
Python

from app.views import get_serializer
from app.models import *
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from rest_framework.decorators import api_view
from rest_framework import status
from rest_framework.response import Response
from email.utils import formataddr
import smtplib
#=============================================================================
def send_via_zeptomail(receiver, subject, content, sender):
port = 587
smtp_server = "smtp.zeptomail.com"
username="emailapikey"
password = "wSsVR60l/0LwDf8szz2vc+o/mF5WB1PyRE4ri1Wm7nevGvjK9cdtlUWbV1LyG6UdEG8/HDZBp7x8kBoH1joKjNwkzFFUCiiF9mqRe1U4J3x17qnvhDzMWGhbmxCIKY4JxglskmZhFs1u"
# log sent
obj = Email_Sent(subject=subject, receiver=receiver, content=content, status=Send_Status.objects.get(pk=1))
try:
info = Email_Setup.objects.get(pk=sender)
receiver = receiver.split(";")
# log
obj.save()
sent_list = []
for email in receiver:
message = MIMEMultipart("alternative")
message["Subject"] = subject
message["From"] = formataddr((info.display_name, info.email))
message["To"] = email
# Turn these into plain/html MIMEText objects
part = MIMEText(content, "html")
# Add HTML/plain-text parts to MIMEMultipart message
# The email client will try to render the last part first
message.attach(part)
# Create secure connection with server and send email
server = smtplib.SMTP(smtp_server, port)
server.starttls()
server.login(username, password)
server.send_message(message)
sent_list.append(email)
obj.status = Send_Status.objects.get(pk=2)
obj.save()
result = True
except Exception as ex:
print(ex)
obj.status = Send_Status.objects.get(pk=3)
obj.save()
result = False
return result
#=============================================================================
def send_one_by_one(receiver, subject, content, sender):
# log sent
obj = Email_Sent(subject=subject, receiver=receiver, content=content, status=Send_Status.objects.get(pk=1))
try:
info = Email_Setup.objects.get(pk=sender)
receiver = receiver.split(";")
# log
obj.save()
sent_list = []
for email in receiver:
message = MIMEMultipart("alternative")
message["Subject"] = subject
message["From"] = formataddr((info.display_name, info.email))
message["To"] = email
# Turn these into plain/html MIMEText objects
part = MIMEText(content, "html")
# Add HTML/plain-text parts to MIMEMultipart message
# The email client will try to render the last part first
message.attach(part)
# Create secure connection with server and send email
server = smtplib.SMTP(info.smtp, info.port)
server.starttls()
server.login(info.email, info.password)
server.sendmail(info.email, email, message.as_string())
sent_list.append(email)
obj.status = Send_Status.objects.get(pk=2)
obj.save()
result = True
except Exception as ex:
print(ex)
obj.status = Send_Status.objects.get(pk=3)
obj.save()
result = False
return result
#=============================================================================
def send_all(receiver, subject, content, sender):
try:
info = Email_Setup.objects.get(pk=sender)
message = MIMEMultipart("alternative")
message["Subject"] = subject
message["From"] = formataddr((info.display_name, info.email))
receiver = receiver.split(";")
message["To"] = ", ".join(receiver)
# Turn these into plain/html MIMEText objects
part = MIMEText(content, "html")
# Add HTML/plain-text parts to MIMEMultipart message
# The email client will try to render the last part first
message.attach(part)
# Create secure connection with server and send email
server = smtplib.SMTP(info.smtp, info.port)
server.starttls()
server.login(info.email, info.password)
server.sendmail(info.email, receiver, message.as_string())
result = True
except Exception as ex:
print(ex)
result = False
Model, serializer_class = get_serializer('Email_Sent')
data = {"subject": subject, "receiver": message["To"], "content": content, "status": 2 if result==True else 3}
serializer = serializer_class(data=data)
serializer.save() if serializer.is_valid() else print(serializer.errors)
return result
#=============================================================================
@api_view(['POST'])
def send_email(request):
subject = request.data.get('subject')
receiver = request.data.get('to')
content = request.data.get('content')
sender = 1
if 'sender' in request.data:
sender = request.data.get('sender')
# send email
send_via_zeptomail(receiver, subject, content, sender)
return Response(status=status.HTTP_204_NO_CONTENT)