成功使用Python发送一封邮件

Python smtolib库

import smtplib
#引入smtplib模块
server = smtplib.SMTP()
#SMTP (Simple Mail Transfer Protocol)翻译过来是“简单邮件传输协议”的意思,
#SMTP 协议是由源服务器到目的地服务器传送邮件的一组规则
server.connect(host, port)#连接(connect)指定的服务器
#我们需要通过SMTP指定一个服务器,这样才能把邮件送到另一个服务器。
server.login(username, password) 
server.sendmail(sender, to_addr, msg.as_string()) 
server.quit() 
  • host是指定连接的邮箱服务器,你可以指定服务器的域名。通过搜索“xx邮箱服务器地址”,就可以找到。在这里插入图片描述在这里插入图片描述

  • port 是“端口”的意思。端口属于计算机网络知识里的内容,你可以自行搜索了解,现在我们只要知道它是一个【整数】即可。

我们需要指定SMTP服务使用的端口号,一般情况下SMTP默认端口号为25。网络查询网易邮箱的SMTP设置
在这里插入图片描述

得到host和port这两个参数。(网易邮箱一般默认关闭SMTP服务,我们得先去开启它。授权码记得写好)

import smtplib

server = smtp.SMTP()
server.connect('smtp.163.com',465)

成功解决报错smtplib.SMTPServerDisconnected: Connection unexpectedly closed

>>> server.connect('smtp.163.com',465)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/warmtree/anaconda3/lib/python3.7/smtplib.py", line 338, in connect
    (code, msg) = self.getreply()
  File "/home/warmtree/anaconda3/lib/python3.7/smtplib.py", line 394, in getreply
    raise SMTPServerDisconnected("Connection unexpectedly closed")
smtplib.SMTPServerDisconnected: Connection unexpectedly closed

由于我们没有使用默认端口25,

server = smtplib.SMTP_SSL()
#如果端口是用SSL加密,请这样写代码。其中server是变量名
server.connect('smtp.163.com',465,'utf-8')

成功解决报错ValueError: server_hostname cannot be an empty string or start with a leading dot.

here
python 3.7 修改了 ssl.py 导致了 smtplib.SMTP_SSL 的问题,如果按照原来的写法会报错。

server=smtplib.SMTP_SSL(host='smtp.gmail.com').connect(host='smtp.gmail.com', port=465)
username = '[email protected]'
password = '你的授权码数字'

server.login(username, password)

整体的模块是这样的:

# smtplib 用于邮件的发信动作
import smtplib

# 发信方的信息:发信邮箱,QQ邮箱授权码
from_addr = '[email protected]'
password = '你的授权码数字'

# 收信方邮箱
to_addr = '[email protected]'

# 发信服务器
smtp_server = 'smtp.qq.com'

# 开启发信服务,这里使用的是加密传输
server = smtplib.SMTP_SSL()
server.connect(smtp_server,465)
# 登录发信邮箱
server.login(from_addr, password)
# 发送邮件
server.sendmail(from_addr, to_addr, msg.as_string())
# 关闭服务器
server.quit()

Python email 包

from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart

这就要谈到“模块”和“包”的区别了,模块(module)一般是一个文件,而包(package)是一个目录,一个包中可以包含很多个模块,可以说包是“模块打包”组成的。
但为什么看到那个空文件,就能知道email是包呢?这是因为Python中的包都必须默认包含一个init.py的文件。
init.py控制着包的导入行为。假如这个文件为空,那么我们仅仅导入包的话,就什么都做不了。所以直接import email是行不通的
所以,我们就需要使用from … import …语句,从email包目录下的【某个文件】引入【需要的对象】。比如从email包下的text文件中引入MIMEText方法。

from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart

# MIMEText(msg,type,chartset)
# msg:文本内容,可自定义
# type:文本类型,默认为plain(纯文本)
# chartset:文本编码,中文为“utf-8”
msg = MIMEText('send by python','plain','utf-8')

在这里插入图片描述

扫描二维码关注公众号,回复: 12361146 查看本文章
import smtplib
#引入smtplib模块
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
#从email包下的text文件中引入

username='[email protected]'
password=input('please enter the password:')

from_addr = '[email protected]'
to_addr = '[email protected]'

smtp_server='smtp.gmail.com'

# MIMEText(msg,type,chartset)
# msg:文本内容,可自定义
# type:文本类型,默认为plain(纯文本)
# chartset:文本编码,中文为“utf-8”
msg = MIMEText('send by python','plain','utf-8')

'''
server = smtplib.SMTP_SSL(host=smtp_server)
#SMTP (Simple Mail Transfer Protocol)翻译过来是“简单邮件传输协议”的意思,
#SMTP 协议是由源服务器到目的地服务器传送邮件的一组规则
server.connect(host=smtp_server, port=465)#连接(connect)指定的服务器
'''
server = smtplib.SMTP(smtp_server)
server.connect(host=smtp_server, port=25)
#我们需要通过SMTP指定一个服务器,这样才能把邮件送到另一个服务器。
print('连接(connect)指定的服务器')
server.starttls()
server.login(username, password) 
print('finish the password')
server.sendmail(from_addr, to_addr, msg.as_string()) 
print('have sent the emaiL')
#server.sendmail(sender, to_addr, msg.as_string()) 
#from_addr:邮件发送者地址。 
#to_addr:邮件收件人地址。
#msg.as_string():为一个字符串类型 
server.quit() 
print('successfully')

成功解决问题TimeoutError: [Errno 110] Connection timed out

由于网易邮箱比较严格,我们需要表头发件人都写上。

