zoukankan      html  css  js  c++  java
  • Django自带认证系统邮件模板自定义

    这几天部署Docker设置Nginx遇到了邮件发送问题
    首先我的问题就是,在服务器上部署Docker之后
    然后宿主机的Nginx设置代理

    server
    {
          listen 80;
          server_name cumt.studio www.cumt.studio;
          location / {
            proxy_redirect off;
    
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass http://127.0.0.1:8003;
          }
    }
    

    proxy_pass监听了Docker内网端口
    然后代码使用了Django自带的认证系统
    以及封装好的Django-registration-redux注册模块
    使用上面的Nginx接收的邮件里只有example.com

    error

    然后找到了一个解决办法
    需要设置proxy_host,将host代理为你的域名

    好吧.....我太菜
    不是很懂Nginx配置,搜了好久,搞了好久
    也问了一些人,我放弃了...........
    (或许以后某一天就懂了....orzzz)

    怎么办??

    然后想到flask中模板可以自定义
    讲道理这个Django应该也是可以的吧
    然后又是一顿乱搜....
    最后还是回归到了官方文档

    关于Django自带的认证系统
    文档(看的翻译版本)这样写的
    以重置密码为例

    password_reset(
    	request,
    	template_name='registration/password_reset_form.html',
    	email_template_name='registration/password_reset_email.html',
    	subject_template_name='registration/password_reset_subject.txt',
    	password_reset_form=PasswordResetForm,
    	token_generator=default_token_generator,
    	post_reset_redirect=None,
    	from_email=None,
    	current_app=None,
    	extra_context=None,
    	html_email_template_name=None,
    	extra_email_context=None
    )
    

    允许用户通过生成一次性使用链接来重置密码
    并将该链接发送到用户的注册电子邮件地址

    如果系统中不存在提供的电子邮件地址
    此视图将不会发送电子邮件,但用户也不会收到任何错误消息
    这防止信息泄露给潜在的攻击者,如果在这种情况下要提供错误消息
    可以将 PasswordResetForm 子类化并使用 password_reset_form 参数

    用户被标记为不可用的密码(请参阅 set_unusable_password() 不允许请求重置密码以防止在使用LDAP等外部认证源时发生误操作)
    注意,他们不会收到任何错误消息,因为这将暴露其帐户的存在,但没有邮件也将被发送

    可选参数:

    • template_name:用于显示密码重置表单的模板的全名如果未提供,则默认为 registration/password_reset_form.html

    • email_template_name:用于使用重置密码链接生成电子邮件的模板的全名如果未提供,则默认为 registration/password_reset_email.html

    • subject_template_name:用于具有重置密码链接的电子邮件主题的模板的全名如果未提供,则默认为 registration/password_reset_subject.txt

    • password_reset_form:用于获取用户重置密码的电子邮件的表单默认为 PasswordResetForm

    • token_generator:类的实例检查一次性链接这将默认为 default_token_generator,它是 django.contrib.auth.tokens.PasswordResetTokenGenerator 的实例

    • post_reset_redirect:成功重置密码后重定向到的网址

    • from_email:有效的电子邮件地址默认情况下,Django使用 DEFAULT_FROM_EMAIL

    • html_email_template_name:用于生成带有密码重置链接的 text/html 分段电子邮件的模板的全名默认情况下,不发送HTML电子邮件

    • extra_email_context:电子邮件模板中将提供的上下文数据字典

    模板上下文:

    • form:用于重置用户密码的表单(请参阅上面的 password_reset_form)

    电子邮件模板上下文:

    • email:user.email 的别名

    • user:当前 User,根据 email 表单字段只有活动用户才能重置其密码(User.is_active is True)

    • site_name:site.name 的别名如果你没有安装网站框架,这将被设置为 request.META['SERVER_NAME'] 的值有关网站的更多信息,请参见 “网站”框架

    • domain:site.domain 的别名如果你没有安装网站框架,这将被设置为 request.get_host() 的值

    • protocol:http或https

    • uid:用base64编码的用户主键

    • token:用于检查复位链接是否有效的令牌

    示例 registration/password_reset_email.html(电子邮件正文模板):

    Someone asked for password reset for email {{ email }}. Follow the link below:
    {{ protocol}}://{{ domain }}{% url 'password_reset_confirm' uidb64=uid token=token %}
    

    很明显了,直接添加下面的文件到registration/password_reset_email.html

    你收到这封邮件是因为你请求重置平台的账户密码
    
    如果这个用户名是属于您的话: {{ email }}
    
    请访问该页面并选择一个新密码:
    
    {{ protocol}}://自己的域名{% url 'password_reset_confirm' uidb64=uid token=token %}
    
    {{ request.META }}
    
    否则,请忽略这封邮件!
    
    感谢使用我们的站点!
    
    翔工作室技术组
    

    现在就是说site_name和domain是默认链接里的网址
    我把域名写死,就发不错了..............
    (这里可以获取 request.META.HTTP_HOST 获取网址,但是重置密码的邮件还是获取不到,我就还是写死了./.)

    orz

    同理,在注册页面的django-registration-redux官方文档处
    没找到..........默认模板的命名方式
    然后,我就在万能的github搜了一下,activation_email.html(忘了怎么想到是搜这个词的了)
    就是这个命名,仿照上面的格式在registration新建就行了

    如果要更改邮件标题
    可以同一目录添加activation_email_subject.txt和password_reset_subject.txt

    虽然是个很笨的方法,但是几天的问题解决了


    2018/4/18更新

    这个项目在Djanago自带后台有站点设置,修改之后可以正常显示邮件中{{ domain }}信息
    不过如果想要自定义邮件模板还是要如上文一样新建html

    链接:
    Django认证系统视图
    Django-registration-redux文档

  • 相关阅读:
    那些年,我们一起做过的 Java 课后练习题(66 70)
    UI自动化测试:App的WebView页面中,当搜索栏无搜索按钮时处理方法
    追剧《大秦帝国》之感
    雷达距离方程 理解
    观影<和平战士> 之后感
    【转】使用blend改变图片颜色
    ios UITabBar/UITabBarController
    Windows批处理开启/停止服务及隐藏批处理窗口
    Windows设置定时自动重启
    Windows使用命令行查看文件的hash值(certutil)
  • 原文地址:https://www.cnblogs.com/bay1/p/10982231.html
Copyright © 2011-2022 走看看