Python 发送邮件

67次阅读

共计 2797 个字符,预计需要花费 7 分钟才能阅读完成。

程序人员对于邮件自动化的日常需求还是很高的。但是入过了 Linux 的命令行邮件客户端如 Sendmail, Mutt, Alpine 等坑之后,发现现代其实很少人真的在用它们实现邮件自动化,根据搜索引擎里相关文章的数量就可知一二。取而代之的是,现代都在用 Python 或 PHP 等编程语言直接实现。Python 更是自带一套模块实现邮件发送。
先上示例代码,之后再详解。
注:全部代码在 Python3 环境下测试通过,正常使用,正常显示,无需任何外置模块。
参考:菜鸟教程 – Python SMTP 发送邮件参考:简单三步,用 Python 发邮件
发送 HTML 格式的漂亮邮件
import smtplib
from email.mime.text import MIMEText

# Settings of sender’s server
host = ‘smtp.aliyun.com’
sender = ‘Jason@aliyun.com’
user = ‘Jason@aliyun.com’
password = input(‘Please type your password: ‘)
to = [‘Jason@outlook.com’]

# Content of email
subject = ‘Python send html email test’
with open(‘./test.html’, ‘r’) as f:
content = f.read()

# Settings of the email string
email = MIMEText(content,’html’,’utf-8′)
email[‘Subject’] = subject
email[‘From’] = sender
email[‘To’] = to[0]
msg = email.as_string()

# Login the sender’s server
print(‘Logging with server…’)
smtpObj = smtplib.SMTP()
smtpObj.connect(host, 25)
smtpObj.login(user, password)
print(‘Login successful.’)

# Send email
smtpObj.sendmail(sender, to, msg)
smtpObj.quit()
print(‘Email has been sent’)
发送带附件的邮件
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.image import MIMEImage

# Settings of sender’s server
host = ‘smtp.aliyun.com’
sender = ‘Jason@aliyun.com’
user = ‘Jason@aliyun.com’
password = input(‘Please type your password: ‘)
to = [‘Jason@outlook.com’]

# Make content of email
subject = ‘Python send email with attachments’
with open(‘./test.html’, ‘r’) as f:
content = MIMEText(f.read(),’html’,’utf-8′)
content[‘Content-Type’] = ‘text/html’
print(‘Loaded content.’)

# Make txt attachment
with open(‘./txt.md’, ‘r’) as f:
txt = MIMEText(f.read(),’plain’,’utf-8′)
txt[‘Content-Type’] = ‘application/octet-stream’
txt[‘Content-Disposition’] = ‘attachment;filename=”txt.md”‘
print(‘Loaded txt attachment file.’)

# Make image attachment
with open(‘./pic.png’, ‘rb’) as f:
img = MIMEImage(f.read())
img[‘Content-Type’] = ‘application/octet-stream’
img[‘Content-Disposition’] = ‘attachment;filename=”pic.png”‘
print(‘Loaded image attachment file.’)

# Attach content & attachments to email
email = MIMEMultipart()
email.attach(content)
email.attach(txt)
email.attach(img)

# Settings of the email string
email[‘Subject’] = subject
email[‘From’] = sender
email[‘To’] = to[0]
msg = email.as_string()

# Login the sender’s server
print(‘Logging with server…’)
smtpObj = smtplib.SMTP()
smtpObj.connect(host, 25)
smtpObj.login(user, password)
print(‘Login successful.’)

# Send email
smtpObj.sendmail(sender, to, msg)
smtpObj.quit()
print(‘Email has been sent’)
发送邮件大杀器:Yagmail
之所以放在最后,是相衬托出传统的发送邮件是多繁琐多麻烦,实际上我们需要的只是超级简单的东西。Yagmail 正是为了实现这个而生的,一句话就可以完成所有的登录、发送文字、HTML、附件等功能。
参考 Github:yagmail — Yet Another GMAIL/SMTP client
一句话发送邮件:
yagmail.SMTP(‘username’).send(‘to@a.com’, ‘Subject’, ‘This is the body’)
正常一点的发送邮件:
import yagmail

yag = yagmail.SMTP(‘user’, ‘password’, host=’server.com’, port=’123′)
contents = [
‘This is the body, and here is just text http://somedomain/image.png’,
‘You can find a file attached.’,
‘./dataset/pic.jpg’
]
yag.send(‘solomonxie@outlook.com’, ‘yagmail tst’, contents)

正文完
 0

python发送邮件

67次阅读

共计 2442 个字符,预计需要花费 7 分钟才能阅读完成。

QQ 邮箱传输协议

