IMAP API –自托管后台驻留程序,可通过HTTP API访问IMAP和SMTP帐户

2020-12-10 21:24:35

自托管应用程序,可通过REST访问IMAP和SMTP帐户。轻松将电子邮件帐户与您的服务集成!

公开IMAP API已根据AGPL许可。邮政系统订户可以使用MIT许可的IMAP API的替代版本。您可以从邮政系统专用注册表中将其安装为@ postalsys / imapapi。

同步用户将电子邮件发送到您的服务中,并代表您的用户发送电子邮件(帮助台软件等)

电子邮件应用程序(不想处理IMAP和MIME的轻量级Webmail和移动应用程序等)

确保您已安装最新的(至少v12.16.0)Node.js。直接从NPM运行IMAP API,而无需手动下载或安装任何东西:

IMAP API允许通过基于REST的API轻松访问IMAP帐户。无需了解IMAP或MIME内部结构,您将获得" normal"具有分页消息列表的API。所有文本(即主题,电子邮件地址,文本和html内容等)均为utf-8。附件会自动解码为二进制表示形式。

部分文字下载。您显然可以下载整个rfc822格式的原始消息,但是使用提供的分页和消息详细信息可能会更容易。这还允许为下载的文本内容指定最大大小。有时,自动化的Cron脚本等会发送包含10 + MB文本的电子邮件,以免下载IMAP API允许设置文本最大字体大小的东西。

每当跟踪帐户发生任何事情时,IMAP API都会通过Webhook发布通知。这包括新消息,已删除消息和消息标志更改。

轻松发送电子邮件。如果您指定要响应或转发的邮件,则IMAP API会设置所有必需的标头,更新IMAP中的引用邮件标志,并在发送后将邮件上传到“已发送邮件”文件夹中。

IMAP API是IMAP的较薄包装。这意味着它没有自己的存储。这也意味着,如果当前未打开IMAP连接,则由于API请求而导致网关错误。

IMAP API会针对每个注册的用户帐户保持一个持久的IMAP连接打开。要停止同步,您必须从IMAP API中删除该帐户。这与某些Webmail实现不同,在这些实现中,连接仅在用户会话期间保持打开状态。

如果可用,则IMAP API使用项目根目录中的dotenv文件填充环境变量。

打开“设置”标签,并设置Webhooks的URL。每当任何跟踪的电子邮件帐户发生故障时,您都会收到此URL的通知。

例如,如果标记已更新,则您将收到如下所示的通知:

