{"id":20760,"date":"2026-09-15T04:48:28","date_gmt":"2026-09-15T04:48:28","guid":{"rendered":"https:\/\/www.mailgun.com\/blog\/python-tutorial-how-imgpage-lets-you-upload-25-mb-2\/"},"modified":"2026-09-15T04:48:28","modified_gmt":"2026-09-15T04:48:28","slug":"python-tutorial-how-imgpage-lets-you-upload-25-mb","status":"publish","type":"blog","link":"https:\/\/www.mailgun.com\/pt\/blog\/email\/python-tutorial-how-imgpage-lets-you-upload-25-mb\/","title":{"rendered":"Tutorial de Python: como o ImgPage permite o upload de fotos de 25 MB para o S3 e arquivos na nuvem usando apenas um e-mail"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><i>Este post foi escrito por Paul Finn. Paul \u00e9 um desenvolvedor Python de Portsmouth, NH, dono de empresa (<\/i><a href=\"http:\/\/route3software.com\/\" target=\"_tabs\" rel=\"noopener noreferrer\"><i>http:\/\/route3software.com\/<\/i><\/a><i>) e entusiasta de cerveja (https:\/\/hoppypress.com\/beer-art). Acompanhe seu blog em\u00a0<\/i><a href=\"http:\/\/www.pfinn.net\/\" target=\"_tabs\" rel=\"noopener noreferrer\"><i>http:\/\/www.pfinn.net\/<\/i><\/a><i>, seus tweets em\u00a0<\/i><a href=\"https:\/\/twitter.com\/paul_finn_\" target=\"_tabs\" rel=\"noopener noreferrer\"><i>@paulfinn<\/i><\/a><i>\u00a0e seu c\u00f3digo em\u00a0<\/i><a href=\"https:\/\/github.com\/pfinn\" target=\"_tabs\" rel=\"noopener noreferrer\"><i>https:\/\/github.com\/pfinn<\/i><\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Meus projetos de desenvolvimento web favoritos sempre envolvem a cria\u00e7\u00e3o de uma ferramenta em torno de uma API rec\u00e9m-descoberta e j\u00e1 sou grande f\u00e3 do Mailgun h\u00e1 um tempo. A API deles n\u00e3o apenas lida com uma das coisas mais dif\u00edceis de se acertar, o processamento de e-mails, mas faz isso muito bem. \u00c9 um \u00f3timo exemplo de como uma API moderna e amig\u00e1vel para a equipe de desenvolvimento deve ser: \u00e9 RESTful, resolve um problema real, tem uma documenta\u00e7\u00e3o s\u00f3lida e \u00e9 r\u00e1pida para come\u00e7ar a usar.<\/p>\n\n\n\r\n    <nav data-content-type=\"longform\" class=\"toc-block longform-spacings px-5 py-6 px-md-6 px-lg-7 py-md-7 bg-light fs-sm rounded-lg\" aria-labelledby=\"toc-title-1799\"><p class=\"h5 m-0\" id=\"toc-title-1799\">\u00cdndice<\/p><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">01<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#criando-um-aplicativo-de-hospedagem-e-upload-de-imagem-facil-de-usar\">Criando um aplicativo de hospedagem e upload de imagem f\u00e1cil de usar<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">02<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#processando-e-mails-recebidos-usando-a-api-routes-do-mailgun\">Processando e-mails recebidos usando a API Routes do Mailgun<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">03<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#fazendo-upload-de-fotos-para-o-rackspace-cloud-files-amazon-s3\">Fazendo upload de fotos para o Rackspace Cloud Files  Amazon S3<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">04<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#conclusao\">Conclus\u00e3o<\/a><\/div><\/div><\/nav>\n\n\n<h2 class=\"wp-block-heading\">Criando um aplicativo de hospedagem e upload de imagem f\u00e1cil de usar<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Recorri ao Mailgun h\u00e1 algumas semanas quando decidi criar um host de imagens r\u00e1pido que pudesse receber imagens por e-mail e n\u00e3o dependesse de um processo tradicional de upload do lado do cliente. Muitos dos smartphones atuais n\u00e3o t\u00eam suporte nativo para uploads no navegador, ent\u00e3o pode ser um pouco complicado encontrar uma maneira de tirar as fotos do seu telefone e compartilh\u00e1-las apenas com um link (e ignorando qualquer rede social).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Criei o ImgPage (&#8220;Image Page&#8221;) para resolver esse problema: basta anexar uma foto (ou algumas) a um e-mail e enviar para inbox@imgpage.com. Aguarde alguns segundos e voc\u00ea receber\u00e1 uma resposta por e-mail do ImgPage com um link exclusivo para uma p\u00e1gina limpa e sem polui\u00e7\u00e3o visual apresentando apenas a(s) sua(s) imagem(ns), como abaixo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Abaixo, mostrarei um exemplo simplificado de c\u00f3digo sobre como o ImgPage usa o Mailgun para fazer o upload dessas imagens para a nuvem.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Processando e-mails recebidos usando a API Routes do Mailgun<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ap\u00f3s criar um reposit\u00f3rio git para o ImgPage, a pr\u00f3xima etapa foi criar o\u00a0inbox@imgpage.com\u00a0<a href=\"https:\/\/documentation.mailgun.com\/en\/latest\/user_manual.html\" target=\"_tabs\" rel=\"noopener noreferrer\">rota<\/a> dentro do Mailgun. Uma rota \u00e9 o que o Mailgun chama de l\u00f3gica que diz ao seu sistema o que fazer com cada e-mail de entrada que recebe. Para o ImgPage, configurei o Mailgun para processar cada e-mail recebido em inbox@imgpage.com e fazer um POST dos detalhes para o meu servidor.<\/p>\n\n\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#code_0\" type=\"button\" role=\"tab\" aria-controls=\"code_0\" aria-selected=\"true\">\r\n                                Python                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"code_0\" role=\"tabpanel\" aria-labelledby=\"code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#code_0_content\" data-clipboard-label=\"Copiar para a \u00e1rea de transfer\u00eancia\" data-clipboard-success-label=\"Copiado!\" data-clipboard-error-label=\"N\u00e3o foi poss\u00edvel copiar\" data-tooltip=\"Copiar para a \u00e1rea de transfer\u00eancia\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copiar para a \u00e1rea de transfer\u00eancia\">\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--default\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/file-stack.svg\"><\/svg>\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--success\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/badge-check.svg\"><\/svg>\r\n                                <\/button>\r\n                            <\/div>\r\n                            <pre class=\"w-100 h-100 m-0 line-numbers language-Python\">\r\n                                <code id=\"code_0_content\" class=\"language-Python\">\r\n\r\n                                        requests.post(&quot;https:\/\/api.mailgun.net\/v2\/routes&quot;, \r\n    auth=(&quot;api&quot;, os.environ.get(&quot;MAILGUN_KEY&quot;, &quot;your-api-key&quot;))), \r\n    data=MultiDict([(&quot;description&quot;, &quot;ImgPage Inbox Processing&quot;), \r\n                    (&quot;expression&quot;, &quot;match_recipient(&#039;inbox@imgpage.com&#039;)&quot;), \r\n                    (&quot;action&quot;, &quot;forward(&#039;http:\/\/imgpage.com\/mailgun-endpoint\/&#039;)&quot;), \r\n                    (&quot;action&quot;, &quot;stop()&quot;)\r\n                  ]))\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">Um truque legal sobre o Mailgun: voc\u00ea n\u00e3o est\u00e1 limitado apenas a corresponder aos destinat\u00e1rios de e-mail. Voc\u00ea pode corresponder aos cabe\u00e7alhos de e-mail, como a linha de assunto, e tamb\u00e9m usar express\u00f5es regulares. Voc\u00ea pode criar rotas de forma program\u00e1tica, conforme demonstrado acima, ou pode criar rotas usando o painel do Mailgun ap\u00f3s fazer login. Aqui est\u00e3o as\u00a0<a href=\"https:\/\/documentation.mailgun.com\/en\/latest\/user_manual.html\" target=\"_tabs\" rel=\"noopener noreferrer\">especifica\u00e7\u00f5es completas da API de processamento de e-mails de entrada<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Quando se trata dos anexos, o Mailgun faz o trabalho pesado por n\u00f3s e far\u00e1 o POST das informa\u00e7\u00f5es que precisamos sobre todo e qualquer anexo de at\u00e9 25 MB (na verdade, o tamanho m\u00e1ximo \u00e9 1 ou 2 KB menor que 25 MB, j\u00e1 que o espa\u00e7o precisa ser reservado para cabe\u00e7alhos de e-mail). Neste exemplo simplificado, estou analisando a solicita\u00e7\u00e3o para verificar se h\u00e1 pelo menos um anexo e se o anexo possui uma extens\u00e3o de arquivo de foto comum que estamos aguardando (caso contr\u00e1rio, retorna um erro HTTP 415).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">@app.route(\u2018\/mailgun-endpoint\u2019, methods=[\u2018POST\u2019]) def mailgun_endpoint(): if(len(request.files) &gt; 0): for attachment in request.files.values(): file_name, file_extension = os.path.splitext(attachment.filename) if file_extension.lower() not in [\u2018.jpg\u2019, \u2018.gif\u2019, \u2018.png\u2019, \u2018.bmp\u2019]: abort(415) #Tipo de m\u00eddia n\u00e3o suportado<\/p>\n\n\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#code_0\" type=\"button\" role=\"tab\" aria-controls=\"code_0\" aria-selected=\"true\">\r\n                                Python                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"code_0\" role=\"tabpanel\" aria-labelledby=\"code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#code_0_content\" data-clipboard-label=\"Copiar para a \u00e1rea de transfer\u00eancia\" data-clipboard-success-label=\"Copiado!\" data-clipboard-error-label=\"N\u00e3o foi poss\u00edvel copiar\" data-tooltip=\"Copiar para a \u00e1rea de transfer\u00eancia\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copiar para a \u00e1rea de transfer\u00eancia\">\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--default\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/file-stack.svg\"><\/svg>\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--success\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/badge-check.svg\"><\/svg>\r\n                                <\/button>\r\n                            <\/div>\r\n                            <pre class=\"w-100 h-100 m-0 line-numbers language-Python\">\r\n                                <code id=\"code_0_content\" class=\"language-Python\">\r\n\r\n                                        @app.route(&#039;\/mailgun-endpoint&#039;, methods=[&#039;POST&#039;])\r\n    def mailgun_endpoint(): \r\n      if(len(request.files) &gt; 0): \r\n         for attachment in request.files.values(): \r\n           file_name, file_extension = os.path.splitext(attachment.filename) \r\n           if file_extension.lower() not in [&#039;.jpg&#039;, &#039;.gif&#039;, &#039;.png&#039;, &#039;.bmp&#039;]: \r\n             abort(415) #Unsupported Media Type\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<h2 class=\"wp-block-heading\">Fazendo upload de fotos para o Rackspace Cloud Files &amp; Amazon S3<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Agora eu tinha algumas op\u00e7\u00f5es de armazenamento em nuvem confi\u00e1vel, sendo a mais popular o Amazon S3. Estou sempre disposto a experimentar um servi\u00e7o novo e aprender uma nova API, e decidi dar uma chance ao Rackspace Cloud Files tamb\u00e9m (a Rackspace adquiriu o Mailgun recentemente, ent\u00e3o, com o tempo, eles provavelmente criar\u00e3o algumas integra\u00e7\u00f5es nativas). Eu tinha muita experi\u00eancia usando o S3 e fiquei agradavelmente surpreso com a facilidade de come\u00e7ar a usar o Cloud Files. Os conceitos b\u00e1sicos, coisas como cont\u00eaineres e buckets, s\u00e3o bem semelhantes entre os dois servi\u00e7os.<\/p>\n\n\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#code_0\" type=\"button\" role=\"tab\" aria-controls=\"code_0\" aria-selected=\"true\">\r\n                                Python                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"code_0\" role=\"tabpanel\" aria-labelledby=\"code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#code_0_content\" data-clipboard-label=\"Copiar para a \u00e1rea de transfer\u00eancia\" data-clipboard-success-label=\"Copiado!\" data-clipboard-error-label=\"N\u00e3o foi poss\u00edvel copiar\" data-tooltip=\"Copiar para a \u00e1rea de transfer\u00eancia\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copiar para a \u00e1rea de transfer\u00eancia\">\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--default\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/file-stack.svg\"><\/svg>\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--success\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/badge-check.svg\"><\/svg>\r\n                                <\/button>\r\n                            <\/div>\r\n                            <pre class=\"w-100 h-100 m-0 line-numbers language-Python\">\r\n                                <code id=\"code_0_content\" class=\"language-Python\">\r\n\r\n                                    image_attachment.public_uri() \r\n    &#039;http:\/\/c1234.cdn.cloudfiles.rackspacecloud.com\/6a8f43...ab3cb7.jpg&#039;\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">No caso do ImgPage, \u00e9 importante que tudo dentro do cont\u00eainer de imagens seja acess\u00edvel publicamente com um URL exclusivo. Ap\u00f3s o upload, voc\u00ea pode solicitar o URI p\u00fablico a partir do Cloud Files.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Como voc\u00ea pode ver, o Cloud Files \u00e9 f\u00e1cil e simples de se trabalhar. Se voc\u00ea quiser continuar com o Amazon S3, veja como voc\u00ea poderia lidar com o upload dos anexos usando a biblioteca Python boto.<\/p>\n\n\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#code_0\" type=\"button\" role=\"tab\" aria-controls=\"code_0\" aria-selected=\"true\">\r\n                                Python                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"code_0\" role=\"tabpanel\" aria-labelledby=\"code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#code_0_content\" data-clipboard-label=\"Copiar para a \u00e1rea de transfer\u00eancia\" data-clipboard-success-label=\"Copiado!\" data-clipboard-error-label=\"N\u00e3o foi poss\u00edvel copiar\" data-tooltip=\"Copiar para a \u00e1rea de transfer\u00eancia\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copiar para a \u00e1rea de transfer\u00eancia\">\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--default\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/file-stack.svg\"><\/svg>\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--success\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/badge-check.svg\"><\/svg>\r\n                                <\/button>\r\n                            <\/div>\r\n                            <pre class=\"w-100 h-100 m-0 line-numbers language-Python\">\r\n                                <code id=\"code_0_content\" class=\"language-Python\">\r\n\r\n                                    from boto.s3.key import Key \r\nfrom boto.s3.connection import S3Connection \r\n\r\nconn = S3Connection(my-access-key, my-secret-key) \r\nbucket = conn.get_bucket(&#039;images&#039;) \r\nkey = Key(bucket) \r\nkey = (&#039;%s%s&#039;) % (str(uuid.uuid4()), file_extension) \r\nkey.set_contents_from_filename(attachment.filename)\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">(Quando voc\u00ea terminar de lidar com o POST, o Mailgun espera ver uma resposta HTTP 200 OK. Caso contr\u00e1rio, essa a\u00e7\u00e3o ser\u00e1 registrada como um erro nos seus logs do Mailgun.)<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclus\u00e3o<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">O roteamento de e-mails recebidos e o processamento de anexos s\u00e3o muito f\u00e1ceis com o Mailgun. Consegui combinar a correspond\u00eancia de destinat\u00e1rios e as a\u00e7\u00f5es de encaminhamento do Mailgun com o Cloud Files e o Amazon S3 para criar o ImgPage. Sem ter o Mailgun, eu provavelmente n\u00e3o teria abordado este projeto em primeiro lugar devido \u00e0s dificuldades de processar e-mails de entrada. O Mailgun tem a minha aprova\u00e7\u00e3o total por resolver um problema dif\u00edcil e criar uma API est\u00e1vel e bem documentada para acompanh\u00e1-lo.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Este post foi escrito por Paul Finn. Paul \u00e9 um desenvolvedor Python de Portsmouth, NH, dono de empresa (http:\/\/route3software.com\/) e entusiasta de cerveja (https:\/\/hoppypress.com\/beer-art). Acompanhe seu blog em http:\/\/www.pfinn.net\/, seus tweets em @paulfinn e seu c\u00f3digo em https:\/\/github.com\/pfinn<\/p>\n","protected":false},"author":13,"featured_media":4074,"menu_order":0,"template":"","meta":{"_acf_changed":true,"footnotes":""},"blog_category":[20],"class_list":["post-20760","blog","type-blog","status-publish","has-post-thumbnail","hentry","blog_category-email"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Tutorial de Python: como o ImgPage permite o upload de fotos de 25 MB para o S3 e o Cloud Files com apenas um e-mail - Transactional Email API Service For Developers | Mailgun<\/title>\n<meta name=\"description\" content=\"Meus projetos de desenvolvimento web favoritos sempre envolvem a cria\u00e7\u00e3o de uma ferramenta em torno de uma API rec\u00e9m-descoberta e j\u00e1 sou grande f\u00e3 do Mailgun h\u00e1 um tempo.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.mailgun.com\/pt\/blog\/email\/python-tutorial-how-imgpage-lets-you-upload-25-mb\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Tutorial de Python: como o ImgPage permite o upload de fotos de 25 MB para o S3 e o Cloud Files com apenas um e-mail - Transactional Email API Service For Developers | Mailgun\" \/>\n<meta property=\"og:description\" content=\"Meus projetos de desenvolvimento web favoritos sempre envolvem a cria\u00e7\u00e3o de uma ferramenta em torno de uma API rec\u00e9m-descoberta e j\u00e1 sou grande f\u00e3 do Mailgun h\u00e1 um tempo.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.mailgun.com\/pt\/blog\/email\/python-tutorial-how-imgpage-lets-you-upload-25-mb\/\" \/>\n<meta property=\"og:site_name\" content=\"Transactional Email API Service For Developers | Mailgun\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Email.png\" \/>\n\t<meta property=\"og:image:width\" content=\"720\" \/>\n\t<meta property=\"og:image:height\" content=\"448\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"4 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/blog\\\/email\\\/python-tutorial-how-imgpage-lets-you-upload-25-mb\\\/\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/blog\\\/email\\\/python-tutorial-how-imgpage-lets-you-upload-25-mb\\\/\",\"name\":\"Tutorial de Python: como o ImgPage permite o upload de fotos de 25 MB para o S3 e o Cloud Files com apenas um e-mail - Transactional Email API Service For Developers | Mailgun\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/blog\\\/email\\\/python-tutorial-how-imgpage-lets-you-upload-25-mb\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/blog\\\/email\\\/python-tutorial-how-imgpage-lets-you-upload-25-mb\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/MG-Blog-Email.png\",\"datePublished\":\"2026-09-15T04:48:28+00:00\",\"description\":\"Meus projetos de desenvolvimento web favoritos sempre envolvem a cria\u00e7\u00e3o de uma ferramenta em torno de uma API rec\u00e9m-descoberta e j\u00e1 sou grande f\u00e3 do Mailgun h\u00e1 um tempo.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/blog\\\/email\\\/python-tutorial-how-imgpage-lets-you-upload-25-mb\\\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/blog\\\/email\\\/python-tutorial-how-imgpage-lets-you-upload-25-mb\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/blog\\\/email\\\/python-tutorial-how-imgpage-lets-you-upload-25-mb\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/MG-Blog-Email.png\",\"contentUrl\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/MG-Blog-Email.png\",\"width\":720,\"height\":448},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/blog\\\/email\\\/python-tutorial-how-imgpage-lets-you-upload-25-mb\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/inicio\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Blog\",\"item\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Tutorial de Python: como o ImgPage permite o upload de fotos de 25 MB para o S3 e arquivos na nuvem usando apenas um e-mail\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/#website\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/\",\"name\":\"Transactional Email API Service For Developers | Mailgun\",\"description\":\"Poderosas APIs de e-mail transacional que permitem a voc\u00ea enviar, receber e rastrear e-mails, criadas com os desenvolvedores em mente. Saiba mais hoje mesmo!\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/#organization\",\"name\":\"Transactional Email API Service For Developers | Mailgun\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/06\\\/cropped-android-chrome-512x512-1.png\",\"contentUrl\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/06\\\/cropped-android-chrome-512x512-1.png\",\"width\":512,\"height\":512,\"caption\":\"Transactional Email API Service For Developers | Mailgun\"},\"image\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Tutorial de Python: como o ImgPage permite o upload de fotos de 25 MB para o S3 e o Cloud Files com apenas um e-mail - Transactional Email API Service For Developers | Mailgun","description":"Meus projetos de desenvolvimento web favoritos sempre envolvem a cria\u00e7\u00e3o de uma ferramenta em torno de uma API rec\u00e9m-descoberta e j\u00e1 sou grande f\u00e3 do Mailgun h\u00e1 um tempo.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.mailgun.com\/pt\/blog\/email\/python-tutorial-how-imgpage-lets-you-upload-25-mb\/","og_locale":"pt_BR","og_type":"article","og_title":"Tutorial de Python: como o ImgPage permite o upload de fotos de 25 MB para o S3 e o Cloud Files com apenas um e-mail - Transactional Email API Service For Developers | Mailgun","og_description":"Meus projetos de desenvolvimento web favoritos sempre envolvem a cria\u00e7\u00e3o de uma ferramenta em torno de uma API rec\u00e9m-descoberta e j\u00e1 sou grande f\u00e3 do Mailgun h\u00e1 um tempo.","og_url":"https:\/\/www.mailgun.com\/pt\/blog\/email\/python-tutorial-how-imgpage-lets-you-upload-25-mb\/","og_site_name":"Transactional Email API Service For Developers | Mailgun","og_image":[{"width":720,"height":448,"url":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Email.png","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"4 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.mailgun.com\/pt\/blog\/email\/python-tutorial-how-imgpage-lets-you-upload-25-mb\/","url":"https:\/\/www.mailgun.com\/pt\/blog\/email\/python-tutorial-how-imgpage-lets-you-upload-25-mb\/","name":"Tutorial de Python: como o ImgPage permite o upload de fotos de 25 MB para o S3 e o Cloud Files com apenas um e-mail - Transactional Email API Service For Developers | Mailgun","isPartOf":{"@id":"https:\/\/www.mailgun.com\/pt\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.mailgun.com\/pt\/blog\/email\/python-tutorial-how-imgpage-lets-you-upload-25-mb\/#primaryimage"},"image":{"@id":"https:\/\/www.mailgun.com\/pt\/blog\/email\/python-tutorial-how-imgpage-lets-you-upload-25-mb\/#primaryimage"},"thumbnailUrl":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Email.png","datePublished":"2026-09-15T04:48:28+00:00","description":"Meus projetos de desenvolvimento web favoritos sempre envolvem a cria\u00e7\u00e3o de uma ferramenta em torno de uma API rec\u00e9m-descoberta e j\u00e1 sou grande f\u00e3 do Mailgun h\u00e1 um tempo.","breadcrumb":{"@id":"https:\/\/www.mailgun.com\/pt\/blog\/email\/python-tutorial-how-imgpage-lets-you-upload-25-mb\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.mailgun.com\/pt\/blog\/email\/python-tutorial-how-imgpage-lets-you-upload-25-mb\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.mailgun.com\/pt\/blog\/email\/python-tutorial-how-imgpage-lets-you-upload-25-mb\/#primaryimage","url":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Email.png","contentUrl":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Email.png","width":720,"height":448},{"@type":"BreadcrumbList","@id":"https:\/\/www.mailgun.com\/pt\/blog\/email\/python-tutorial-how-imgpage-lets-you-upload-25-mb\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.mailgun.com\/pt\/inicio\/"},{"@type":"ListItem","position":2,"name":"Blog","item":"https:\/\/www.mailgun.com\/pt\/blog\/"},{"@type":"ListItem","position":3,"name":"Tutorial de Python: como o ImgPage permite o upload de fotos de 25 MB para o S3 e arquivos na nuvem usando apenas um e-mail"}]},{"@type":"WebSite","@id":"https:\/\/www.mailgun.com\/pt\/#website","url":"https:\/\/www.mailgun.com\/pt\/","name":"Transactional Email API Service For Developers | Mailgun","description":"Poderosas APIs de e-mail transacional que permitem a voc\u00ea enviar, receber e rastrear e-mails, criadas com os desenvolvedores em mente. Saiba mais hoje mesmo!","publisher":{"@id":"https:\/\/www.mailgun.com\/pt\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.mailgun.com\/pt\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-BR"},{"@type":"Organization","@id":"https:\/\/www.mailgun.com\/pt\/#organization","name":"Transactional Email API Service For Developers | Mailgun","url":"https:\/\/www.mailgun.com\/pt\/","logo":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.mailgun.com\/pt\/#\/schema\/logo\/image\/","url":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/06\/cropped-android-chrome-512x512-1.png","contentUrl":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/06\/cropped-android-chrome-512x512-1.png","width":512,"height":512,"caption":"Transactional Email API Service For Developers | Mailgun"},"image":{"@id":"https:\/\/www.mailgun.com\/pt\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/www.mailgun.com\/pt\/wp-json\/wp\/v2\/blog\/20760","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mailgun.com\/pt\/wp-json\/wp\/v2\/blog"}],"about":[{"href":"https:\/\/www.mailgun.com\/pt\/wp-json\/wp\/v2\/types\/blog"}],"author":[{"embeddable":true,"href":"https:\/\/www.mailgun.com\/pt\/wp-json\/wp\/v2\/users\/13"}],"version-history":[{"count":0,"href":"https:\/\/www.mailgun.com\/pt\/wp-json\/wp\/v2\/blog\/20760\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mailgun.com\/pt\/wp-json\/wp\/v2\/media\/4074"}],"wp:attachment":[{"href":"https:\/\/www.mailgun.com\/pt\/wp-json\/wp\/v2\/media?parent=20760"}],"wp:term":[{"taxonomy":"blog_category","embeddable":true,"href":"https:\/\/www.mailgun.com\/pt\/wp-json\/wp\/v2\/blog_category?post=20760"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}