Django代理申请网站:PDF简历上传失败及邮件无法发送修复
解决方案:Django Agent申请表单CV上传与邮件发送问题
一、解决CV返回None的问题
1. 修正HTML表单的enctype属性
表单必须添加enctype="multipart/form-data"才能正确接收文件上传,否则request.FILES会为空:
<form method="POST" enctype="multipart/form-data"> {% csrf_token %} <!-- 其他表单字段:姓名、邮箱、电话等 --> <input type="file" name="cv" accept=".pdf" required> <button type="submit">提交申请</button> </form>
2. 正确处理views.py中的文件上传
- 先确保表单类定义了带PDF验证的FileField字段:
# forms.py(独立表单类示例) from django import forms from django.core.validators import FileExtensionValidator class AgentApplicationForm(forms.Form): name = forms.CharField(label="姓名") email = forms.EmailField(label="邮箱") cv = forms.FileField( label="上传简历(仅支持PDF)", validators=[FileExtensionValidator(['pdf'])] )
- 视图中实例化表单时必须同时传入
request.POST和request.FILES:
# views.py from django.shortcuts import render from .forms import AgentApplicationForm from django.core.mail import EmailMessage from django.conf import settings def agent_application(request): if request.method == 'POST': # 必须同时传入POST和FILES数据 form = AgentApplicationForm(request.POST, request.FILES) if form.is_valid(): # 获取CV文件对象 cv_file = request.FILES.get('cv') # 调试用:打印确认文件是否被接收 print("获取到的CV文件:", cv_file) # 后续邮件发送逻辑 pass else: form = AgentApplicationForm() return render(request, 'application_form.html', {'form': form})
3. 验证文件上传基础配置
检查settings.py中是否设置了合理的文件大小限制:
# settings.py FILE_UPLOAD_MAX_MEMORY_SIZE = 5242880 # 限制为5MB,可根据需求调整
二、解决邮件无法发送的问题
1. 修正settings.py的邮件配置
根据你使用的邮件服务商调整参数,以下是QQ邮箱的配置示例:
# settings.py # 开发环境可先使用控制台后端测试邮件内容 # EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' # 生产环境SMTP配置 EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' EMAIL_HOST = 'smtp.qq.com' EMAIL_PORT = 587 EMAIL_USE_TLS = True EMAIL_HOST_USER = 'your-qq-email@qq.com' EMAIL_HOST_PASSWORD = 'your-app-auth-code' # 注意是邮箱授权码,不是登录密码 DEFAULT_FROM_EMAIL = EMAIL_HOST_USER
2. 正确构造带附件的邮件
在表单验证通过后,使用EmailMessage类发送带CV附件的邮件:
# views.py(在form.is_valid()逻辑内) if cv_file: # 构造邮件内容 subject = f"新Agent申请:{form.cleaned_data['name']}" message_content = f""" 申请人信息: 姓名:{form.cleaned_data['name']} 邮箱:{form.cleaned_data['email']} """ hr_email = ['hr@yourcompany.com'] # 替换为实际HR邮箱 # 创建邮件对象 email = EmailMessage( subject, message_content, settings.DEFAULT_FROM_EMAIL, hr_email ) # 附加CV文件 email.attach( cv_file.name, cv_file.read(), cv_file.content_type ) # 发送邮件并捕获异常 try: email.send() return render(request, 'success.html') # 跳转成功页面 except Exception as e: print("邮件发送失败:", str(e)) return render(request, 'application_form.html', { 'form': form, 'error': '邮件发送失败,请稍后重试' })
3. 常见排查点
- 确认邮件服务商的SMTP服务已开启(如QQ邮箱需在设置中开启SMTP并生成授权码)
- 检查服务器防火墙是否允许访问对应SMTP端口(如587、465)
- 开发阶段先用
console.EmailBackend验证邮件内容是否正确,再切换到SMTP后端
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

