您的位置:首页 > 游戏 > 游戏 > PYTHON专题-(11)基操之我要发邮件

PYTHON专题-(11)基操之我要发邮件

2024/12/21 20:06:49 来源:https://blog.csdn.net/qq_41914036/article/details/140975479  浏览:    关键词:PYTHON专题-(11)基操之我要发邮件

什么是电子邮件?

  • 电子邮件是一种通过电子通信方式发送信息和文档的服务。它允许用户在互联网上创建、发送和接收消息,这些消息可以包含文本、图片、音频和视频等多种形式的内容。通过电子邮件,用户可以与其他人进行远程的沟通和交流。电子邮件是一种非常常用和方便的通信工具,在个人和商业领域都得到广泛应用。

电子邮件是怎么实现的? 

电子邮件的工作原理可以简单地描述为以下几个步骤:

  1. 发送方编写邮件内容并填写收件人地址。
  2. 发送方将邮件发送给自己所连接的邮件服务器。
  3. 邮件服务器根据收件人地址查找目标邮件服务器。
  4. 发送方的邮件服务器使用SMTP(简单邮件传输协议)将邮件发送给目标邮件服务器。
  5. 目标邮件服务器接收到邮件后,将邮件存储在邮箱中。
  6. 接收方登录自己的邮箱,通过POP(邮局协议)或IMAP(Internet邮件访问协议)从目标邮件服务器下载邮件到本地设备。
  7. 接收方通过邮件客户端(如Outlook、Gmail等)查看和管理收到的邮件。

这是一个简化的邮件传输过程,实际的过程中还有很多细节和协议涉及到。但总体来说,电子邮件的工作原理就是通过一系列的协议和服务器之间的通信来实现邮件的发送和接收。

python是怎么实现电子邮件的接受和发送的? 

在Python中,可以使用smtplib和imaplib模块来实现电子邮件的发送和接收。

  1. 要发送电子邮件,需要使用smtplib模块。以下是发送电子邮件的基本步骤:
  • 导入smtplib模块;
  • 创建一个SMTP对象,并连接到SMTP服务器。需要将'smtp.example.com'替换为实际的SMTP服务器地址,587是Gmail邮箱的SMTP服务器的端口号。
  • 启用TLS加密。如果SMTP服务器需要TLS加密,则需要调用该方法。
  • 登录到SMTP服务器。需要将'sender@example.com'替换为发送者的电子邮件地址,'password'替换为发送者的密码。
  • 发送邮件。需要将'sender@example.com'和'receiver@example.com'替换为实际的发送者和接收者的电子邮件地址。第三个参数是邮件的内容。
  • 退出SMTP服务器。
    import smtplib# 创建一个SMTP对象,并连接到SMTP服务器
    smtpObj = smtplib.SMTP('smtp.example.com', 587)# 启用TLS加密
    smtpObj.starttls()# 登录到SMTP服务器
    smtpObj.login('sender@example.com', 'password')# 发送邮件
    smtpObj.sendmail('sender@example.com', 'receiver@example.com', 'Subject: Test\n\nThis is a test email.')# 退出SMTP服务器
    smtpObj.quit()
    2. 要接收电子邮件,需要使用imaplib模块。以下是接收电子邮件的基本步骤:
  • 导入imaplib模块。
  • 连接到IMAP服务器。需要将'imap.example.com'替换为实际的IMAP服务器地址。
  • 登录到IMAP服务器。需要将'username'替换为实际的用户名,'password'替换为实际的密码。
  • 选择邮箱文件夹。可以选择其他邮箱文件夹,如'Sent'表示已发送邮件。
  • 搜索邮件。其中第二个参数可以是'ALL',表示搜索所有邮件,也可以是其他条件。
  • 获取邮件内容。可以根据需要对邮件内容进行处理。
  • 关闭连接。
    import imaplib# 连接到IMAP服务器
    imapObj = imaplib.IMAP4('imap.example.com')# 登录到IMAP服务器
    imapObj.login('username', 'password')# 选择邮箱文件夹
    imapObj.select('INBOX')# 搜索邮件
    typ, data = imapObj.search(None, 'ALL')# 获取邮件内容
    for num in data[0].split():typ, msg_data = imapObj.fetch(num, '(RFC822)')email_body = msg_data[0][1]# 处理邮件内容# 关闭连接
    imapObj.logout()

