SMTP

正如 HTTP 是计算机用来通过因特网发送网页的协议,简单邮件传输协议(SMTP)

是用于发送电子邮件的协议

import smtplib

发送电子邮件

连接到SMTP服务器

smtpObj = smtplib.SMTP_SSL('pop.exmail.qq.com',465)
type(smtpObj)

发送SMTP的"hello"消息

smtpObj.ehlo() #返回250 means 成功

开始TLS加密

TLS 加密需要使用.starttls()方法

SSL 加密则不需要使用

登录到SMTP服务器

smtpObj.login('7379@jics.cn',input()) #返回235 means 成功 input由用户输入邮箱密码

发送电子邮件

smtpObj.sendmail("7379@jics.cn","evian_jeff@163.com",'Subject:So long.\nDear Alice,so long and thanks for all the fish. Sincerely,Bob')
#from发件邮箱 to收件邮箱 'Subject:\n'开头的邮件标题行和正文字符串
#返回空字典means成功

从SMTP服务器断开

smtpObj.quit() #221 means bye

IMAP

  • imaplib python自带模块
  • imapclient 第三方包 pip install imapclient
  • pyzmail 解析邮件内容 pip install pyzmail36
# pip install imapclient 安装imapclient
import imapclient

用IMAP获取和删除电子邮件

# pip install pyzmail36
import pyzmail #需要需改util.py文件

连接到IMAP服务器

import imapclient
imapObj = imapclient.IMAPClient('imap.exmail.qq.com', ssl=True)

登录到IMAP服务器

imapObj.login('7379@jics.cn', input())

搜索电子邮件

登录后,实际获取你感兴趣的电子邮件分为两步。首先,必须选择要搜索的文件

夹。然后,必须调用 IMAPClient 对象的 search()方法,传入 IMAP 搜索关键词字符串。

选择文件夹

import pprint
pprint.pprint(imapObj.list_folders())
imapObj.select_folder('INBOX', readonly=True) #除非你想删除的电子邮件,否则将 readonly 设置为 True总是个好主意

执行搜索

UIDs = imapObj.search(['SINCE 27-Aug-2019'])
UIDs

大小限制

import imaplib
imaplib._MAXLINE = 10000000

取邮件并标记为已读

rawMessages = imapObj.fetch(UIDs,['BODY[]'])
import pprint
pprint.pprint(rawMessages)

从原始消息中获取电子邮件地址

import pyzmail
message = pyzmail.PyzMessage.factory(rawMessages[4][b'BODY[]'])
message.get_subject() #查看主题
message.get_address('from') #每个元组包含两个字符串:第一个是与该电子邮件地址关联的名称,第二个是电子邮件地址本身
message.get_address('to')
message.get_addresses('cc')
message.get_addresses('bcc')

从原始消息中获取正文

message.text_part != True
message.text_part.get_payload().decode(message.text_part.charset) #'NoneType' object has no attribute 'get_payload'
message.html_part != None
message.html_part.get_payload().decode(message.html_part.charset)

删除电子邮件

imapObj.select_folder('INBOX', readonly=False)
UIDs = imapObj.search(['ON 26-AUG-2019'])
UIDs
imapObj.delete_messages(UIDs)
imapObj.expunge()
pprint.pprint(imapObj.list_folders()) #INBOX收件箱 Sent Messages发件箱 Drafts草稿箱 Deleted Messages已删除 Junk垃圾箱

从IMAP服务器断开

imapObj.logout()

项目:向会员发送会费提醒电子邮件

打开Excel文件

import openpyxl,smtplib,sys
# Open the spreadsheet and get the latest dues status.
wb = openpyxl.load_workbook(r"C:\Users\Administrator\automate_online-materials\duesRecords.xlsx")
sheet = wb.active
lastCol = sheet.max_column
latestMonth = sheet.cell(row=1,column=lastCol).value

查找所有未付成员

# TODO: Check each member's payment status.
unpaidMembers = {}
for r in range(2,sheet.max_row+1):
payment = sheet.cell(row=r,column=lastCol).value
if payment != 'paid':
name = sheet.cell(row=r,column=1).value
email = sheet.cell(row=r,column=2).value
unpaidMembers[name] = email

发送定制的电子邮件提醒

# TODO: Log in to email account.
smtpObj = smtplib.SMTP_SSL('pop.exmail.qq.com',465)
smtpObj.ehlo()
smtpObj.login("7379@jics.cn",input())
# TODO: Send out reminder emails.
for name,email in unpaidMembers.items():
body = '''Subject: %s dues unpaid.\nDear %s,\nRecord show that you have not paid dues for %s.
Please make this payment as soon as possible. Thank you!''' % (latestMonth,name,latestMonth)
print('Sending email to %s ... '% email)
sendmailStatus = smtpObj.sendmail('7379@jics.cn',email,body) if sendmailStatus != {}:
print("There was a problem sending email to %s:%s") % (email,sendmailStatus)
smtpObj.quit()