SMTP:简单邮件传输协议(由源地址到目的地址的传输规则)
smtp.qq.com:QQ 邮箱服务器
默认端口:25
生成第三方登录 QQ 邮箱的密钥,这样从第三方登录 QQ 邮箱,不能输入密码,只需要输入第三方密钥就行

需要使用到的库

smtplib:主要是负责发送邮件,连接邮箱服务器,登录邮箱
email:构造邮件,邮件显示的内容,收件人,发件人

import smtplib
from email.mime.text import MIMEText # 发送文本
from email.mime.image import MIMEImage # 发送图片
from email.mime.multipart import MIMEMultipart # 将多个对象结合起来
from email.utils import formataddr
from email.header import Header
发送邮件简单代码
sender_from = ‘604421385@qq.com’ # 发件人邮箱
sender_to=’icessun@qq.com’ # 收件人邮箱

# 定义一个函数,接收传入的邮件主题,邮件内容为参数
def send_email(eamil_subject:str,email_content:str)->int:
try:
# 构造邮件的内容 plain: 表示发送的是文本;HTML:表示发送的超文本
message = MIMEText(email_content, ‘plain’, ‘utf-8’)
# 主题
message[‘Subject’] = Header(eamil_subject, ‘utf-8’)
message[‘From’] = formataddr([‘icessun’, sender_from])
message[‘To’] = formataddr([‘604421385’, sender_to])

# 构造发送邮件的对象 smtp,实例化 SMTP()
smtp = smtplib.SMTP()
# 连接邮箱服务器 host 和 port
smtp.connect(‘smtp.qq.com’, 25) # 可以简写 smtp=smtplib.SMTP(‘smtp.qq.com’,25)
# 登陆邮箱 第二个参数是 qq 邮箱授权码
smtp.login(sender_from, ‘xxxxxxxx’)
# 发送方,接收方(可以有多个 [‘ 接收地址 1 ’,’ 接收地址 2 ’,….]),发送的消息(字符串类型,使用邮件格式)
# message.as_string() 将 MIMEText 对象变为 str
smtp.sendmail(sender_from, sender_to, message.as_string())
# 退出邮箱, 结束 SMTP 会话
smtp.quit()
return 0
except:
return -1

email 中的 MIMEText
plain:表示发送的文本,基本的
# 构造邮件的内容 plain: 表示发送的是文本;HTML:表示发送的超文本
email_content = ‘ 这是发送的文本消息 ’
message = MIMEText(email_content, ‘plain’, ‘utf-8′)
html:表示发送的超文本

base64:表示添加附件
# 打开文件所在的位置
send_file=open(r’F:\password.txt’).read() # 二进制文件
message = MIMEText(send_file, ‘base64’, ‘utf-8’)
message[‘Content-Type’] = ‘application/octet-stream’
# 内容展示的方式:attachment,中文名字显示不成功 aaa.txt 英文才能正常显示
# message[‘Content-Disposition’] = ‘attachment;filename=”aaa.txt”‘
message.add_header(‘Content-Disposition’,’attachment’,filename=’aaaa.txt’)

email 中的 Header 和 formataddr
发送的邮件发送方和接收方全部使用 Header;不会显示具体的发件人和收件人的邮箱地址
message[‘From’] = Header(‘python’,’utf-8′)
message[‘To’] = Header(‘ 参数 ’, ‘utf-8’)

发送的邮件发送方和接收方全部使用 formataddr;显示具体的发件人和收件人的邮箱地址,和为其设置的别名
# 默认字符编码为 utf-8,第一个参数传入列表 [发件人的名字,邮箱地址]
message[‘From’] = formataddr([‘hhhh’, sender_from])
message[‘To’] = formataddr([‘604421385’, sender_to])

email 中的 MIMEMultipart

mixed:邮件包含附件,向上兼容
related:邮件正文包含图片,声音等内嵌资源
alternative:邮件只是纯文本,超文本

message = MIMEMultipart(‘mixed’)

# 然后把 邮件的 Subject From To 添加到 message 中
message[‘Subject’] = Header(email_subject,’utf-8′)
message[‘From’] = formataddr([‘test’,sender_from])
message[‘To’] = formataddr([‘ 接收者 ’,sender_to])
将其他文本添加到 Multipart 中
message.attach(text_plain) # MIMEText 对象
message.attach(text_html) # 超文本
message.attach(text_att) # 附件
message.attach(image) # MIMEImage 对象
发送邮件的多功能代码:

发送文本
发送图片
发送超文本
发送附件

代码地址回复:QQ 邮箱 获取

正文完
 0