程序人员对于邮件自动化
的日常需求还是很高的。但是入过了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 = '[email protected]'
user = '[email protected]'
password = input('Please type your password: ')
to = ['[email protected]']
# 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 = '[email protected]'
user = '[email protected]'
password = input('Please type your password: ')
to = ['[email protected]']
# 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('[email protected]', '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('[email protected]', 'yagmail tst', contents)