77 lines
3.2 KiB
Python
Executable File
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': '验证码无效或已过期'}
|