爱意满满的作品展示区。
Yinz

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

  •  1
     
  •   Yinz ·
    Yinzo · Jul 12, 2016 · 6855 views
    This topic created in 3632 days ago, the information mentioned may be changed or developed.

    前情概述

    自己本身常常写一些小程序,包括但不限于爬虫, 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 replies    2016-07-12 23:10:20 +08:00
    lemonda
        1
    lemonda  
       Jul 12, 2016
    很有用,不少主机上封了 smtp ,只能通过 API 发信
    Yinz
        2
    Yinz  
    OP
       Jul 12, 2016
    @lemonda 意外地解决了一个意想不到的需求 :D
    lhbc
        3
    lhbc  
       Jul 12, 2016 via Android
    能发 HTML 邮件吗?
    Yinz
        4
    Yinz  
    OP
       Jul 12, 2016
    @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  
       Jul 12, 2016
    https://github.com/Yinzo/PostMail/blob/master/run.py#L14-L15 这两行的顺序应该反了吧。。
    Yinz
        6
    Yinz  
    OP
       Jul 12, 2016
    @zhchbin 感谢指出 XD , 之前 debug 时弄出来忘记放回去了
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5475 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 51ms · UTC 09:02 · PVG 17:02 · LAX 02:02 · JFK 05:02
    ♥ Do have faith in what you're doing.