{" account&#34 ;:" example&#34 ;," path&#34 ;:" [Google Mail] / All Mail&#34 ;,&#34 ; event&#34 ;:" messageUpdated&#34 ;、" data&#34 ;: {" id&#34 ;:" AAAAAQAAAeE&#34 ;,&# 34; uid&#34 ;: 350861," changes&#34 ;: {" flags&#34 ;: {" added&#34 ;: [" \\ Seen"]}}}}

您需要IMAP和SMTP设置,还需要为此帐户提供某种类型的标识字符串值。您可以使用与主系统相同的ID,也可以生成一些唯一的ID。以后需要此值来标识此帐户并对其执行操作。

注意!尝试创建具有相同ID的新帐户会更新现有帐户。

$ curl -XPOST" localhost:3000 / v1 / account" -H"内容类型:application / json" -d' {account&#34 ;:" example&#34 ;," name&#34 ;:"我的示例帐户&#34 ;," imap& #34 ;: {" host&#34 ;:" imap.gmail.com&#34 ;、" port&#34 ;: 993," secure&#34 ;:是,& #34; auth&#34 ;: {" user&#34 ;:" [email protected]" ;、" pass&#34 ;:" verysecret" }}," smtp&#34 ;: {" host&#34 ;:" smtp.gmail.com&#34 ;," port&#34 ;: 465,"安全&#34 ;: true," auth&#34 ;: {" user&#34 ;:" [email protected]" ;," pass&#34 ;:&# 34; verysecret" }}}'

现在,无论何时发生任何事情,您都会收到通知。如果这还不够,那么您也可以使用IMAP帐户执行正常操作。

IMAP API返回分页结果,首先返回新消息。因此,要获取第一页或换句话说,获取邮箱文件夹中的最新消息,您可以像这样进行操作(请注意,我们在请求URL中先前设置的" example" id字符串):

{" page&#34 ;: 0," pages ## 34 :: 10," messages&#34 ;: [{" id&#34 ;:&#34 ; AAAAAQAAAeE&#34 ;," uid&#34 ;: 481," date&#34 ;:" 2019-10-07T06:05:23.000Z&#34 ;,&# 34; size&#34 ;: 4334," subject&#34 ;:" Test message&#34 ;," from&#34 ;: {" name&#34 ;:" PeterPõder&#34 ;,"地址&#34 ;:" [email protected]" }," to&#34 ;: [{" name&#34 ;:" &#34 ;、地址&#34 ;:" [email protected]" }]," messageId&#34 ;:"< [email protected]> &#34 ;,&#34 ;: {" id&#34 ;:" AAAAAQAAAeGTkaExkaEykA&#34 ;," encodedSize&#34 ;: {&#34 ; plain&#34 ;: 17," html&#34 ;: 2135}}}]}

提取下一页时,将页面查询参数添加到URL。页面是零索引,因此如果服务器显示总共有10个页面,则意味着您可以从page = 0到page = 9进行查询。如果需要更长的页面,请使用pageSize查询参数。

以下是如何发送回复的示例。在这种情况下,您应该指定要回复的参考消息(注意!此消息必须存在)。使用" id"从邮件列表中作为" reference.message"值。

如果未从IMAP帐户中找到引用的消息,则API会以404错误进行响应,并且不会发出答复。

curl -XPOST" localhost:3000 / v1 / account / example / submit" -H"内容类型:application / json" -d' {&#34 ;: {" message&#34 ;:" AAAAAQAAAeE&#34 ;," action&#34 ;:" reply&# 34; }," from&#34 ;: {" name&#34 ;:" Example Sender&#34 ;," address&#34 ;:" [email protected]&# 34; }," to&#34 ;: [{" name&#34 ;:" Andris Reinman&#34 ;," address&#34 ;:" [email protected]& #34; }],"文本&#34 ;:我对您的回复"," html":"< p>我对您的回复< / p>& #34;,"附件":[{" filename&#34 ;:" checkmark.png"," content":" iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQAQMAAAAlPW0iAAAABlBMVEUAAAD / // + l2Z / dAAAAM0lEQVR4nGP4 / 5 / h / 1 + G / 58ZDrAz3D / McH8yw83NDDeNGe4Ug9C9zwz3gVLMDA / A6P9 / AFGGFyjOXZtQAAAAAElFTkSuQmCC" }]}'

注意!如果您要发送独立电子邮件,那么您很可能也希望设置主题值。对于答复和转发,IMAP API根据引用的消息设置主题本身。

如果未设置主题,则IMAP API将从引用的消息中派生该主题,并向其添加Re:或Fwd:前缀

IMAP API将已发送的邮件上载到“已发送邮件”文件夹(如果可以自动检测到该文件夹​​)

当帐户为Gmail / GSuite时,IMAP API不会上传到“已发送邮件”文件夹,因为Gmail会自动执行此操作

IMAP API不管理OAuth2访问令牌,您必须自己提供这些令牌。这意味着,每次IMAP API需要对OAuth2帐户进行身份验证时,都会向身份验证服务器发出HTTP请求。该服务器负责使用有效的访问令牌重新分配。

在“设置”页面中设置身份验证服务器URL,方法与设置Webhook URL相同

IMAP API使用另外两个GET参数针对身份验证服务器URL发出HTTP请求:帐户和协议,例如url?account = example& proto = imap

curl -XPOST" localhost:3000 / v1 / account" -H"内容类型:application / json" -d' {account&#34 ;:" ouath-user&#34 ;," name&#34 ;:" Example&#34 ;," imap& #34 ;: {" host&#34 ;:" imap.gmail.com&#34 ;、" port&#34 ;: 993," secure&#34 ;:是,& #34; useAuthServer&#34 ;: true}," smtp&#34 ;: {" host&#34 ;:" smtp.gmail.com&#34 ;," port&#34 ;:465," secure&#34 ;: true," useAuthServer&#34 ;: true}}'

没错。应用程序本身(Web UI和API端点)均未实现任何类型的身份验证或ACL。想法是IMAP API仅处理IMAP访问,而其他所有东西则留给用户,因为每个系统都不相同。

默认情况下,IMAP API仅允许来自本地主机的连接。要更改此设置,请编辑配置文件或使用--api.host =" 0.0.0.0" cli选项。这将启用外部访问,因此您应该使用防火墙仅允许您自己的应用程序访问它。对于Web UI,建议将Nginx或Apache代理与HTTP基本身份验证一起使用,可能仅用于VPN地址。

请参阅示例性的系统单元文件,将IMAP API作为服务运行,以及示例性的Nginx配置文件,以在Nginx反向代理之后为IMAP API请求提供服务。