Maison  >  Article  >  développement back-end  >  Exemple de la façon dont Python3 utilise le protocole SMTP pour envoyer des e-mails

Exemple de la façon dont Python3 utilise le protocole SMTP pour envoyer des e-mails

黄舟
黄舟original
2017-10-02 09:43:143415parcourir

SMTP (Simple Mail Transfer Protocol) est un protocole de transfert de courrier simple. Il s'agit d'un ensemble de règles permettant de transmettre du courrier d'une adresse source à une adresse de destination. Il contrôle la méthode de transfert des lettres. L'article suivant présente principalement comment Python3 utilise le protocole SMTP pour envoyer des e-mails. Les amis dans le besoin peuvent s'y référer.

Préface

Cet article vous présente principalement le contenu pertinent sur Python3 utilisant le protocole SMTP pour envoyer des e-mails. Il présente également comment utiliser Python. programme auquel envoyer des e-mails Avant de spécifier une adresse e-mail pour envoyer un e-mail, nous devons introduire quelques connaissances sur le courrier électronique.

Le courrier électronique a une histoire plus longue que le Web Jusqu'à présent, le courrier électronique est également un service très utilisé sur Internet.

Presque tous les langages de programmation prennent en charge l'envoi et la réception d'e-mails, mais attendez, avant de commencer à écrire du code, il est nécessaire de comprendre comment fonctionne l'e-mail sur Internet.

Supposons que notre propre adresse e-mail soit me@163.com et que l'adresse e-mail de l'autre partie soit ami@sina.com. Nous utilisons maintenant un logiciel tel qu'Outlook ou Foxmail pour rédiger l'e-mail et remplir l'e-mail de l'autre partie. adresse, cliquez sur "Envoyer" et l'e-mail sera envoyé. Ces logiciels de messagerie sont appelés MUA : Mail User Agent – ​​Mail User Agent.

Les e-mails envoyés depuis MUA n'atteignent pas directement l'ordinateur de l'autre partie, mais sont envoyés à MTA : Mail Transfer Agent - Agent de transfert de courrier, qui est celui des fournisseurs de services de messagerie, tels que NetEase, Sina, etc. Puisque notre propre adresse e-mail est 163.com, l'e-mail est d'abord envoyé au MTA fourni par NetEase, puis envoyé par le MTA de NetEase à l'autre fournisseur de services, qui est le MTA de Sina. Ce processus peut également passer par d'autres MTA, mais nous ne nous soucions pas de l'itinéraire spécifique, nous nous soucions uniquement de la vitesse.

Une fois que l'e-mail atteint le MTA de Sina, puisque l'autre partie utilise l'adresse e-mail de @sina.com, le MTA de Sina livrera l'e-mail à la destination finale de l'e-mail : MDA : Agent de livraison du courrier——Livraison du courrier Agent . Une fois que l'e-mail atteint MDA, il repose tranquillement sur un serveur de Sina et est stocké dans un fichier ou une base de données spéciale. Nous appelons cet endroit où les e-mails sont stockés pendant une longue période une boîte e-mail. Pour recevoir le courrier, l'autre partie doit utiliser MUA pour transférer le courrier du MDA vers son ordinateur.

Ainsi, le parcours d'un e-mail est :

Expéditeur -> MTA -> ;- MUA <- Destinataire

Avec les concepts de base ci-dessus, vous devez écrire un programme pour envoyer et recevoir des e-mails, qui est essentiellement :

1. Écrire MUA pour envoyer des e-mails à MTA.

2. Écrivez MUA pour recevoir des emails de MDA.

Lors de l'envoi d'e-mails, le protocole utilisé par MUA et MTA est SMTP : Simple Mail Transfer Protocol. Le MTA suivant utilise également le protocole SMTP vers un autre MTA.

