{"id":1080,"date":"2021-02-08T13:18:11","date_gmt":"2021-02-08T12:18:11","guid":{"rendered":"https:\/\/blog.tiraquelibras.com\/?p=1080"},"modified":"2021-02-09T08:51:54","modified_gmt":"2021-02-09T07:51:54","slug":"activar-dovecot-api-y-comandos-en-bash-y-python-parte-17","status":"publish","type":"post","link":"https:\/\/blog.tiraquelibras.com\/?p=1080","title":{"rendered":"Activar Dovecot API y comandos en Bash y Python  (parte 17)"},"content":{"rendered":"\n<p class=\"has-light-green-cyan-background-color has-background\">Esta es una entrada dentro de la serie para la instalaci\u00f3n de un servidor de correo completo. \u00cdndice completo de contenidos pincha <a href=\"https:\/\/blog.tiraquelibras.com\/?p=601\" target=\"_blank\" rel=\"noreferrer noopener nofollow\" class=\"external external_icon\">aqu\u00ed<\/a>.<\/p>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<p>Dovecot ofrece la posibilidad de activar una funcionalidad <em>experimental<\/em>, a partir de su versi\u00f3n <strong>v2.2.22<\/strong>, que permite interactuar con comandos <strong>doveadm<\/strong> utilizando una serie de <strong>APIs<\/strong> v\u00eda <em>HTTP<\/em>. Esto nos permite ejecutar sus comandos mediante el uso de la herramienta <strong>CURL<\/strong>.<\/p>\n\n\n\n<p>Esta nueva caracter\u00edstica nos brinda la oportunidad de realizar nuestros propios programas, scripts, paneles de adminsitraci\u00f3n de buzones, etc sin necesidad de utilizar un usuario del sistema con privilegios. S\u00edmplemente debemos de tener o las credenciales del usuario de <em>doveadm<\/em> o el <em>Token<\/em> que nos permita lanzar peticiones <em>HTTP<\/em> desde el exterior o desde la misma m\u00e1quina local.<\/p>\n\n\n\n<p>Son muchos los comandos que podremos ejecutar, cubriendo cualquier necesidad que podamos tener en la administraci\u00f3n de este <em>Backend<\/em> para buzones de correo electr\u00f3nico.<\/p>\n\n\n\n<p>Esta entrada se suma a nuestro manual para la configuraci\u00f3n de un compelto servidor de correo electr\u00f3ncio, indicado al comienzo, pero es extensible a cualquier instalaci\u00f3n de <em>Dovecot<\/em> que cumpla con la versi\u00f3n m\u00ednima requerida o superior.<\/p>\n\n\n\n<p>En el momento en el que se redact\u00f3 esta entrada del blog dispon\u00edamos de la versi\u00f3n <strong>Dovecot v2.22.27<\/strong>.<\/p>\n\n\n\n<p>Vamos al l\u00edo!!!<\/p>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_76 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Tabla de contenidos<\/p>\n<label for=\"ez-toc-cssicon-toggle-item-69f4a81f8296a\" class=\"ez-toc-cssicon-toggle-label\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/label><input type=\"checkbox\"  id=\"ez-toc-cssicon-toggle-item-69f4a81f8296a\"  aria-label=\"Alternar\" \/><nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1 external external_icon\" href=\"https:\/\/blog.tiraquelibras.com\/?p=1080\/#Consideraciones\"  rel=\"nofollow\" target=\"_blank\">Consideraciones<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2 external external_icon\" href=\"https:\/\/blog.tiraquelibras.com\/?p=1080\/#Configuracion_del_servicio\"  rel=\"nofollow\" target=\"_blank\">Configuraci\u00f3n del servicio<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-3 external external_icon\" href=\"https:\/\/blog.tiraquelibras.com\/?p=1080\/#Sin_SSL\"  rel=\"nofollow\" target=\"_blank\">Sin SSL<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-4 external external_icon\" href=\"https:\/\/blog.tiraquelibras.com\/?p=1080\/#Con_SSL\"  rel=\"nofollow\" target=\"_blank\">Con SSL<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5 external external_icon\" href=\"https:\/\/blog.tiraquelibras.com\/?p=1080\/#Comandos_de_la_API\"  rel=\"nofollow\" target=\"_blank\">Comandos de la API<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-6 external external_icon\" href=\"https:\/\/blog.tiraquelibras.com\/?p=1080\/#Credenciales_en_Base64\"  rel=\"nofollow\" target=\"_blank\">Credenciales en Base64<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-7 external external_icon\" href=\"https:\/\/blog.tiraquelibras.com\/?p=1080\/#Listado_de_comandos\"  rel=\"nofollow\" target=\"_blank\">Listado de comandos<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-8 external external_icon\" href=\"https:\/\/blog.tiraquelibras.com\/?p=1080\/#Ejemplo_desde_BASH\"  rel=\"nofollow\" target=\"_blank\">Ejemplo desde BASH<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-9 external external_icon\" href=\"https:\/\/blog.tiraquelibras.com\/?p=1080\/#Ejemplo_desde_Python\"  rel=\"nofollow\" target=\"_blank\">Ejemplo desde Python<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-10 external external_icon\" href=\"https:\/\/blog.tiraquelibras.com\/?p=1080\/#Conclusiones\"  rel=\"nofollow\" target=\"_blank\">Conclusiones<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-11 external external_icon\" href=\"https:\/\/blog.tiraquelibras.com\/?p=1080\/#Enlaces_de_interes\"  rel=\"nofollow\" target=\"_blank\">Enlaces de inter\u00e9s<\/a><\/li><\/ul><\/nav><\/div>\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Consideraciones\"><\/span>Consideraciones<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>La configuraci\u00f3n de esta funcionalidad <span class=\"has-inline-color has-vivid-red-color\"><strong>nunca debe ser accesible desde cualquier origen<\/strong>.<\/span> Debemos ser muy cuidadosos con su uso y los permisos de acceso, ya que de lo contrario pondremos en riesgo todo nuestro sistema de buzones, exponiendo su informaci\u00f3n, configuraci\u00f3n y contenido.<\/p>\n\n\n\n<p>Es recomendable activarla para su uso interno, bien para el desarrollo de alg\u00fan proceso, automatismo, panel de administraci\u00f3n Web, \u2026 De tener que publicarlo se deber\u00eda de filtrar por origen al que se precisa conceder acceso, pero <strong><span class=\"has-inline-color has-vivid-red-color\">nunca publicarlo sin restricci\u00f3n alguna<\/span><\/strong>.<\/p>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Configuracion_del_servicio\"><\/span>Configuraci\u00f3n del servicio<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Para realizar la configuraci\u00f3n solo debemos de agregar unas l\u00edneas a nuestro archivo de configuraci\u00f3n global para <em>Dovecot<\/em>, salvo que queramos activar el servicio SSL lo cual nos requiere tener previamente configurado este servicio en nuestra instalaci\u00f3n.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Sin_SSL\"><\/span>Sin SSL<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>Si vamos a utilizar las APIs para consultas internas desde el mismo sistema podemos prescindir del servicio SSL, ya que la informaci\u00f3n no saldr\u00e1 al exterior.<\/p>\n\n\n\n<p>Solo ser\u00e1 necesario configurar las siguientes l\u00edneas del <em>listener<\/em> en el archivo <strong>dovecot.conf<\/strong>, que en mi caso se encuentra en la ruta <em>\/etc\/dovecot<\/em>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">doveadm_password = nuestra_pwd\ndoveadm_api_key = nuestra_pwd\n\nservice doveadm {\n  inet_listener http {\n    port = 8080\n    #ssl = yes\n  }\n}<\/code><\/pre>\n\n\n\n<p>Reiniciamos el servicio y estar\u00eda listo:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">sudo service dovecot restart<\/code><\/pre>\n\n\n\n<p>El puerto configurado quedar\u00eda levantado:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">netstat -an | grep 8080\ntcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN     \ntcp6       0      0 :::8080                 :::*                    LISTEN     <\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Con_SSL\"><\/span>Con SSL<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>En mi caso prefiero configurar el servicio con SSL para cifrar cualquier tipo de informaci\u00f3n que circule por la red, lo que requiere tener el servicio configurado en nuestra instalaci\u00f3n global. En la entrada <a href=\"https:\/\/blog.tiraquelibras.com\/?p=639\" target=\"_blank\" rel=\"noreferrer noopener nofollow\" class=\"external external_icon\">Servidor de correo \u2013 Configuraci\u00f3n Dovecot, SIEVE, ManageSIEVE (parte 7)<\/a> se explica como hacerlo.<\/p>\n\n\n\n<p>Una vez lo tengamos configuardo, debemos de habilitar el servicio <em>SSL<\/em> en nuestro <em>listener<\/em> para la API de Dovecot:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">doveadm_password = nuestra_pwd\ndoveadm_api_key = nuestra_pwd\n\nservice doveadm {\n  inet_listener http {\n    port = 8080\n    ssl = yes\n  }\n}<\/code><\/pre>\n\n\n\n<p>Reiniciamos el servicio y estar\u00eda listo:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">sudo service dovecot restart<\/code><\/pre>\n\n\n\n<p>El puerto configurado quedar\u00eda levantado:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">netstat -an | grep 8080\ntcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN     \ntcp6       0      0 :::8080                 :::*                    LISTEN     <\/code><\/pre>\n\n\n\n<p>Hay que tener en cuenta que para cualquier consulta que lancemos tendremos que utilizar el protocolo <strong><em>HTTPS<\/em><\/strong> y el nombre de host configurado en el certificado, en mi caso <strong><em>correu2.yeloquehay.com<\/em><\/strong>, como veremos m\u00e1s adelante.<\/p>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Comandos_de_la_API\"><\/span>Comandos de la API<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Para poder enviar comandos de la API podemos usar tanto el <strong>Token<\/strong> como las credenciales <strong>user:pwd<\/strong>, pero en cualquiera de los casos debemos de obtener su valor en <strong>Base64<\/strong>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Credenciales_en_Base64\"><\/span>Credenciales en Base64<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>Para obtener el valor de las credenciales encriptado en <em>Base64<\/em> podemos hacer uso de un <a href=\"https:\/\/www.base64decode.org\/\" target=\"_blank\" rel=\"noreferrer noopener nofollow\" class=\"external external_icon\">servicio online<\/a>, o usar el siguiente c\u00f3digo en <strong><em>Python3<\/em><\/strong> y la librer\u00eda <strong><em>base64<\/em><\/strong>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">&gt;&gt;&gt; import base64\n&gt;&gt;&gt; \n&gt;&gt;&gt; token = 'nuestra_pwd'\n&gt;&gt;&gt; credentials = 'doveadm:nuestra_pwd'\n&gt;&gt;&gt;\n&gt;&gt;&gt;  # TOKEN\n&gt;&gt;&gt; message_bytes = token.encode('ascii')\n&gt;&gt;&gt; base64_bytes = base64.b64encode(message_bytes)\n&gt;&gt;&gt; base64_message = base64_bytes.decode('ascii')\n&gt;&gt;&gt; print(base64_message)\nbnVlc3RyYV9wd2Q=\n&gt;&gt;&gt; \n&gt;&gt;&gt; # USER:PWD \n&gt;&gt;&gt; message_bytes = credentials.encode('ascii')\n&gt;&gt;&gt; base64_bytes = base64.b64encode(message_bytes)\n&gt;&gt;&gt; base64_message = base64_bytes.decode('ascii')\n&gt;&gt;&gt; print(base64_message)\nZG92ZWFkbTpudWVzdHJhX3B3ZA==\n&gt;&gt;&gt; <\/code><\/pre>\n\n\n\n<p>El c\u00f3digo resultante es el que usaremos para lanzar los comandos v\u00eda <strong>CURL<\/strong>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Listado_de_comandos\"><\/span>Listado de comandos<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>Podemos obtener todos los comandos disponibles de la siguiente forma, usando HTTP o HTTPS dependiendo de la configuraci\u00f3n que hubieramos realizado en el paso anterior:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Con <strong><em>usuario:contrase\u00f1a<\/em><\/strong>:<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">curl -H \"Authorization: Basic ZG92ZWFkbTpudWVzdHJhX3B3ZA==\"  https:\/\/correu2.yeloquehay.com:8080\/doveadm\/v1\n  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current\n                                 Dload  Upload   Total   Spent    Left  Speed\n  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0[\n    {\"command\":\"serviceStop\", \"parameters\":[\n        {\"name\":\"service\",\"type\":\"array\"}\n    ]},\n    {\"command\":\"serviceStatus\", \"parameters\":[\n        {\"name\":\"service\",\"type\":\"array\"}\n    ]},\n    {\"command\":\"processStatus\", \"parameters\":[\n        {\"name\":\"service\",\"type\":\"array\"}\n    ]},\n    {\"command\":\"stop\", \"parameters\":[]},\n    {\"command\":\"reload\", \"parameters\":[]},\n    {\"command\":\"statsDump\", \"parameters\":[\n        {\"name\":\"socketPath\",\"type\":\"string\"},\n        {\"name\":\"type\",\"type\":\"string\"},\n        {\"name\":\"filter\",\"type\":\"string\"}\n    ]},\n...<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Con <strong><em>Token<\/em><\/strong>:<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">curl -H \"Authorization: X-Dovecot-API ZG92ZWFkbTpudWVzdHJhX3B3ZA==\"  https:\/\/correu2.yeloquehay.com:8080\/doveadm\/v1\n  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current\n                                 Dload  Upload   Total   Spent    Left  Speed\n  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0[\n    {\"command\":\"serviceStop\", \"parameters\":[\n        {\"name\":\"service\",\"type\":\"array\"}\n    ]},\n    {\"command\":\"serviceStatus\", \"parameters\":[\n        {\"name\":\"service\",\"type\":\"array\"}\n    ]},\n    {\"command\":\"processStatus\", \"parameters\":[\n        {\"name\":\"service\",\"type\":\"array\"}\n    ]},\n    {\"command\":\"stop\", \"parameters\":[]},\n    {\"command\":\"reload\", \"parameters\":[]},\n    {\"command\":\"statsDump\", \"parameters\":[\n        {\"name\":\"socketPath\",\"type\":\"string\"},\n        {\"name\":\"type\",\"type\":\"string\"},\n        {\"name\":\"filter\",\"type\":\"string\"}\n    ]},\n...<\/code><\/pre>\n\n\n\n<p>La lista es muy extensa, por lo que es recomendable dedicarle un tiempo para buscar el que m\u00e1s se ajuste a nuestras necesidades y probarlo.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Ejemplo_desde_BASH\"><\/span>Ejemplo desde BASH<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>Un ejemplo de comando ser\u00eda obtener la <em>quota<\/em> utilizada y disponible de un buz\u00f3n, el cual podemos obtener con el siguiente comando desde <em>BASH<\/em>. Los valores vienen dados en <strong>KB<\/strong>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">curl -H \"Authorization: X-Dovecot-API ZG92ZWFkbTpudWVzdHJhX3B3ZA==\" -H \"Content-Type: application\/json\" -d '[[\"quotaGet\", { \"user\": \"email@email.com\"}, \"c01\"]]' https:\/\/correu2.yeloquehay.com:8080\/doveadm\/v1\n\n[[\"doveadmResponse\",[{\"root\":\"User quota\",\"type\":\"STORAGE\",\"value\":\"497713\",\"limit\":\"10485760\",\"percent\":\"4\"},{\"root\":\"User quota\",\"type\":\"MESSAGE\",\"value\":\"11116\",\"limit\":\"-\",\"percent\":\"0\"}],\"c01\"]]<\/code><\/pre>\n\n\n\n<p>En la respuesta <strong><em>doveadmResponse<\/em><\/strong> podemos ver la capacidad utilizada, el l\u00edmite m\u00e1ximo y el porcentaje utilizado, tanto para el tama\u00f1o <strong><em>STORAGE<\/em><\/strong> como de n\u00famero de mensajes <strong><em>MESSAGE<\/em><\/strong>.<\/p>\n\n\n\n<p>Si recibi\u00e9ramos un error ser\u00eda similar al siguiente resultado:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">[[\"error\",{\"type\":\"exitCode\", \"exitCode\":67},\"c01\"]]<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Ejemplo_desde_Python\"><\/span>Ejemplo desde Python<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>Desde <em>Python<\/em> podemos ejecutar el comando anterior con la librer\u00eda <strong><em>requests<\/em><\/strong>, la cual no viene por defecto y hay que instalarla:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">python3 -m pip install requests<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">&gt;&gt;&gt; import requests\n&gt;&gt;&gt; url = 'https:\/\/correu2.yeloquehay.com:8080\/doveadm\/v1'\n&gt;&gt;&gt; headers = {'Authorization':'X-Dovecot-API ZG92ZWFkbTpudWVzdHJhX3B3ZA==', 'Content-Type':'application\/json'}\n&gt;&gt;&gt; payload = '[[\"quotaGet\", { \"user\": \"email@email.com\"}, \"c01\"]]'\n&gt;&gt;&gt; r = requests.post(url, data=payload, headers=headers)<\/code><\/pre>\n\n\n\n<p>El resultado lo podr\u00edamos ver de la siguiente forma:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">&gt;&gt;&gt; r.content\nb'[[\"doveadmResponse\",[{\"root\":\"User quota\",\"type\":\"STORAGE\",\"value\":\"491169\",\"limit\":\"10485760\",\"percent\":\"4\"},{\"root\":\"User quota\",\"type\":\"MESSAGE\",\"value\":\"10960\",\"limit\":\"-\",\"percent\":\"0\"}],\"c01\"]]'\n\n&gt;&gt;&gt; response = r.json()\n&gt;&gt;&gt; print(response[0])\n['doveadmResponse', [{'value': '491169', 'limit': '10485760', 'percent': '4', 'type': 'STORAGE', 'root': 'User quota'}, {'value': '10960', 'limit': '-', 'percent': '0', 'type': 'MESSAGE', 'root': 'User quota'}], 'c01']\n&gt;&gt;&gt; print(response[0][1])\n[{'value': '491169', 'limit': '10485760', 'percent': '4', 'type': 'STORAGE', 'root': 'User quota'}, {'value': '10960', 'limit': '-', 'percent': '0', 'type': 'MESSAGE', 'root': 'User quota'}]\n&gt;&gt;&gt; print(response[0][1][1])\n{'value': '10960', 'limit': '-', 'percent': '0', 'type': 'MESSAGE', 'root': 'User quota'}<\/code><\/pre>\n\n\n\n<p>Una forma m\u00e1s visual de mostrar los datos:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">&gt;&gt;&gt; storage = response[0][1][0]\n&gt;&gt;&gt; for key in storage.keys():\n...  print('%s - %s' % (str(key),str(storage[key])))\n...\nvalue - 491169\nlimit - 10485760\npercent - 4\ntype - STORAGE\nroot - User quota<\/code><\/pre>\n\n\n\n<p>Y con la librer\u00eda de <em>Python<\/em> <strong><em>humanfriendly<\/em><\/strong> podemos ver el resultado en formato m\u00e1s amigable, pero debemos de instalarla. Los valores vienen dados en <strong>KB<\/strong>, por lo que tendremos que multiplicar <strong><em>x1000<\/em><\/strong> el resultado obtenido para ver el dato correcto:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">python3 -m pip install humanfriendly<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">&gt;&gt;&gt; import humanfriendly\n&gt;&gt;&gt;\n&gt;&gt;&gt; used = humanfriendly.format_size(storage['value'] * 1000)\n&gt;&gt;&gt; max_limit = humanfriendly.format_size(storage['limit'] * 1000)\n&gt;&gt;&gt;\n&gt;&gt;&gt; print('value - %s\\nlimit - %s\\npercent - %s\\%\\ntype - %s\\nroot - %s' % (str(used), str(max_limit), str(storage['percent']), str(storage['type']), str(storage['root'])))\nvalue - 491.2 MB\nlimit - 10.05 GB\npercent - 4%\ntype - STORAGE\nroot - User quota<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Conclusiones\"><\/span>Conclusiones<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Con esta nueva funcionalidad de <strong>Dovecot<\/strong> podemos interactuar con los comandos <strong>Doveadm<\/strong> sin necesidad de usuario de sistema, ni de estar dentro de la consola de nuestro servidor, pero mucho cuidado con la seguridad ya que estamos exponiendo un acceso directo a la administraci\u00f3n de nuestros buzones y su contenido.<\/p>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Enlaces_de_interes\"><\/span>Enlaces de inter\u00e9s<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p><a href=\"https:\/\/doc.dovecot.org\/admin_manual\/doveadm_http_api\/#id1\" target=\"_blank\" rel=\"noreferrer noopener nofollow\" class=\"external external_icon\">Oficial Dovecot API<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/wiki.dovecot.org\/Design\/DoveadmProtocol\/HTTP\" target=\"_blank\" rel=\"noreferrer noopener nofollow\" class=\"external external_icon\">Oficial configuraci\u00f3n Dovecot API<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/blog.tiraquelibras.com\/?p=639\" target=\"_blank\" rel=\"noreferrer noopener nofollow\" class=\"external external_icon\">Servidor de correo \u2013 Configuraci\u00f3n Dovecot, SIEVE, ManageSIEVE (parte 7)<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Esta es una entrada dentro de la serie para la instalaci\u00f3n de un servidor de correo completo. \u00cdndice completo de contenidos pincha aqu\u00ed. Dovecot ofrece<span class=\"read-more-link\"><a class=\"read-more\" href=\"https:\/\/blog.tiraquelibras.com\/?p=1080\">Read More<\/a><\/span><\/p>\n","protected":false},"author":1,"featured_media":640,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[10,22],"tags":[120,63,69,51,119],"class_list":["post-1080","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-sistemas","category-ti","tag-api","tag-backend","tag-dovecot","tag-email","tag-pop-imap"],"post_mailing_queue_ids":[],"_links":{"self":[{"href":"https:\/\/blog.tiraquelibras.com\/index.php?rest_route=\/wp\/v2\/posts\/1080","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.tiraquelibras.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.tiraquelibras.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.tiraquelibras.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.tiraquelibras.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1080"}],"version-history":[{"count":0,"href":"https:\/\/blog.tiraquelibras.com\/index.php?rest_route=\/wp\/v2\/posts\/1080\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.tiraquelibras.com\/index.php?rest_route=\/wp\/v2\/media\/640"}],"wp:attachment":[{"href":"https:\/\/blog.tiraquelibras.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1080"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.tiraquelibras.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1080"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.tiraquelibras.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1080"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}