Welcome to poste-sdk’s documentation!

部署poste.io

官网安装方式

  1. How to install?

  2. RSPAMD: 快速、免费和开源的垃圾邮件过滤系统. 查看rspamd

  3. CLAMAV: 病毒扫描 查看clamav

  4. docker-compose, 不关闭垃圾过滤&病毒扫描,会耗费更多的内存,还会不定时的拉取更新病毒库

version: '3'

services:
  mailserver:
    image: analogic/poste.io
    container_name: mailserver
    restart: unless-stopped
    ports:
      - "25:25"
      - "80:80"
      - "443:443"
      - "4190:4190"
      - "110:110"
      - "143:143"
      - "465:465"
      - "587:587"
      - "993:993"
      - "995:995"
    privileged: true
    environment:
      - HTTPS=ON
      - DISABLE_RSPAMD=TRUE
      - DISABLE_CLAMAV=TRUE
      - TZ=Asia/Shanghai
    volumes:
      - ./mailserver_data:/data
  1. DNS 配置

  2. 机器配置1C2G 就可以启动,所有服务,要想稳定运行需要加内存。或者关闭病毒扫描CLAMAV内存大户

  3. 可以把发信方加入白名单,提高优先级,达到快速接信的目的,有多快?快三倍的样子

Ubuntu安装

安装docker&docker-compose

  • apt update

  • apt install docker.io

  • apt install docker-compose

部署

# 需要垃圾过滤,病毒扫描的可以打开 DISABLE_RSPAMD。DISABLE_CLAMAV
docker-compose up -d

域名申请

  1. Freenom

  2. 修改nameserver,托管到cloudflare

cloudflare操作

Note

A 和 CNAME 记录

mail.your-domain.com A → 外网IP

smtp.your-domain.com CNAME mail.your-domain.com

pop.your-domain.com CNAME mail.your-domain.com

imap.your-domain.com CNAME mail.your-domain.com

MX for your domain

your-domain.com MX mail.your-domain.com

SPF record:your-domain.com. IN TXT “v=spf1 mx ~all”

DMARC record:_dmarc.our-domain.com. IN TXT “v=DMARC1; p=none; rua=mailto:dmarc-reports@our-domain.com”

DKIM record : Virtual domains → your-domain.com→ regenerate key

使用样例

Note

  1. 支持 verify_ssl = False 国内无域名 开443端口情况

  2. 解析dns 要是在国内托管给cloudflare 会有不稳定的情况,可以修改本地host

  3. 主要用途:临时邮箱接受邮件

安装

pip install poste-sdk -U

获取可用域名

from typing import List

from poste_sdk.client import PosteClient
from poste_sdk.models import Domains
from poste_sdk.models import Box

with PosteClient(address='管理账户', password='密码', domain='域名/ip', verify_ssl = False) as client:
    # 获取可用域名
    domains = client.get_domains()
    assert isinstance(domains, List)
    assert isinstance(domains[0], Domains)

获取邮箱列表

from typing import List

from poste_sdk.client import PosteClient
from poste_sdk.models import Domains
from poste_sdk.models import Box

with PosteClient(address='管理账户', password='密码', domain='域名') as client:
    # 获取邮箱列表
    # page=1,paging=14000 分页
    # boxes = client.get_boxes(page=1,paging=14000)
    boxes = client.get_boxes()
    assert isinstance(boxes, List)
    assert isinstance(boxes[0], Box)

删除邮箱列表

from typing import List

from poste_sdk.client import PosteClient
from poste_sdk.models import Domains
from poste_sdk.models import Box

with PosteClient(address='管理账户', password='密码', domain='域名') as client:
    # 获取邮箱列表
    for i in tqdm(EMAIL_CLIENT.get_boxes(page=1,paging=14000)):
        # 跳过管理账户
        if 'admin' in i.address:
            continue
        # 删除邮件数量为0的邮箱
        v = BoxClient(address=i.address,password=i.user).get_email_cnt()
        if v == 0 and 'admin' not in i.address:
            EMAIL_CLIENT.delete_box(i.address)

邮箱操作

from poste_sdk.client import PosteClient
from poste_sdk.client import BoxClient
from poste_sdk.models import Mail

with PosteClient(address='管理账户', password='密码', domain='域名') as client:
    # 初始化
    box_client = client.init_box_client(email_prefix='test', password='test')
    assert isinstance(box_client, BoxClient)
    # 获取最近1条邮件
    mail = box_client.get_latest()
    assert isinstance(mail, Mail)

    # email 总数量
    box_client.get_email_cnt()

    # 获取指定邮件
    mail = box_client.get_email(id_=1)
    assert isinstance(mail, Mail)

    # 删除邮件
    box_client.delete_by_id(1)

    # 清空邮件
    box_client.drop_mails()

Indices and tables