V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
Yinz
V2EX  ›  分享创造

PostMail,一个让你能够使用 POST 请求发送邮件的简易 Flask Server

  •  1
     
  •   Yinz ·
    Yinzo · 2016-07-12 20:48:56 +08:00 · 6147 次点击
    这是一个创建于 2845 天前的主题,其中的信息可能已经有所发展或是发生改变。

    前情概述

    自己本身常常写一些小程序,包括但不限于爬虫, QQ 机器人,邮件提醒都经常非常有用,提醒任务完成情况、 QQ 掉线提示等。但是对于分发给其他用户使用的程序,让用户配置 smtp 有技术门槛并且很麻烦,而自己配置好直接分发又有邮箱密码明文的问题。

    于是有了这个想法。在服务器(远程 or 本地)上部署一个配置好的 smtp 服务器,然后使用时只需要对服务器 POST 请求,即可发送邮件,而不需要任何额外的设置与配置。

    (然而写完之后才发现想法和 mailgun 撞车了)

    所以知道 mailgun 的各位,可以简单的认为这是个简易版的 mailgun 轮子。

    快速开始

    1. 安装 Flask
    sudo pip install Flask
    
    1. postmail.py 开头配置必要参数
    DEFAULT_RECEIVER = ""       # 缺省的邮件接收邮箱
    DEFAULT_SENDER_NAME = ""    # 缺省的发送者姓名
    MAIL_HOST = ""              # SMTP 服务器地址, 如 smtp.126.com
    MAIL_ADDRESS = ""           # 服务器登录的邮箱地址
    PASSWORD = ""               # 服务器登录的邮箱密码
    
    1. 运行服务器,默认运行在 80 端口以及对应 url 是 '/mail'
    python run.py
    
    1. 然后就可以用 POST 发邮件了! 你甚至不需要指定收件人,因为配置里有『默认收件人』这一选项
    import requests
    
    response = requests.post('http://www.yourserver.com/mail', data={
        'subject': "PostMail!",
        'content': "This mail is sent by PostMail!"
    })
    

    高级

    • 使用安全密钥来提升安全性

    修改postmail.py文件开头的秘钥选项

    SECRET_KEY = "your_key"             # 用于验证身份的 key, 留空表示不启用 key 验证机制
    

    然后你的所有请求都必须包含正确的key才会被执行发送

    import requests
    
    response = requests.post('http://www.yourserver.com/mail', data={
        'key': "your_key",
        'subject': "PostMail!",
        'content': "This mail is sent by PostMail!"
    })
    

    补充:本项目适合个人使用的邮件发送服务,暂时还没有测试过比较大规模的发送,而且程序本身趋向简洁,没有使用多线程和任务队列来进行发送,所以效率可能不高。当然,在 Flask server 中稍微修改一下就可以实现多线程处理了,只是邮件发送结果的反馈有点难办 XD

    如果你担心接口被滥用,这里还提供了一个『自动抄送』的选项,你可以开启这一选项,之后邮件的请求如果没有包含你的默认接收邮箱,会自动抄送给你的默认接收邮箱,这样至少可以尽快的察觉到这一问题然后修改秘钥 XD

    项目地址 https://github.com/Yinzo/PostMail

    如果你觉得这个项目很棒,欢迎给我点个 Star ;D

    6 条回复    2016-07-12 23:10:20 +08:00
    lemonda
        1
    lemonda  
       2016-07-12 22:09:04 +08:00
    很有用,不少主机上封了 smtp ,只能通过 API 发信
    Yinz
        2
    Yinz  
    OP
       2016-07-12 22:12:57 +08:00
    @lemonda 意外地解决了一个意想不到的需求 :D
    lhbc
        3
    lhbc  
       2016-07-12 22:30:19 +08:00 via Android
    能发 HTML 邮件吗?
    Yinz
        4
    Yinz  
    OP
       2016-07-12 22:41:29 +08:00
    @lhbc 帮你加上了;D 刚刚 push 上去,请求里面带一个 subtype 就好了,就像这样, 默认 subtype 是'plain'
    ```
    response = requests.post('http://www.yourserver.com/mail', data={
    'subtype: "html",
    'subject': "PostMail!",
    'content': "This mail is sent by PostMail!"
    })
    ```
    zhchbin
        5
    zhchbin  
       2016-07-12 23:07:26 +08:00
    https://github.com/Yinzo/PostMail/blob/master/run.py#L14-L15 这两行的顺序应该反了吧。。
    Yinz
        6
    Yinz  
    OP
       2016-07-12 23:10:20 +08:00
    @zhchbin 感谢指出 XD , 之前 debug 时弄出来忘记放回去了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2682 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 10:36 · PVG 18:36 · LAX 03:36 · JFK 06:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.