代理发送邮件_用python定时发送邮件

一、 用python实现邮件发送

用程序实现邮件收发的三个角色:
MUA (mail user agent, 邮件用户代理)
MTA (mail transfer agent, 邮件传输代理)
MDA (mail delivery agent, 邮件投递代理)

发邮件:MUA → MTA【使用SMTP协议】
收邮件:MUA ← MDA 【使用POP3/IMAP4协议】

(一)用到的模块

【1. email】

(1) email.mime:

email.mime.text.MIMEText(_text, _subtype=‘plain’, _charset=None, *, policy=compat32)

类MIMEText用来生成一个主要类型为text的MIME对象。

(2) email.utils.parseaddr(address)
email.utils.formataddr((name_encoded_by_Header, address))

写邮件的时候,Email的地址可以有两种写法。一种写法是:xxx@qq.com,另一种写法是:name。用前者写法,在邮箱中就会显示为xxx;用后者,就会显示为name,更为清晰、专业。有的时候,用前者写法也会显示name,是因为对方邮箱中保存了这个地址,类似于对方手机中保存了手机号和姓名而parseaddr函数就是将str “name”转换成一个tuple。

In[48]: a = parseaddr('name')In[49]: aOut[49]: ('name', 'xxx@126.com')In[50]: type(a)Out[50]: tupleIn[53]: name, addr = parseaddr('boy')In[54]: nameOut[54]: 'boy'In[55]: addrOut[55]: 'xxx@126.com'

解析出name和address后,需要用formataddr()函数将其变为标准的email地址。注意:formataddr()接收的name需要经Header()进行编码处理后才行。【注1】

from email.header import HeaderIn[67]: name, addr = parseaddr('boy')In[68]: a = formataddr((name, addr)) # 将name直接传入In[69]: b = formataddr((Header(name, 'utf-8').encode(), addr)) # 将name用Header()编码处理后传入In[70]: aOut[70]: 'boy 'In[71]: bOut[71]: '=?utf-8?q?boy?= ' #下文msg[’From‘]和msg['To']只识别这种格式 12345678

构建邮件正文:

from email.mime.text import MIMETextfrom email.header import Headerfrom email.utils import parseaddr, formataddr# 编写一个进行地址解析、生成标准地址格式的函数def _format_addr(s):    name, addr = parseaddr(s)    return formataddr((Header(name, 'utf-8').encode(), addr))# 设置邮件内容msg = MIMEText('This is an email for testing.', 'plain', 'utf-8') # 设置邮件收发件人名称、主题等'''收发件人名称、主题,不是通过SMTP发送给MTA的,而是包含在发送给MTA的文本中(msg)。'''msg['From'] = _format_addr('发件人名 ' % '发件人邮箱'msg['To'] = _format_addr('收件人名 ' % '收件人邮箱' #msg['From']和msg['To']直接使用formataddr后的字符串,如果有多个这样的字符串地址,用逗号(,)分开。msg['Subject'] = Header('TEST', 'utf-8').encode() # 此处,主题也经过了Header的编码处理

【2. smtplib】

在使用email构建好邮件正文后,用smtplib来发送邮件。

smtplib.SMTP()函数,设置服务器地址和端口号

smtplib.SMTP(host='', port=0, local_hostname=None, [timeout, ]source_address=None)

常用邮箱的服务器(SMTP/POP3)地址和端口总结
163.com:
POP3服务器地址:pop.163.com(端口:110)
SMTP服务器地址:smtp.163.com(端口:25)
126邮箱:
POP3服务器地址:pop.126.com(端口:110)
SMTP服务器地址:smtp.126.com(端口:25)
139邮箱:
POP3服务器地址:POP.139.com(端口:110)
SMTP服务器地址:SMTP.139.com(端口:25)
QQ邮箱:
POP3服务器地址:pop.qq.com(端口:110)
SMTP服务器地址:smtp.qq.com (端口:25)
QQ企业邮箱 :
POP3服务器地址:pop.exmail.qq.com (SSL启用 端口:995)
SMTP服务器地址:smtp.exmail.qq.com(SSL启用 端口:587/465)
gmail(google.com) :
POP3服务器地址:pop.gmail.com(SSL启用 端口:995)
SMTP服务器地址:smtp.gmail.com(SSL启用 端口:587)
Foxmail:
POP3服务器地址:POP.foxmail.com(端口:110)
SMTP服务器地址:SMTP.foxmail.com(端口:25)
sina.com:
POP3服务器地址:pop3.sina.com.cn(端口:110)
SMTP服务器地址:smtp.sina.com.cn(端口:25)

设置发送参数:

from_addr = 'xxx@126.com'password = 'GJZDZMUF' # 密码或邮箱授权码to_addr = 'xxx@foxmail.com'smtp_server = 'smtp.126.com'server = smtplib.SMTP(smtp_server, 25) # 设置服务器和端口号server.set_debuglevel(1) # 打印出和SMTP服务器交互的所有信息,如果没有这一语句,将不打印任何信息server.login(from_addr, password) # 进行登录server.sendmail(from_addr, [to_addr], msg.as_string()) # 1. msg.as_string()把MIMEText对象变成str(包含utf-8编码信息和Base64编码)# 2. [to_addr]表示可以有多个收件人。多个收件人,传入list。当然,也可以在前面to_addr处直接用list进行赋值,那么此处就不是传入[to_addr],而是传入to_addr了server.quit()1234567891011

二、定时

待续。

三、遇到的错误

【注1】实际操作时,如果传入未被Header编码处理的name,发送邮件时暂未发现报错(英文与中文皆是)。因此此处待进一步验证。

d19f5507a6a126f3bd099448e42a17ba.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要现定时运行 Python 脚本并发送邮件,可以使用 Python 的第三方库 schedule 和 smtplib。 首先,安装这两个库: ```python pip install schedule ``` ```python pip install secure-smtplib ``` 接下来,编写 Python 脚本,实现定时发送邮件的功能: ```python import schedule import time import smtplib from email.mime.text import MIMEText from email.header import Header # 定义发送邮件的函数 def send_email(): # 邮件内容 mail_content = '这是一封测试邮件' # 发送方信息 sender = '发送方邮箱' password = '发送方邮箱密码' # 接收方信息 receivers = ['接收方邮箱'] # 邮件标题和内容 message = MIMEText(mail_content, 'plain', 'utf-8') message['From'] = Header(sender) message['To'] = Header(','.join(receivers)) message['Subject'] = Header('测试邮件') # 发送邮件 try: smtp_obj = smtplib.SMTP_SSL('smtp.qq.com', 465) smtp_obj.login(sender, password) smtp_obj.sendmail(sender, receivers, message.as_string()) print('邮件发送成功') except smtplib.SMTPException as e: print('邮件发送失败', e) # 定义定时任务 def job(): print('开始发送邮件...') send_email() # 设置定时任务,每隔一定时间执行一次 schedule.every(10).minutes.do(job) # 每隔10分钟执行一次 # schedule.every().hour.do(job) # 每小时执行一次 # schedule.every().day.at('10:30').do(job) # 每天10:30执行一次 # 循环执行定时任务 while True: schedule.run_pending() time.sleep(1) ``` 在上述代码中,`send_email()` 函数定义了如何发送邮件,而 `job()` 函数则定义了定时任务的具体内容。在这里,我们将每隔10分钟执行一次 `job()` 函数,可以根据自己的需要设置定时任务的时间间隔。 最后,在命令行中运行该 Python 脚本即可。注意,为了保证邮件能够正常发送,需要在发送方邮箱的设置中开启 SMTP 服务,并且在代码中填写正确的发送方邮箱和密码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值