​​​​​需要注意的是,发送和接收电子邮件的具体步骤可能因为SMTP服务器和IMAP服务器的不同而有所区别。因此,在实际的使用中,需要根据具体的情况进行调整和配置。

通过POP协议或IMAP协议接收的邮件有什么不同? 

POP(Post Office Protocol)协议和IMAP(Internet Message Access Protocol)协议是两种用于接收电子邮件的协议,它们之间有以下不同点:

  1. 邮件存储:POP协议将邮件从服务器下载到本地设备上,并从服务器上删除。邮件只存在于本地设备上,不再可访问服务器上的原始邮件。而IMAP协议将邮件存储在服务器上,本地设备只是通过协议与服务器进行同步和访问。

  2. 邮件同步:使用POP协议接收邮件后,邮件会从服务器上删除,所以无法在其他设备上查看之前的邮件。而IMAP协议可以在多个设备之间同步和访问邮件,使得在不同设备上查看邮件的状态(已读、已删除等)保持一致。

  3. 离线访问:因为POP协议将邮件下载到本地设备上,所以可以在没有网络连接的情况下访问邮件。而IMAP协议需要网络连接才能同步和访问邮件。

  4. 邮件管理:使用POP协议时,邮件只能下载到本地设备上,无法在服务器上进行管理(例如创建文件夹、标记邮件等)。而IMAP协议允许在服务器上进行邮件管理,在各个设备上所做的更改都会反映在服务器上。

综上所述,POP协议适合需要离线访问、不需要在多个设备上同步邮件、不需要在服务器上管理邮件的用户。而IMAP协议适合需要在多个设备上同步邮件、在服务器上管理邮件、随时访问最新邮件的用户。

使用IMAP协议接收邮件时,可以选择哪些邮箱? 

  • 使用IMAP协议接收邮件时,可以选择使用支持IMAP协议的任何邮箱。一些常见的邮箱服务提供商,如Gmail、Outlook、Hotmail、Yahoo等都提供了对IMAP协议的支持。此外,一些企业邮箱服务也支持IMAP协议。无论是免费邮箱还是付费企业邮箱,只要支持IMAP协议,都可以使用IMAP协议接收邮件。

INBOX是什么邮箱文件夹? 

  • INBOX是一种邮箱的术语,指的是收件箱。在电子邮件中,INBOX是用来接收和存储收到的邮件的文件夹或标签。当有新邮件到达时,它们会被送到收件箱中,用户可以在收件箱中查看、管理和回复邮件。不同的邮件服务提供商可能有不同的界面和功能,但收件箱作为一个基本的组成部分是普遍存在的。

imapObj.select('INBOX')有哪些参数可以选择?

imapObj.select('INBOX') 方法是用来选择邮箱文件夹的。参数可以选择如下:

  1. mailbox (必须)- 邮箱文件夹的名称,例如'INBOX'表示收件箱。
  2. readonly (可选)- 一个布尔值,表示是否以只读模式打开文件夹。默认为False,即以读写模式打开文件夹。
  3. create (可选)- 一个布尔值,表示如果指定的文件夹不存在是否应该创建。默认为True,即如果文件夹不存在则创建。

例如,imapObj.select('Sent', readonly=True) 表示以只读模式打开“Sent”文件夹。

邮箱文件夹有哪些类型? 

  • 在邮箱中,常见的文件夹类型包括收件箱(Inbox)、已发送邮件(Sent)、草稿箱(Drafts)、垃圾邮件(Spam或Junk)和已删除邮件(Trash或Deleted)等。此外,还可能有自定义的文件夹类型,如归档(Archive)等。

imapObj.search(None, 'ALL')代码中有哪些参数可以选择?