Python for Email的更多相关文章

  1. [Python] 发送email的几种方式

    python发送email还是比較简单的,能够通过登录邮件服务来发送,linux下也能够使用调用sendmail命令来发送,还能够使用本地或者是远程的smtp服务来发送邮件,无论是单个,群发,还是抄送 ...

  2. python操作email

    python操作email 参考链接: python官网imaplib: https://docs.python.org/2/library/imaplib.html Python 用IMAP接收邮件 ...

  3. 使用python调用email模块发送邮件附件

    使用python调用email模块实现附件发送 需要模块: import datetime import time import sys import mimetypes import smtplib ...

  4. 使用python的email、smtplib、poplib模块收发邮件

    使用python的email.smtplib.poplib模块收发邮件 一封电子邮件的旅程是: MUA:Mail User Agent——邮件用户代理.(即类似Outlook的电子邮件软件) MTA: ...

  5. Python 发送 email 的两种方式

    Python发送email的两种方式,分别为使用登录邮件服务器.调用sendmail命令来发送三种方法 Python发送email比较简单,可以通过登录邮件服务来发送,linux下也可以使用调用sen ...

  6. python smtplib email

    监控系统需要触发报警邮件, 简单笔记一下的用到的库. smtplib class smtplib.SMTP([host[, port[, local_hostname[, timeout]]]]) 返 ...

  7. 第一个 Python 程序 - Email Manager Demo

    看了一些基础的 Python 新手教程后,深深感觉到 Python 的简洁与强大,这是我的第一个 Python Demo.下面是完整代码与执行截图. 代码: # encoding: utf-8 ''' ...

  8. python send email

    #!/usr/bin/python # -*- coding: UTF-8 -*- # coding:utf8 from smtplib import SMTP_SSL from email.head ...

  9. python的email、smtplib、poplib模块收发邮件

    一封电子邮件的旅程是: MUA:Mail User Agent--邮件用户代理.(即类似Outlook的电子邮件软件) MTA:Mail Transfer Agent--邮件传输代理,就是那些Emai ...

随机推荐

  1. LeetCode:字符串相加【415】

    LeetCode:字符串相加[415] 题目描述 给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和. 注意: num1 和num2 的长度都小于 5100.num1 和num2 都只 ...

  2. 阿里云盾AliYunDun服务IO超高

    停止阿里云盾AliYunDun服务解决大量写磁盘问题-小内存ECS服务器 阿里云数据库在没备案,涉及大量IO操作时会自动启动阿里云盾这个服务,会导致服务器变得很卡,一直持续百分之99,一顿重启没有什么 ...

  3. nvm安装、解决nvm command not found问题、卸载

    安装 nvm是node的包版本管理工具,github地址如下:nvm 安装命令 1 curl -o- https://raw.githubusercontent.com/creationix/nvm/ ...

  4. Graphviz(02) 汉字subgraph不显示汉字的处理

    1.按照官方教程设置 2.如果还不显示,在不显示的汉字前面加上一个“空格”,汉字就会正常显示. digraph idp_modules{ rankdir = TB; fontname = " ...

  5. 【ARM-Linux开发】Ubuntu下的/usr目录权限,导致不能使用sudo命令的修复

    刚开始运行sudo时,报了下面这个错误 sudo: must be setuid root,于是上网找解决方法,搜索出来的都是这样解决的 ls -l  /usr/bin/sudochown root: ...

  6. 如何配置STP

    一.搭建本次实验的拓扑结构 两台s5700交换机模拟核心交换,两台s3700交换机模拟接入交换机,核心上配置eth-trunk   二.开启所有交换机的stp功能 开启stp [S1]stp enab ...

  7. Java基础之(四)HashMap(jdk10)

    JDK1.7以前的HashMap jdk1.7中,当冲突时,在冲突的地址上生成一个链表,将冲突的元素的key,通过equals进行比较,相同即覆盖,不同则添加到链表上,此时如果链表过长,效率就会大大降 ...

  8. 完全卸载MySQL服务

    1.控制面板——>所有控制面板项——>程序和功能,卸载mysql server! 2.删除MySQL文件,尤其是ProgramData里面的隐藏文件MySQL,我当时没有删除,重新安装My ...

  9. [转帖]中兴GoldenDB数据库开始了第一轮中信银行核心业务系统迁移落地

    中兴GoldenDB数据库开始了第一轮中信银行核心业务系统迁移落地 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https:// ...

  10. Django框架深入了解_02(DRF之序列化、反序列化)

    序列化:将Python对象准换成json格式的字符串,反之即为反序列化 DRF的序列化使用过程: 使用drf的序列化组件 -1 新建一个序列化类继承Serializer -2 在类中写要序列化的字段 ...