ai_admin/WebAdmin/mail.py
2024-09-20 04:29:09 +00:00

77 lines
3.2 KiB
Python
Executable File

import json
from datetime import timedelta
from tencentcloud.common import credential
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException
from tencentcloud.ses.v20201002 import ses_client, models
from django.utils.crypto import get_random_string
from django.conf import settings
from datetime import datetime
from .models import EmailVerificationCode
def generate_verification_code(length=6):
return get_random_string(length=length, allowed_chars='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789')
def send_email_with_template(secret_id, secret_key, from_email, to_email, subject, template_id, code):
try:
# 实例化一个认证对象
cred = credential.Credential(secret_id, secret_key)
httpProfile = HttpProfile()
httpProfile.endpoint = "ses.tencentcloudapi.com"
clientProfile = ClientProfile()
clientProfile.httpProfile = httpProfile
client = ses_client.SesClient(cred, "ap-hongkong", clientProfile)
# 实例化一个请求对象
req = models.SendEmailRequest()
params = {
"FromEmailAddress":f'typeframes <{from_email}>',
"Destination": [to_email],
"Subject": subject,
"ReplyToAddresses": from_email,
"Template": {
"TemplateID": template_id,
"TemplateData": json.dumps({"name": to_email, "code": code})
}
}
req.from_json_string(json.dumps(params))
# 发送请求并返回响应
resp = client.SendEmail(req)
return resp.to_json_string()
except TencentCloudSDKException as err:
return str(err)
def send_verification_email(email):
code = generate_verification_code()
subject = '您的验证码'
template_id = 125447 # 替换为实际的模板 ID
from_email = settings.EMAIL_HOST_USER
response = send_email_with_template(settings.SECRET_ID, settings.MAIL_SECRET_KEY, from_email, email, subject, template_id, code)
response_json = json.loads(response)
if "Error" in response_json.get("Response", {}):
return {'code': 400, 'message': f'发送邮件失败: {response_json["Response"]["Error"]["Message"]}'}
EmailVerificationCode.objects.create(email=email, code=code, created_at=datetime.now())
return {'code': 200, 'message': '验证码发送成功'}
def verify_code(email, code):
try:
email_code = EmailVerificationCode.objects.filter(email=email, code=code, is_used=False).latest('created_at')
if email_code is None:
return {'code': 400, 'message': '请先获取验证码'}
if email_code.created_at < datetime.now() - timedelta(minutes=5):
return {'code': 400, 'message': '验证码已过期'}
email_code.is_used = True
email_code.save()
return {'code': 200, 'message': '验证码验证成功'}
except EmailVerificationCode.DoesNotExist:
return {'code': 400, 'message': '验证码无效或已过期'}