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': '验证码无效或已过期'}