{"id":20677,"date":"2026-09-15T03:53:07","date_gmt":"2026-09-15T03:53:07","guid":{"rendered":"https:\/\/www.mailgun.com\/blog\/tutoriel-python-comment-imgpage-permet-importer-25-mo\/"},"modified":"2026-09-15T03:53:07","modified_gmt":"2026-09-15T03:53:07","slug":"tutoriel-python-comment-imgpage-permet-importer-25-mo","status":"publish","type":"blog","link":"https:\/\/www.mailgun.com\/fr\/blog\/email\/tutoriel-python-comment-imgpage-permet-importer-25-mo\/","title":{"rendered":"Tutoriel Python\u00a0: comment ImgPage vous permet d&rsquo;importer des photos de 25\u00a0Mo sur S3 et Cloud Files avec un simple email"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><i>Cet article a \u00e9t\u00e9 \u00e9crit par Paul Finn. Paul est un d\u00e9veloppeur Python bas\u00e9 \u00e0 Portsmouth (New Hampshire), chef d&rsquo;entreprise (<\/i><a href=\"http:\/\/route3software.com\/\" target=\"_tabs\" rel=\"noopener noreferrer\"><i>http:\/\/route3software.com\/<\/i><\/a><i>) et amateur de bi\u00e8re (https:\/\/hoppypress.com\/beer-art). Suivez son blog sur\u00a0<\/i><a href=\"http:\/\/www.pfinn.net\/\" target=\"_tabs\" rel=\"noopener noreferrer\"><i>http:\/\/www.pfinn.net\/<\/i><\/a><i>, ses tweets sur\u00a0<\/i><a href=\"https:\/\/twitter.com\/paul_finn_\" target=\"_tabs\" rel=\"noopener noreferrer\"><i>@paulfinn<\/i><\/a><i>\u00a0et son code sur\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\">Mes projets de d\u00e9veloppement web pr\u00e9f\u00e9r\u00e9s impliquent toujours de cr\u00e9er un outil autour d&rsquo;une API r\u00e9cemment d\u00e9couverte, et je suis un grand fan de Mailgun depuis un certain temps d\u00e9j\u00e0. Non seulement leur API s&rsquo;attaque \u00e0 l&rsquo;une des choses les plus difficiles \u00e0 ma\u00eetriser, l&rsquo;analyse d&#8217;emails, mais elle le fait tr\u00e8s bien. C&rsquo;est un excellent exemple de ce que devrait \u00eatre une API moderne et adapt\u00e9e aux \u00e9quipes de d\u00e9veloppement\u00a0: elle est RESTful, r\u00e9sout un probl\u00e8me r\u00e9el, dispose d&rsquo;une documentation solide et permet de d\u00e9marrer rapidement.<\/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-4751\"><p class=\"h5 m-0\" id=\"toc-title-4751\">Table des mati\u00e8res<\/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=\"#creer-une-application-dhebergement-et-dimportation-dimages-facile-a-utiliser\">Cr\u00e9er une application d&rsquo;h\u00e9bergement et d&rsquo;importation d&rsquo;images facile \u00e0 utiliser<\/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=\"#analyser-les-emails-entrants-a-laide-de-lapi-mailgun-routes\">Analyser les emails entrants \u00e0 l&rsquo;aide de l&rsquo;API Mailgun Routes<\/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=\"#importer-des-photos-vers-rackspace-cloud-files-et-amazon-s3\">Importer des photos vers Rackspace Cloud Files et 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=\"#conclusion\">Conclusion<\/a><\/div><\/div><\/nav>\n\n\n<h2 class=\"wp-block-heading\">Cr\u00e9er une application d&rsquo;h\u00e9bergement et d&rsquo;importation d&rsquo;images facile \u00e0 utiliser<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Je me suis tourn\u00e9 vers Mailgun il y a quelques semaines lorsque j&rsquo;ai d\u00e9cid\u00e9 de cr\u00e9er un h\u00e9bergeur d&rsquo;images rapide, capable de recevoir des images par email et de ne pas d\u00e9pendre d&rsquo;un processus d&rsquo;importation traditionnel c\u00f4t\u00e9 client. De nombreux smartphones actuels n&rsquo;ont pas de support natif pour les importations dans le navigateur. Il peut donc \u00eatre un peu difficile de trouver un moyen d&rsquo;extraire des photos de votre t\u00e9l\u00e9phone et de les partager avec un simple lien (en contournant les r\u00e9seaux sociaux).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">J&rsquo;ai cr\u00e9\u00e9 ImgPage (\u00ab\u00a0Image Page\u00a0\u00bb) pour r\u00e9soudre ce probl\u00e8me\u00a0: il suffit de joindre une ou plusieurs photos \u00e0 un email et de l&rsquo;envoyer \u00e0 l&rsquo;adresse inbox@imgpage.com. Patientez quelques secondes et vous recevrez une r\u00e9ponse par email d&rsquo;ImgPage avec un lien unique vers une page \u00e9pur\u00e9e et sans superflu, pr\u00e9sentant uniquement votre ou vos images comme ci-dessous.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ci-dessous, je vais vous montrer un exemple de code simplifi\u00e9 sur la fa\u00e7on dont ImgPage utilise Mailgun pour importer ces images dans le cloud.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Analyser les emails entrants \u00e0 l&rsquo;aide de l&rsquo;API Mailgun Routes<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Apr\u00e8s avoir cr\u00e9\u00e9 un d\u00e9p\u00f4t git pour ImgPage, l&rsquo;\u00e9tape suivante a consist\u00e9 \u00e0 cr\u00e9er la bo\u00eete de r\u00e9ception\u00a0inbox@imgpage.com\u00a0<a href=\"https:\/\/documentation.mailgun.com\/en\/latest\/user_manual.html\" target=\"_tabs\" rel=\"noopener noreferrer\">route<\/a> dans Mailgun. Une route est le terme utilis\u00e9 par Mailgun pour d\u00e9signer la logique indiquant \u00e0 son syst\u00e8me quoi faire de chaque email entrant re\u00e7u. Pour ImgPage, j&rsquo;ai configur\u00e9 Mailgun afin d&rsquo;analyser chaque email entrant re\u00e7u sur inbox@imgpage.com et d&rsquo;envoyer les d\u00e9tails en POST vers mon serveur.<\/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=\"Copier dans le presse-papiers\" data-clipboard-success-label=\"Copi\u00e9\u00a0!\" data-clipboard-error-label=\"Impossible de copier\" data-tooltip=\"Copier dans le presse-papiers\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copier dans le presse-papiers\">\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\">Une fonctionnalit\u00e9 int\u00e9ressante de Mailgun\u00a0: vous n&rsquo;\u00eates pas limit\u00e9 \u00e0 une simple correspondance avec les destinataires de l&#8217;email. Vous pouvez faire correspondre des en-t\u00eates d&#8217;email comme l&rsquo;objet d&#8217;email et utiliser \u00e9galement des expressions r\u00e9guli\u00e8res. Vous pouvez cr\u00e9er des routes par programmation, comme illustr\u00e9 ci-dessus, ou bien depuis le tableau de bord Mailgun apr\u00e8s vous \u00eatre connect\u00e9. Voici l&rsquo;int\u00e9gralit\u00e9 des\u00a0<a href=\"https:\/\/documentation.mailgun.com\/en\/latest\/user_manual.html\" target=\"_tabs\" rel=\"noopener noreferrer\">sp\u00e9cifications de l&rsquo;API d&rsquo;analyse d&#8217;emails entrants<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En ce qui concerne les pi\u00e8ces jointes, Mailgun fait le plus gros du travail pour nous et envoie via POST les informations dont nous avons besoin sur l&rsquo;ensemble des pi\u00e8ces jointes jusqu&rsquo;\u00e0 25\u00a0Mo (en r\u00e9alit\u00e9, la taille max. est de 1 ou 2\u00a0Ko de moins que 25\u00a0Mo, car de l&rsquo;espace doit \u00eatre r\u00e9serv\u00e9 pour les en-t\u00eates d&#8217;email). Dans cet exemple simplifi\u00e9, je v\u00e9rifie la requ\u00eate pour m&rsquo;assurer qu&rsquo;il y a au moins une pi\u00e8ce jointe et qu&rsquo;elle poss\u00e8de une extension de fichier photo courante que nous attendons (sinon, cela renvoie une erreur HTTP\u00a0415).<\/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) #Type de m\u00e9dia non pris en charge<\/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=\"Copier dans le presse-papiers\" data-clipboard-success-label=\"Copi\u00e9\u00a0!\" data-clipboard-error-label=\"Impossible de copier\" data-tooltip=\"Copier dans le presse-papiers\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copier dans le presse-papiers\">\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\">Importer des photos vers Rackspace Cloud Files et Amazon S3<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">J&rsquo;avais alors quelques options pour un stockage cloud fiable, la plus populaire \u00e9tant Amazon S3. Je suis toujours pr\u00eat \u00e0 essayer un nouveau service et \u00e0 apprendre une nouvelle API. J&rsquo;ai donc d\u00e9cid\u00e9 de donner aussi sa chance \u00e0 Rackspace Cloud Files (Rackspace a r\u00e9cemment acquis Mailgun, ils vont donc probablement d\u00e9velopper des int\u00e9grations natives au fil du temps). J&rsquo;avais beaucoup d&rsquo;exp\u00e9rience avec S3 et j&rsquo;ai \u00e9t\u00e9 agr\u00e9ablement surpris de voir \u00e0 quel point il \u00e9tait facile de d\u00e9marrer avec Cloud Files. Les concepts de base, comme les conteneurs et les buckets, sont assez similaires entre les deux services.<\/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=\"Copier dans le presse-papiers\" data-clipboard-success-label=\"Copi\u00e9\u00a0!\" data-clipboard-error-label=\"Impossible de copier\" data-tooltip=\"Copier dans le presse-papiers\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copier dans le presse-papiers\">\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\">Dans le cas d&rsquo;ImgPage, il est important que tout ce qui se trouve dans le conteneur d&rsquo;images soit accessible publiquement avec une URL unique. Apr\u00e8s l&rsquo;importation, vous pouvez demander l&rsquo;URI publique \u00e0 Cloud Files.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Comme vous pouvez le constater, il est simple et facile de travailler avec Cloud Files. Si vous pr\u00e9f\u00e9rez en rester \u00e0 Amazon S3, voici comment vous pouvez g\u00e9rer l&rsquo;importation des pi\u00e8ces jointes \u00e0 l&rsquo;aide de la biblioth\u00e8que 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=\"Copier dans le presse-papiers\" data-clipboard-success-label=\"Copi\u00e9\u00a0!\" data-clipboard-error-label=\"Impossible de copier\" data-tooltip=\"Copier dans le presse-papiers\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copier dans le presse-papiers\">\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\">(Lorsque vous avez termin\u00e9 de traiter le POST, Mailgun s&rsquo;attend \u00e0 recevoir une r\u00e9ponse HTTP\u00a0200 OK. Dans le cas contraire, cette action sera enregistr\u00e9e comme une erreur dans vos journaux Mailgun.)<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Le routage des emails entrants et l&rsquo;analyse des pi\u00e8ces jointes sont un jeu d&rsquo;enfant avec Mailgun. J&rsquo;ai pu associer les actions de correspondance de destinataire et de transfert de Mailgun avec Cloud Files et Amazon S3 pour cr\u00e9er ImgPage. Sans Mailgun, je ne me serais probablement pas attaqu\u00e9 \u00e0 ce projet pour commencer, en raison des difficult\u00e9s li\u00e9es \u00e0 l&rsquo;analyse d&#8217;emails entrants. Je tire mon chapeau \u00e0 Mailgun pour avoir r\u00e9solu un probl\u00e8me difficile et cr\u00e9\u00e9 une API stable et bien document\u00e9e pour l&rsquo;accompagner.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Cet article a \u00e9t\u00e9 \u00e9crit par Paul Finn. Paul est un d\u00e9veloppeur Python bas\u00e9 \u00e0 Portsmouth (New Hampshire), chef d&rsquo;entreprise (http:\/\/route3software.com\/) et amateur de bi\u00e8re (https:\/\/hoppypress.com\/beer-art). Suivez son blog sur http:\/\/www.pfinn.net\/, ses tweets sur @paulfinn et son code sur 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-20677","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>Tutoriel Python\u00a0: comment ImgPage vous permet d&#039;importer des photos de 25\u00a0Mo sur S3 et Cloud Files avec un simple email - Transactional Email API Service For Developers | Mailgun<\/title>\n<meta name=\"description\" content=\"Mes projets de d\u00e9veloppement web pr\u00e9f\u00e9r\u00e9s impliquent toujours de cr\u00e9er un outil autour d&#039;une API r\u00e9cemment d\u00e9couverte, et je suis un grand fan de Mailgun depuis un certain temps d\u00e9j\u00e0.\" \/>\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\/fr\/blog\/email\/tutoriel-python-comment-imgpage-permet-importer-25-mo\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Tutoriel Python\u00a0: comment ImgPage vous permet d&#039;importer des photos de 25\u00a0Mo sur S3 et Cloud Files avec un simple email - Transactional Email API Service For Developers | Mailgun\" \/>\n<meta property=\"og:description\" content=\"Mes projets de d\u00e9veloppement web pr\u00e9f\u00e9r\u00e9s impliquent toujours de cr\u00e9er un outil autour d&#039;une API r\u00e9cemment d\u00e9couverte, et je suis un grand fan de Mailgun depuis un certain temps d\u00e9j\u00e0.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.mailgun.com\/fr\/blog\/email\/tutoriel-python-comment-imgpage-permet-importer-25-mo\/\" \/>\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 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/blog\\\/email\\\/tutoriel-python-comment-imgpage-permet-importer-25-mo\\\/\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/blog\\\/email\\\/tutoriel-python-comment-imgpage-permet-importer-25-mo\\\/\",\"name\":\"Tutoriel Python\u00a0: comment ImgPage vous permet d'importer des photos de 25\u00a0Mo sur S3 et Cloud Files avec un simple email - Transactional Email API Service For Developers | Mailgun\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/blog\\\/email\\\/tutoriel-python-comment-imgpage-permet-importer-25-mo\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/blog\\\/email\\\/tutoriel-python-comment-imgpage-permet-importer-25-mo\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/MG-Blog-Email.png\",\"datePublished\":\"2026-09-15T03:53:07+00:00\",\"description\":\"Mes projets de d\u00e9veloppement web pr\u00e9f\u00e9r\u00e9s impliquent toujours de cr\u00e9er un outil autour d'une API r\u00e9cemment d\u00e9couverte, et je suis un grand fan de Mailgun depuis un certain temps d\u00e9j\u00e0.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/blog\\\/email\\\/tutoriel-python-comment-imgpage-permet-importer-25-mo\\\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/blog\\\/email\\\/tutoriel-python-comment-imgpage-permet-importer-25-mo\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/blog\\\/email\\\/tutoriel-python-comment-imgpage-permet-importer-25-mo\\\/#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\\\/fr\\\/blog\\\/email\\\/tutoriel-python-comment-imgpage-permet-importer-25-mo\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Blog\",\"item\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Tutoriel Python\u00a0: comment ImgPage vous permet d\u2019importer des photos de 25\u00a0Mo sur S3 et Cloud Files avec un simple email\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/#website\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/\",\"name\":\"Transactional Email API Service For Developers | Mailgun\",\"description\":\"Des API d\u2019emails transactionnels puissantes qui vous permettent d'envoyer, de recevoir et de suivre des emails, con\u00e7ues pour les d\u00e9veloppeurs. En savoir plus d\u00e8s aujourd'hui !\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/#organization\",\"name\":\"Transactional Email API Service For Developers | Mailgun\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/#\\\/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\\\/fr\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Tutoriel Python\u00a0: comment ImgPage vous permet d'importer des photos de 25\u00a0Mo sur S3 et Cloud Files avec un simple email - Transactional Email API Service For Developers | Mailgun","description":"Mes projets de d\u00e9veloppement web pr\u00e9f\u00e9r\u00e9s impliquent toujours de cr\u00e9er un outil autour d'une API r\u00e9cemment d\u00e9couverte, et je suis un grand fan de Mailgun depuis un certain temps d\u00e9j\u00e0.","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\/fr\/blog\/email\/tutoriel-python-comment-imgpage-permet-importer-25-mo\/","og_locale":"fr_FR","og_type":"article","og_title":"Tutoriel Python\u00a0: comment ImgPage vous permet d'importer des photos de 25\u00a0Mo sur S3 et Cloud Files avec un simple email - Transactional Email API Service For Developers | Mailgun","og_description":"Mes projets de d\u00e9veloppement web pr\u00e9f\u00e9r\u00e9s impliquent toujours de cr\u00e9er un outil autour d'une API r\u00e9cemment d\u00e9couverte, et je suis un grand fan de Mailgun depuis un certain temps d\u00e9j\u00e0.","og_url":"https:\/\/www.mailgun.com\/fr\/blog\/email\/tutoriel-python-comment-imgpage-permet-importer-25-mo\/","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 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.mailgun.com\/fr\/blog\/email\/tutoriel-python-comment-imgpage-permet-importer-25-mo\/","url":"https:\/\/www.mailgun.com\/fr\/blog\/email\/tutoriel-python-comment-imgpage-permet-importer-25-mo\/","name":"Tutoriel Python\u00a0: comment ImgPage vous permet d'importer des photos de 25\u00a0Mo sur S3 et Cloud Files avec un simple email - Transactional Email API Service For Developers | Mailgun","isPartOf":{"@id":"https:\/\/www.mailgun.com\/fr\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.mailgun.com\/fr\/blog\/email\/tutoriel-python-comment-imgpage-permet-importer-25-mo\/#primaryimage"},"image":{"@id":"https:\/\/www.mailgun.com\/fr\/blog\/email\/tutoriel-python-comment-imgpage-permet-importer-25-mo\/#primaryimage"},"thumbnailUrl":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Email.png","datePublished":"2026-09-15T03:53:07+00:00","description":"Mes projets de d\u00e9veloppement web pr\u00e9f\u00e9r\u00e9s impliquent toujours de cr\u00e9er un outil autour d'une API r\u00e9cemment d\u00e9couverte, et je suis un grand fan de Mailgun depuis un certain temps d\u00e9j\u00e0.","breadcrumb":{"@id":"https:\/\/www.mailgun.com\/fr\/blog\/email\/tutoriel-python-comment-imgpage-permet-importer-25-mo\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.mailgun.com\/fr\/blog\/email\/tutoriel-python-comment-imgpage-permet-importer-25-mo\/"]}]},{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/www.mailgun.com\/fr\/blog\/email\/tutoriel-python-comment-imgpage-permet-importer-25-mo\/#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\/fr\/blog\/email\/tutoriel-python-comment-imgpage-permet-importer-25-mo\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.mailgun.com\/fr\/"},{"@type":"ListItem","position":2,"name":"Blog","item":"https:\/\/www.mailgun.com\/fr\/blog\/"},{"@type":"ListItem","position":3,"name":"Tutoriel Python\u00a0: comment ImgPage vous permet d\u2019importer des photos de 25\u00a0Mo sur S3 et Cloud Files avec un simple email"}]},{"@type":"WebSite","@id":"https:\/\/www.mailgun.com\/fr\/#website","url":"https:\/\/www.mailgun.com\/fr\/","name":"Transactional Email API Service For Developers | Mailgun","description":"Des API d\u2019emails transactionnels puissantes qui vous permettent d'envoyer, de recevoir et de suivre des emails, con\u00e7ues pour les d\u00e9veloppeurs. En savoir plus d\u00e8s aujourd'hui !","publisher":{"@id":"https:\/\/www.mailgun.com\/fr\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.mailgun.com\/fr\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"},{"@type":"Organization","@id":"https:\/\/www.mailgun.com\/fr\/#organization","name":"Transactional Email API Service For Developers | Mailgun","url":"https:\/\/www.mailgun.com\/fr\/","logo":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/www.mailgun.com\/fr\/#\/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\/fr\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/www.mailgun.com\/fr\/wp-json\/wp\/v2\/blog\/20677","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mailgun.com\/fr\/wp-json\/wp\/v2\/blog"}],"about":[{"href":"https:\/\/www.mailgun.com\/fr\/wp-json\/wp\/v2\/types\/blog"}],"author":[{"embeddable":true,"href":"https:\/\/www.mailgun.com\/fr\/wp-json\/wp\/v2\/users\/13"}],"version-history":[{"count":0,"href":"https:\/\/www.mailgun.com\/fr\/wp-json\/wp\/v2\/blog\/20677\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mailgun.com\/fr\/wp-json\/wp\/v2\/media\/4074"}],"wp:attachment":[{"href":"https:\/\/www.mailgun.com\/fr\/wp-json\/wp\/v2\/media?parent=20677"}],"wp:term":[{"taxonomy":"blog_category","embeddable":true,"href":"https:\/\/www.mailgun.com\/fr\/wp-json\/wp\/v2\/blog_category?post=20677"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}