Lors de la réception d'e-mails, MUA et MDA utilisent deux protocoles : POP : Post Office Protocol, la version actuelle est 3, communément appelée POP3 : Internet Message Access Protocol, la version actuelle est 4, l'avantage est que non seulement Mail, vous pouvez également gérer directement le courrier stocké sur le MDA, par exemple en le déplaçant de la boîte de réception vers la corbeille, etc.

Lors de l'envoi d'e-mails, le logiciel client de messagerie vous demandera d'abord de configurer le serveur SMTP, c'est-à-dire à quel MTA vous souhaitez envoyer. En supposant que vous utilisez l'adresse e-mail de 163, vous ne pouvez pas envoyer directement au MTA de Sina car il ne dessert que les utilisateurs de Sina. Par conséquent, vous devez renseigner l'adresse du serveur SMTP fournie par 163 : smtp.163.com, afin de prouver que vous l'êtes. 163 Pour les utilisateurs, le serveur SMTP vous demande également de renseigner votre adresse e-mail et votre mot de passe de messagerie, afin que le MUA puisse normalement envoyer des e-mails au MTA via le protocole SMTP.

De même, lors de la réception d'e-mails de MDA, le serveur MDA exige également une vérification de votre mot de passe de messagerie pour garantir que personne ne prétendra être vous pour recevoir vos e-mails. Par conséquent, les clients de messagerie tels qu'Outlook vous le demanderont. remplissez l'adresse du serveur POP3 ou IMAP, l'adresse e-mail et le mot de passe, afin que MUA puisse obtenir avec succès les e-mails de MDA via le protocole POP ou IMAP.

Remarque spéciale finale : Actuellement, la plupart des fournisseurs de services de messagerie doivent activer manuellement les fonctions d'envoi SMTP et de réception POP, sinon ils ne sont autorisés à se connecter que sur le Web :

Par exemple, la boîte aux lettres QQ

Ensuite, nous commençons notre sujet, comment envoyer des e-mails via python.

------------------------------------------------------ ------ ------------------------------------

L'envoi d'e-mails texte est facile

SMTP est un protocole d'envoi d'e-mails Python prend en charge SMTP et peut envoyer des e-mails en texte brut, des e-mails HTML et des e-mails avec. pièces jointes.

Python prend en charge SMTP avec deux modules, smtplib et email Email est responsable de la construction des e-mails, et smtplib est responsable de l'envoi des e-mails.

Tout d’abord, construisons l’e-mail en texte brut le plus simple :