import smtplib
#引入smtplib模块
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
#从email包下的text文件中引入
from email.header import Header

username='@163.com'
password=input('please enter the password:')

from_addr = '@163.com'
to_addr = '@163.com'

smtp_server='smtp.gmail.com'

# MIMEText(msg,type,chartset)
# msg:文本内容,可自定义
# type:文本类型,默认为plain(纯文本)
# chartset:文本编码,中文为“utf-8”
msg = MIMEText('send by python','plain','utf-8')
# 邮件头信息
msg['From'] = Header(from_addr)
msg['To'] = Header(to_addr)
msg['Subject'] = Header('python test')

server = smtplib.SMTP_SSL()
#server = smtplib.SMTP_SSL(host=smtp_server)
#SMTP (Simple Mail Transfer Protocol)翻译过来是“简单邮件传输协议”的意思,
#SMTP 协议是由源服务器到目的地服务器传送邮件的一组规则
server.connect(host=smtp_server, port=465)#连接(connect)指定的服务器
'''
server = smtplib.SMTP(smtp_server)
server.connect(host=smtp_server, port=25)
'''
#我们需要通过SMTP指定一个服务器,这样才能把邮件送到另一个服务器。
print('连接(connect)指定的服务器')
server.starttls()
server.login(username, password) 
print('finish the password')
server.sendmail(from_addr, to_addr, msg.as_string()) 
print('have sent the emaiL')
#server.sendmail(sender, to_addr, msg.as_string()) 
#from_addr:邮件发送者地址。 
#to_addr:邮件收件人地址。
#msg.as_string():为一个字符串类型 
server.quit() 
print('successfully')


报错原因是因为我们错误设置了服务器smtp_server='smtp.gmail.com'改成smtp_server='smtp.163.com'

如果想要发送很长的内容,建议先设置一个变量text用来放正文内容。这样更方便省事。

成功解决smtplib.SMTPResponseException: (454, b’Command not permitted when TLS active’)

删除代码中的server.starttls() 即可

server.starttls() 
#smtplib.SMTPException: No suitable authentication method found

群发邮件

最后,群发邮件的模板:

import smtplib
# smtplib 用于邮件的发信动作
from email.mime.text import MIMEText
# email 用于构建邮件内容
from email.header import Header
# 用于构建邮件头
import csv
# 引用csv模块,用于读取邮箱信息

# 发信方的信息:发信邮箱,QQ邮箱授权码
# 方便起见,你也可以直接赋值
from_addr = input('请输入登录邮箱:')
password = input('请输入邮箱授权码:')

# 发信服务器
smtp_server = 'smtp.qq.com'

# 邮件内容
text='''我的挚友哦,最近过得怎么样?
		记得常常联系哇!
'''

# 待写入csv文件的收件人数据:人名+邮箱
# 记得替换成你要发送的名字和邮箱
data = [['niannian ', '[email protected]'],['feifei', '[email protected]']]

# 写入收件人数据
with open('to_addrs.csv', 'w', newline='') as f:
    writer = csv.writer(f)
    for row in data:
        writer.writerow(row)

# 读取收件人数据,并启动写信和发信流程
with open('to_addrs.csv', 'r') as f:
    reader = csv.reader(f)
    for row in reader: 
        to_addrs=row[1]
        msg = MIMEText(text,'plain','utf-8')
        msg['From'] = Header(from_addr)
        msg['To'] = Header(to_addrs)
        msg['Subject'] = Header('python test')
        server = smtplib.SMTP_SSL()
        server.connect(smtp_server,465)
        server.login(from_addr, password)
        server.sendmail(from_addr, to_addrs, msg.as_string())

# 关闭服务器
server.quit()

最后附上完整代码:

import smtplib
#引入smtplib模块
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
#从email包下的text文件中引入
from email.header import Header

username='@163.com'
password=input('please enter the password:')

from_addr = '@163.com'
to_addr = '@163.com'

smtp_server='smtp.163.com'

# MIMEText(msg,type,chartset)
# msg:文本内容,可自定义
# type:文本类型,默认为plain(纯文本)
# chartset:文本编码,中文为“utf-8”
msg = MIMEText('send by python','plain','utf-8')
# 邮件头信息
msg['From'] = Header(from_addr)
#msg['To'] = Header(to_addr)
msg['To'] = Header(','.join(to_addr))
msg['Subject'] = Header('python test')

server = smtplib.SMTP_SSL(smtp_server)
#server = smtplib.SMTP_SSL(host=smtp_server)
#SMTP (Simple Mail Transfer Protocol)翻译过来是“简单邮件传输协议”的意思,
#SMTP 协议是由源服务器到目的地服务器传送邮件的一组规则
server.connect(smtp_server, 465)#连接(connect)指定的服务器
'''
server = smtplib.SMTP(smtp_server)
server.connect(host=smtp_server, port=25)
'''
#我们需要通过SMTP指定一个服务器,这样才能把邮件送到另一个服务器。
print('连接(connect)指定的服务器')
#server.starttls() #smtplib.SMTPException: No suitable authentication method found
server.login(username, password) 
print('finish the password')
server.sendmail(from_addr, to_addr, msg.as_string()) 
print('have sent the emaiL')
#server.sendmail(sender, to_addr, msg.as_string()) 
#from_addr:邮件发送者地址。 
#to_addr:邮件收件人地址。
#msg.as_string():为一个字符串类型 
server.quit() 
print('successfully')


猜你喜欢

转载自blog.csdn.net/weixin_44991673/article/details/110277298