imapObj.search(None, 'ALL')代码中,第一个参数可以选择以下参数:

  1. charset:用于指定搜索的字符集,可以是字符串或None。默认值是None,表示使用服务器的默认字符集。
  2. criteria:用于指定搜索的条件,可以是一个字符串或一个列表。常见的搜索条件包括:'ALL'(所有邮件)、'UNSEEN'(未读邮件)、'SEEN'(已读邮件)、'FLAGGED'(标记的邮件)、'UNFLAGGED'(未标记的邮件)、'NEW'(新邮件)、'OLD'(旧邮件)、'ANSWERED'(已回复的邮件)、'UNANSWERED'(未回复的邮件)、'DELETED'(已删除的邮件)、'UNDELETED'(未删除的邮件)等。
  3. callback:用于指定回调函数,当搜索结束时会调用该函数。可以是一个函数或None

在这个代码示例中,第一个参数使用了None,表示使用服务器的默认字符集;第二个参数使用了'ALL',表示搜索所有的邮件。

 如果我想过滤一些邮件该怎么做?

  • 在Python中,你可以使用正则表达式来过滤邮件。例如:
    import reemail_list = ['abc@example.com','xyz@gmail.com','123@yahoo.com','test@domain.com','invalid_email',
    ]pattern = r'^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$'
    filtered_emails = [email for email in email_list if re.match(pattern, email)]print(filtered_emails)
    
  • 在上述示例中,我们使用re.match()函数和正则表达式模式来检查每个邮件地址是否符合我们指定的模式。在这个例子中,我们使用了一个常见的邮箱地址的正则表达式模式。上述代码的输出将是:
    ['abc@example.com', 'xyz@gmail.com', '123@yahoo.com', 'test@domain.com']
    
  • 注意,这只是一个简单的示例,实际应用中可能需要更复杂的正则表达式模式,以满足特定的过滤需求。

什么是正则表达式?

  • 正则表达式是一种用来匹配字符串的模式。它由特定的字符和符号组成,可以用来描述一系列可能的字符串。
  • 正则表达式可以用来搜索、替换、验证和提取字符串中的特定内容。它可以在多种编程语言和文本编辑器中使用,广泛应用于文本处理、数据抽取、数据验证等领域。

python使用什么模块来实现正则表达式? 

re模块是Python中的正则表达式模块,可以用于对字符串进行匹配、搜索、替换等操作。

re模块包含以下函数:

  1. re.match(pattern, string, flags=0):尝试从字符串的起始位置匹配一个模式,如果匹配成功返回匹配对象,否则返回None。

  2. re.search(pattern, string, flags=0):在字符串中搜索匹配的第一个位置,如果匹配成功返回匹配对象,否则返回None。

  3. re.findall(pattern, string, flags=0):搜索字符串,以列表形式返回所有匹配的子串。

  4. re.finditer(pattern, string, flags=0):搜索字符串,以迭代器形式返回所有匹配的子串。

  5. re.sub(pattern, repl, string, count=0, flags=0):在字符串中找到匹配的正则表达式,并替换为指定的字符串。

  6. re.split(pattern, string, maxsplit=0, flags=0):根据正则表达式的匹配项来分割字符串。

此外,re模块还包含一些用于操作正则表达式的函数,如re.compile, re.escape, re.fullmatch, re.subn等。

 什么是正则表达式的模式?

  • 正则表达式的模式是一个字符串,用来描述需要匹配的文本的模式。模式由正则表达式语法所定义,能够对文本进行过滤、匹配和提取。模式可以包含字母、数字、特殊字符和元字符,用于指定匹配规则。通过使用不同的模式,可以实现对文本的不同操作,例如查找特定的字符串、替换文本、验证输入的格式等。

正则表达式有哪些匹配规则?