from email.mime.text import MIMEText
msg = MIMEText(&#39;hello, this is axin...&#39;, &#39;plain&#39;, &#39;utf-8&#39;)

Remarque : Lors de la construction de l'objet MIMEText, le premier paramètre est le corps de l'e-mail et le deuxième paramètre est le sous-type de MIME. Texte pur, le MIME final est « texte/plain » et doit finalement être codé avec utf-8 pour garantir la compatibilité multilingue.

Nous n'avons pas seulement le contenu du corps, nous devons également ajouter des informations d'en-tête à l'e-mail que nous souhaitons envoyer. Les informations d'en-tête contiennent des informations telles que l'expéditeur et le destinataire, ainsi que l'objet de l'e-mail.


msg = MIMEText(&#39;hello, this is axin...&#39;, &#39;plain&#39;, &#39;utf-8&#39;) #邮件正文
msg[&#39;From&#39;] = _format_addr(&#39;阿鑫 <%s>&#39; % from_addr) #邮件头部,发送者信息
msg[&#39;To&#39;] = _format_addr(&#39;aa <%s>&#39; % to_addr) #接收者信息
msg[&#39;Subject&#39;] = Header(&#39;test&#39;, &#39;utf-8&#39;).encode() #邮件主题

Après avoir construit les informations que nous voulons envoyer, il suffit d'appeler la fonction correspondante en python et de l'envoyer via SMTP :


server = smtplib.SMTP(smtp_server, 25) #SMTP协议默认端口是25
server.set_debuglevel(1) #打印出和SMTP服务器交互的所有信息
server.login(from_addr, password) #登录SMTP服务器
server.sendmail(from_addr, [to_addr], msg.as_string()) #发送邮件
server.quit()

Nous pouvons utiliser set_debuglevel(1) pour imprimer toutes les informations interagissant avec le serveur SMTP. Le protocole SMTP est simplement constitué de commandes et de réponses textuelles. La méthode login() est utilisée pour se connecter au serveur SMTP. La méthode sendmail() consiste à envoyer un e-mail Comme elle peut être envoyée à plusieurs personnes à la fois, une liste est transmise. Le corps de l'e-mail est une chaîne. . as_string() transforme l'objet MIMEText en str.

L'exemple de code complet est le suivant :


from email import encoders
from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr

import smtplib

def _format_addr(s): #格式化一个邮件地址
name, addr = parseaddr(s)
return formataddr((Header(name, &#39;utf-8&#39;).encode(), addr))

from_addr = &#39;fengxinlinux@sina.com&#39; #发送者邮箱地址
password = &#39;******&#39; #发送者邮箱密码,不告诉你密码=。=
to_addr = &#39;903087053@qq.com&#39; #接收者邮箱地址
smtp_server = &#39;smtp.sina.com&#39; #发送者所在的邮箱供应商的MTA地址
#from_addr = input(&#39;From: &#39;)
#password = input(&#39;Password: &#39;)
#to_addr = input(&#39;To: &#39;)
#smtp_server = input(&#39;SMTP server: &#39;)

msg = MIMEText(&#39;hello, this is axin...&#39;, &#39;plain&#39;, &#39;utf-8&#39;) #邮件正文
msg[&#39;From&#39;] = _format_addr(&#39;阿鑫 <%s>&#39; % from_addr) #邮件头部,发送者信息
msg[&#39;To&#39;] = _format_addr(&#39;axin <%s>&#39; % to_addr) #接收者信息
msg[&#39;Subject&#39;] = Header(&#39;test&#39;, &#39;utf-8&#39;).encode() #邮件主题


server = smtplib.SMTP(smtp_server, 25) # SMTP协议默认端口是25
server.set_debuglevel(1) #打印出和SMTP服务器交互的所有信息
server.login(from_addr, password) #登录SMTP服务器
server.sendmail(from_addr, [to_addr], msg.as_string()) #发送邮件
server.quit()
1

En exécutant le programme, nous constaterons qu'un e-mail a été reçu dans la boîte aux lettres j'ai testé Nouveau courrier.

Nous constaterons que les autres informations sont les mêmes, mais les informations du destinataire ne sont pas l'axine renseignée dans notre programme.

Parce que de nombreux fournisseurs de services de messagerie remplaceront automatiquement le nom du destinataire par le nom enregistré de l'utilisateur lors de l'affichage de l'e-mail, mais l'affichage des noms des autres destinataires ne sera pas affecté.

Lors de mes tests, il arrivait que les e-mails que j'envoyais soient considérés comme du spam par le fournisseur de services de messagerie et étaient directement placés à la poubelle. . . Quant à ce qui sera considéré comme du spam, je n’en ai aucune idée. .

Envoyer un e-mail avec des pièces jointes

Ci-dessus, nous avons présenté comment envoyer des e-mails texte Avec les connaissances ci-dessus, envoyer des e-mails avec des pièces jointes est en fait. très simple.

Un e-mail avec des pièces jointes peut être considéré comme un e-mail contenant plusieurs parties : le texte et chaque pièce jointe elle-même. Par conséquent, vous pouvez construire un objet MIMEMultipart pour représenter l'e-mail lui-même, puis y ajouter un MIMEText en tant qu'e-mail. body, puis continuer Ajoutez simplement l'objet MIMEBase représentant la pièce jointe :


# 邮件对象:
msg= MIMEMultipart()
msg[&#39;From&#39;] = _format_addr(&#39;阿鑫 <%s>&#39; % from_addr) #邮件头部,发送者信息
msg[&#39;To&#39;] = _format_addr(&#39;axin <%s>&#39; % to_addr) #接收者信息
msg[&#39;Subject&#39;] = Header(&#39;test&#39;, &#39;utf-8&#39;).encode() #邮件主题

# 邮件正文是MIMEText:
msg.attach(MIMEText(&#39;hello, this is axin...&#39;, &#39;plain&#39;, &#39;utf-8&#39;))

# 添加附件就是加上一个MIMEBase,从本地读取一个图片:
with open(&#39;/home/fengxin/图片/11.jpg&#39;,&#39;rb&#39;) as fhandle:
mime = MIMEBase(&#39;image&#39;,&#39;jpeg&#39;,filename=&#39;11.jpg&#39;)
mime.add_header(&#39;Content-Disposition&#39;, &#39;attachment&#39;, filename=&#39;11.jpg&#39;)
mime.add_header(&#39;Content-ID&#39;, &#39;<0>&#39;)
mime.add_header(&#39;X-Attachment-Id&#39;, &#39;0&#39;)
# 把附件的内容读进来:
mime.set_payload(fhandle.read())
# 用Base64编码:
encoders.encode_base64(mime)
# 添加到MIMEMultipart:
msg.attach(mime)

Ensuite, suivez le processus d'envoi normal pour envoyer le msg (notez que le type a changé à MIMEMultipart). E-mail reçu avec pièce jointe.

L'exemple de code complet est le suivant :


from email import encoders
from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase


import smtplib

def _format_addr(s): #格式化一个邮件地址
name, addr = parseaddr(s)
return formataddr((Header(name, &#39;utf-8&#39;).encode(), addr))

from_addr = &#39;你的邮箱地址&#39; #发送者邮箱地址
password = &#39;你的邮箱密码&#39; #发送者邮箱密码
to_addr = &#39;903087053@qq.com&#39; #接收者邮箱地址
smtp_server = &#39;smtp.sina.com&#39; #发送者所在的邮箱供应商的MTA地址
#from_addr = input(&#39;From: &#39;)
#password = input(&#39;Password: &#39;)
#to_addr = input(&#39;To: &#39;)
#smtp_server = input(&#39;SMTP server: &#39;)


msg= MIMEMultipart()
msg[&#39;From&#39;] = _format_addr(&#39;阿鑫 <%s>&#39; % from_addr) #邮件头部,发送者信息
msg[&#39;To&#39;] = _format_addr(&#39;axin <%s>&#39; % to_addr) #接收者信息
msg[&#39;Subject&#39;] = Header(&#39;test&#39;, &#39;utf-8&#39;).encode() #邮件主题

msg.attach(MIMEText(&#39;hello, this is axin...&#39;, &#39;plain&#39;, &#39;utf-8&#39;))

with open(&#39;/home/fengxin/图片/11.jpg&#39;,&#39;rb&#39;) as fhandle:
mime = MIMEBase(&#39;image&#39;,&#39;jpeg&#39;,filename=&#39;11.jpg&#39;)
mime.add_header(&#39;Content-Disposition&#39;, &#39;attachment&#39;, filename=&#39;11.jpg&#39;)
mime.add_header(&#39;Content-ID&#39;, &#39;<0>&#39;)
mime.add_header(&#39;X-Attachment-Id&#39;, &#39;0&#39;)
# 把附件的内容读进来:
mime.set_payload(fhandle.read())
# 用Base64编码:
encoders.encode_base64(mime)
# 添加到MIMEMultipart:
msg.attach(mime)

server = smtplib.SMTP(smtp_server, 25) # SMTP协议默认端口是25
server.set_debuglevel(1) #打印出和SMTP服务器交互的所有信息
server.login(from_addr, password) #登录SMTP服务器
server.sendmail(from_addr, [to_addr], msg.as_string()) #发送邮件
server.quit()
1

Après l'exécution. La boîte aux lettres de test a reçu correctement l'e-mail, comme le montre l'image :

Résumé

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn