您现在的位置是:首页 > 技术教程 正文

python接收/发送QQ邮箱(保姆级)

admin 阅读: 2024-03-26
后台-插件-广告管理-内容页头部广告(手机)

前言:

关于代码中:

sender_email = 'XXXX@qq.com'   #这个就是你的邮箱地址,不多说了
password = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXX' #在QQ邮箱设置里拿到的码,自己去查.需要手机发信息过去,0.1/RMB一个;为期大概一个月!

1.发送邮箱:

  1. import smtplib
  2. from email.mime.text import MIMEText
  3. from email.header import Header
  4. # 邮件内容
  5. subject = '邮件主题'
  6. body = '邮件正文'
  7. # 构建邮件
  8. msg = MIMEText(body, 'plain', 'utf-8')
  9. msg['Subject'] = Header(subject, 'utf-8')
  10. msg['From'] = 'XXXX@qq.com'
  11. msg['To'] = 'XXXX@qq.com'
  12. # 发送邮件
  13. smtp_server = 'smtp.qq.com'
  14. smtp_port = 587
  15. sender_email = 'XXXX@qq.com'
  16. password = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXX' #在QQ邮箱设置里拿到的码
  17. try:
  18. with smtplib.SMTP(smtp_server, smtp_port) as server:
  19. server.starttls()
  20. server.login(sender_email, password)
  21. server.sendmail(sender_email, [msg['To']], msg.as_string())
  22. print('邮件发送成功')
  23. except smtplib.SMTPException as e:
  24. print('邮件发送失败:', str(e))

2.接收邮箱---(打印发件人/主题,解决收件人乱码问题)

  1. import base64
  2. import poplib
  3. from email.parser import BytesParser
  4. import email.header as jiexi
  5. import re
  6. #这个代码会检查邮件发件人,如果发件人存在,才会进行解析和输出,否则将直接跳过邮件。并且我改变了邮件解析的方法,使用了email.header.decode_header函数来解析邮件的头部信息和主题。
  7. # 连接到POP3服务器
  8. pop_server = poplib.POP3_SSL('pop.qq.com', 995)
  9. pop_server.user('xxxx@qq.com')
  10. pop_server.pass_('xxxxxxxxxx')
  11. # 获取邮箱中的邮件信息
  12. num_emails = len(pop_server.list()[1])
  13. # 遍历每封邮件
  14. for i in range(num_emails):
  15. # 获取邮件内容
  16. response, lines, octets = pop_server.retr(i + 1)
  17. email_content = b'\r\n'.join(lines)
  18. # 解析邮件内容
  19. email_parser = BytesParser()
  20. email = email_parser.parsebytes(email_content)
  21. # 解析邮件头部信息
  22. email_from = email.get('From').strip()
  23. email_from = str(jiexi.make_header(jiexi.decode_header(email_from)))
  24. if email_from: # 只处理存在发件人的邮件
  25. # 解析邮件主题
  26. subject = email.get('Subject').strip()
  27. decoded_subject = str(jiexi.make_header(jiexi.decode_header(subject))) if subject else None
  28. print("------------------")
  29. print("From:", email_from)
  30. print("Subject:", decoded_subject)
  31. else:
  32. continue # 跳过缺失发件人的邮件
  33. # 关闭连接
  34. pop_server.quit()

3.接收邮箱v02---(打印出邮件的正文body部分)

  1. import poplib
  2. from email import policy
  3. from email.parser import BytesParser
  4. from email.header import decode_header, make_header
  5. #在这段代码中,我定义了一个函数get_html_payload()来提取邮件的payload。
  6. # 如果邮件的主题是多部分的(即包含多个部分,例如文本和HTML),那么我们会遍历每个部分,
  7. # 找出HTML部分并返回。如果邮件主题只有一个部分且是HTML,则直接返回该部分。如果没有合适的部分,
  8. # 那么函数将返回None。
  9. def get_html_payload(email_message):
  10. if email_message.is_multipart():
  11. for part in email_message.iter_parts():
  12. content_type = part.get_content_type()
  13. if content_type == 'text/html':
  14. return part.get_content()
  15. else:
  16. continue
  17. elif email_message.get_content_type() == 'text/html':
  18. return email_message.get_content()
  19. # 连接到POP3服务器
  20. pop_server = poplib.POP3_SSL('pop.qq.com', 995)
  21. pop_server.user('xxxxxx@qq.com')
  22. pop_server.pass_('xxxxxxx')
  23. # 获取邮箱中的邮件信息
  24. num_emails = len(pop_server.list()[1])
  25. # 遍历每封邮件
  26. for i in range(num_emails):
  27. # 获取邮件内容
  28. response, lines, octets = pop_server.retr(i + 1)
  29. email_content = b'\r\n'.join(lines)
  30. # 解析邮件内容
  31. email_parser = BytesParser(policy=policy.default)
  32. email = email_parser.parsebytes(email_content)
  33. # 解析邮件头部信息
  34. email_from = email.get('From').strip()
  35. email_from = str(make_header(decode_header(email_from)))
  36. if email_from: # 只处理存在发件人的邮件
  37. # 解析邮件主题
  38. subject = email.get('Subject').strip()
  39. decoded_subject = str(make_header(decode_header(subject))) if subject else None
  40. # 提取邮件正文
  41. email_body = get_html_payload(email)
  42. print("------------------")
  43. print("From:", email_from)
  44. print("Subject:", decoded_subject)
  45. print("Body:", email_body)
  46. else:
  47. continue # 跳过缺失发件人的邮件
  48. # 关闭连接
  49. pop_server.quit()

4.接收邮箱v03---(打印出邮件的正文body部分,并分类存文件到目录,以html/图片/text分类)

  1. import os
  2. import base64
  3. import poplib
  4. from email import policy
  5. from email.parser import BytesParser
  6. from email.header import decode_header, make_header
  7. def sanitize_folder_name(name):
  8. #清理邮箱地址,移除或替换那些非法字符
  9. invalid_characters = "<>:\"/\\|?*@"
  10. for char in invalid_characters:
  11. name = name.replace(char, "_")
  12. return name
  13. def get_payload(email_message):
  14. #------------------解析正文-------------------
  15. # 我在循环中使用了这个新的信息,根据正文的类型执行不同的操作。对于纯文本类型,它只打印正文;
  16. # 对于html和image类型,它创建一个目录(如果还不存在),然后将正文写入一个文件。对于image,
  17. # 我还添加了一个把数据从base64格式解码回二进制格式的步骤,这是因为图片通常会以base64格式存储在邮件中。
  18. if email_message.is_multipart():
  19. for part in email_message.iter_parts():
  20. content_type = part.get_content_type()
  21. if content_type == 'text/html':
  22. return part.get_content(), 'html'
  23. elif content_type == 'text/plain':
  24. return part.get_content(), 'text'
  25. elif content_type.startswith('image/'):
  26. return part.get_content(), 'image', part.get_content_type().split('/')[-1]
  27. else:
  28. continue
  29. elif email_message.get_content_type() == 'text/html':
  30. return email_message.get_content(), 'html'
  31. elif email_message.get_content_type() == 'text/plain':
  32. return email_message.get_content(), 'text'
  33. # 连接到POP3服务器
  34. pop_server = poplib.POP3_SSL('pop.qq.com', 995)
  35. pop_server.user('xxxx@qq.com')
  36. pop_server.pass_('xxxxxx')
  37. # 获取邮箱中的邮件信息
  38. num_emails = len(pop_server.list()[1])
  39. # 遍历每封邮件
  40. for i in range(num_emails):
  41. # 获取邮件内容
  42. response, lines, octets = pop_server.retr(i + 1)
  43. email_content = b'\r\n'.join(lines)
  44. # 解析邮件内容
  45. email_parser = BytesParser(policy=policy.default)
  46. email = email_parser.parsebytes(email_content)
  47. # 解析邮件头部信息
  48. email_from = email.get('From').strip()
  49. email_from = str(make_header(decode_header(email_from)))
  50. if email_from: # 只处理存在发件人的邮件
  51. # 解析邮件主题
  52. subject = email.get('Subject').strip()
  53. decoded_subject = str(make_header(decode_header(subject))) if subject else None
  54. # 提取邮件正文
  55. email_body, body_type, *extras = get_payload(email)
  56. # 创建安全的文件夹名和文件名
  57. safe_folder_name = sanitize_folder_name(email_from)
  58. safe_subject = sanitize_folder_name(decoded_subject)
  59. print("------------------")
  60. print("From:", email_from)
  61. print("Subject:", decoded_subject)
  62. print("Body Type:", body_type)
  63. # 根据正文类型处理
  64. if body_type == 'text':
  65. print("Body:", email_body)
  66. elif body_type == 'html':
  67. directory = safe_folder_name
  68. if not os.path.exists(directory):
  69. os.makedirs(directory)
  70. with open(f'{directory}/{safe_subject}.html', 'w') as f:
  71. f.write(email_body)
  72. elif body_type == 'image':
  73. directory = safe_folder_name
  74. if not os.path.exists(directory):
  75. os.makedirs(directory)
  76. image_data = base64.b64decode(email_body)
  77. image_extension = extras[0] # Get the image extension
  78. with open(f'{directory}/{safe_subject}.{image_extension}', 'wb') as f:
  79. f.write(image_data)
  80. else:
  81. continue # 跳过缺失发件人的邮件
  82. # 关闭连接
  83. pop_server.quit()

5.接收邮箱v04--(接收指定的邮箱,并把它封装好!完整版,可直接使用)

  1. import os
  2. import base64
  3. import poplib
  4. from email import policy
  5. from email.parser import BytesParser
  6. from email.header import decode_header, make_header
  7. # 定义EmailClient类,用于连接到POP3服务器并从指定的邮件地址获取邮件
  8. class EmailClient:
  9. # 在初始化函数中,设置POP3服务器的来源、用户、密码和待查询的目标邮件地址
  10. def __init__(self, host, user, password, target_email):
  11. self.pop_server = poplib.POP3_SSL(host) # 使用POP3协议通过SSL安全连接到邮件服务器
  12. self.pop_server.user(user) # 输入用户邮箱
  13. self.pop_server.pass_(password) # 输入用户邮箱密码
  14. self.target_email = target_email # 输入待查询的目标邮件地址
  15. # 定义一个函数,用以清除文件名中的无效字符
  16. def sanitize_folder_name(self, name):
  17. invalid_characters = "<>:\"/\\|?*@"
  18. for char in invalid_characters: # 遍历所有无效字符
  19. name = name.replace(char, "_") # 将无效字符替换为下划线
  20. return name # 返回清理后的名称
  21. # 定义一个函数,用以提取邮件的payload(有效载荷,即邮件主体内容)
  22. def get_payload(self, email_message):
  23. if email_message.is_multipart(): # 判断邮件是否为多部分邮件
  24. for part in email_message.iter_parts(): # 如果是,则遍历其中的每一部分
  25. content_type = part.get_content_type() # 获取该部分的内容类型
  26. if content_type == 'text/html': # 如果内容类型为HTML,则返回该部分内容
  27. return part.get_content()
  28. elif content_type == 'text/plain': # 如果内容类型为纯文本,则返回该部分内容
  29. return part.get_content()
  30. elif email_message.get_content_type() == 'text/html': # 如果邮件非多部分形式,且为HTML类型,则返回邮件内容
  31. return email_message.get_content()
  32. elif email_message.get_content_type() == 'text/plain': # 如果邮件非多部分形式,且为纯文本类型,则返回邮件内容
  33. return email_message.get_content()
  34. # 定义一个函数,用以获取邮件信息
  35. def fetch_email(self):
  36. num_emails = len(self.pop_server.list()[1]) # 获取邮箱内的邮件数量
  37. # 遍历每一封邮件
  38. for i in range(num_emails):
  39. # 获取邮件内容
  40. response, lines, octets = self.pop_server.retr(i + 1) # retr函数返回指定邮件的全部文本
  41. email_content = b'\r\n'.join(lines) # 将所有行连接成一个bytes对象
  42. # 解析邮件内容
  43. email_parser = BytesParser(policy=policy.default) # 创建一个邮件解析器
  44. email = email_parser.parsebytes(email_content) # 解析邮件内容,返回一个邮件对象
  45. # 解析邮件头部信息并提取发件人信息
  46. email_from = email.get('From').strip() # 获取发件人信息,并去除尾部的空格
  47. email_from = str(make_header(decode_header(email_from))) # 解码发件人信息,并将其转换为字符串
  48. if email_from == self.target_email: # 如果发件人地址与指定的目标邮件地址一致,对邮件进行处理
  49. # 解析邮件时间
  50. email_time = email.get('Date') # 获取邮件时间
  51. # 提取邮件正文
  52. email_body = self.get_payload(email) # 获取邮件正文
  53. return email_body, email_time # 返回邮件正文和时间
  54. print("No new emails from", self.target_email) # 如果没有从目标邮件地址收到新邮件,打印相应信息
  55. return None, None # 返回None

-------封装他------------

  1. from shou_self import EmailClient
  2. client = EmailClient('pop.qq.com', '你的邮箱', '邮箱提取出的密码', '需要针对的目标邮箱')
  3. body, time = client.fetch_email()
  4. print("Time:", time)
  5. print("Body:", body)

标签:
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

在线投稿:投稿 站长QQ:1888636

后台-插件-广告管理-内容页尾部广告(手机)
关注我们

扫一扫关注我们,了解最新精彩内容

搜索