正则表达式的匹配规则有以下几种:

  1. 字符匹配:用于匹配某个具体的字符,例如 abc 可以匹配 "abc"。

  2. 字符类匹配:用方括号 [ ] 表示,匹配方括号内的任意一个字符。例如 [abc] 可以匹配 "a"、"b" 或 "c"。

  3. 范围类匹配:在字符类内使用连字符 - 表示范围,用来匹配在某个范围内的字符。例如 [0-9] 可以匹配任意一个数字。

  4. 预定义字符类匹配:包括 \d(匹配数字)、\w(匹配字母、数字、下划线) 和 \s(匹配空白字符)等。

  5. 反义字符类匹配:在字符类内使用 ^ 表示反义,即匹配除了字符类内的字符之外的任意字符。例如 [^0-9] 可以匹配除了数字之外的任意字符。

  6. 重复匹配:用 {n} 表示匹配前面的元素恰好出现 n 次,用 {n,} 表示匹配前面的元素至少出现 n 次,用 {n,m} 表示匹配前面的元素出现 n 到 m 次。

  7. 选择匹配:用 | 表示选择匹配,匹配满足其中任意一个子表达式的字符串。例如 a|b 可以匹配 "a" 或 "b"。

  8. 边界匹配:用 ^ 表示匹配字符串的开头,用 $ 表示匹配字符串的结尾。

  9. 分组匹配:用圆括号 ( ) 表示分组,可以对一部分正则表达式进行分组并进行匹配。例如 (abc){2} 可以匹配 "abcabc"。

以上是正则表达式的基本匹配规则,正则表达式还有更多高级匹配规则,如零宽断言、贪婪与非贪婪匹配等。

 我想自己构建好邮件内容再发送该怎么做?

  • Python对SMTP支持有smtplibemail两个模块,email负责构造邮件,smtplib负责发送邮件。
    from email.mime.text import MIMEText
    msg = MIMEText('hello, send by Python...', 'plain', 'utf-8')
  • 注意到构造MIMEText对象时,第一个参数就是邮件正文,第二个参数是MIME的subtype,传入'plain'表示纯文本,最终的MIME就是'text/plain',最后一定要用utf-8编码保证多语言兼容性。 然后,通过SMTP发出去:
    # 输入Email地址和口令:
    from_addr = input('From: ')
    password = input('Password: ')
    # 输入收件人地址:
    to_addr = input('To: ')
    # 输入SMTP服务器地址:
    smtp_server = input('SMTP server: ')import smtplib
    server = smtplib.SMTP(smtp_server, 25) # SMTP协议默认端口是25
    server.set_debuglevel(1)
    server.login(from_addr, password)
    server.sendmail(from_addr, [to_addr], msg.as_string())
    server.quit()
  • 我们用set_debuglevel(1)就可以打印出和SMTP服务器交互的所有信息。SMTP协议就是简单的文本命令和响应。login()方法用来登录SMTP服务器,sendmail()方法就是发邮件,由于可以一次发给多个人,所以传入一个list,邮件正文是一个stras_string()MIMEText对象变成str。 

我想自己设置邮件主题和收件人名字该怎么做?

  • 邮件主题、如何显示发件人、收件人等信息并不是通过SMTP协议发给邮件传输代理MTA,而是包含在发给MTA的文本中的,所以,我们必须把FromToSubject添加到MIMEText中,才是一封完整的邮件:
    from email import encoders
    from email.header import Header
    from email.mime.text import MIMEText
    from email.utils import parseaddr, formataddrimport smtplibdef _format_addr(s):name, addr = parseaddr(s)return formataddr((Header(name, 'utf-8').encode(), addr))from_addr = input('From: ')
    password = input('Password: ')
    to_addr = input('To: ')
    smtp_server = input('SMTP server: ')msg = MIMEText('hello, send by Python...', 'plain', 'utf-8')
    msg['From'] = _format_addr('Python爱好者 <%s>' % from_addr)
    msg['To'] = _format_addr('管理员 <%s>' % to_addr)
    msg['Subject'] = Header('来自SMTP的问候……', 'utf-8').encode()server = smtplib.SMTP(smtp_server, 25)
    server.set_debuglevel(1)
    server.login(from_addr, password)
    server.sendmail(from_addr, [to_addr], msg.as_string())
    server.quit()
  • 我们编写了一个函数_format_addr()来格式化一个邮件地址。注意不能简单地传入name <addr@example.com>,因为如果包含中文,需要通过Header对象进行编码。msg['To']接收的是字符串而不是list,如果有多个邮件地址,用,分隔即可。 

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com