python发送邮件(带附件)
程序员文章站
2024-03-23 17:42:22
...
1.发送纯文本
from email import encoders
from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr
import smtplib
def _format_addr(s):
name, addr = parseaddr(s) #parseaddr 用来解析字符串中的email地址
return formataddr((Header(name, 'utf-8').encode(), addr)) #将email地址转为utf-8(防止中文乱码)
from_addr = input('From: ') #从哪个邮件发
password = input('Password: ') #指的是smtp授权的密码,不是登录密码
to_addr = input('To: ') #发送给谁(接收邮箱)
smtp_server = input('SMTP server: ')#如从163邮箱发,就写smtp.163.com,qq邮箱就写smtp.qq.com
msg = MIMEText('hello, world', 'plain', 'utf-8') #文本内容
msg['From'] = _format_addr('小明 <%s>' % from_addr)
msg['To'] = _format_addr('你的同伙 <%s>' % to_addr)
msg['Subject'] = Header('你的事发了..', 'utf-8').encode()
server = smtplib.SMTP(smtp_server, 25) #邮箱默认端口25
server.set_debuglevel(1) #set_debuglevel(1)就可以打印出和SMTP服务器交互的所有信息
server.login(from_addr, password) #登录
server.sendmail(from_addr, [to_addr], msg.as_string()) #发送
server.quit() #退出
结果:
2.带附件
from email import encoders
from email.header import Header
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email.utils import parseaddr, formataddr
import smtplib
def _format_addr(s):
name, addr = parseaddr(s)
return formataddr((Header(name, 'utf-8').encode(), addr))
#from_addr = input('From: ')
#password = input('Password: ')
#to_addr = input('To: ')
#smtp_server = input('SMTP server: ')
from_addr='1833***[email protected]'
password='*****'
to_addr='2396**[email protected]'
smtp_server='smtp.163.com'
# 邮件对象:
msg = MIMEMultipart()
msg['From'] = _format_addr('小明 <%s>' % from_addr)
msg['To'] = _format_addr('你的同伙 <%s>' % to_addr)
msg['Subject'] = Header('你的事发了...', 'utf-8').encode()
# 邮件正文是MIMEText:
msg.attach(MIMEText('给你发了一张你梦寐以求的图片', 'plain', 'utf-8'))
# 添加附件就是加上一个MIMEBase,从本地读取一个图片:
with open('''D:\\py\\www\\img\\android-icon.png''', 'rb') as f:
# 设置附件的MIME和文件名,这里是png类型:
mime = MIMEBase('image', 'png', filename='android-icon.png')
# 加上必要的头信息:
mime.add_header('Content-Disposition', 'attachment', filename='android-icon.png')
mime.add_header('Content-ID', '<0>')
mime.add_header('X-Attachment-Id', '0')
# 把附件的内容读进来:
mime.set_payload(f.read())
# 用Base64编码:
encoders.encode_base64(mime)
# 添加到MIMEMultipart:
msg.attach(mime)
server = smtplib.SMTP(smtp_server, 25)
server.set_debuglevel(1)
server.login(from_addr, password)
server.sendmail(from_addr, [to_addr], msg.as_string())
server.quit()
可能会出现的问题:
1).如果提示534还是什么的错误,可能是邮箱密码写错了,要写smtp授权的密码,而不是登录密码
2).如果卡死在send...这里不动了,可能是附件太大了,f.read()一次性读不出来,可以换个小点的附件试试
3.正文中带图片
直接在HTML邮件中链接图片地址行不行?答案是,大部分邮件服务商都会自动屏蔽带有外链的图片,因为不知道这些链接是否指向恶意网站。要把图片嵌入到邮件正文中,我们只需按照发送附件的方式,先把邮件作为附件添加进去,然后,在HTML中通过引用src="cid:0"就可以把附件作为图片嵌入了。如果有多个图片,给它们依次编号,然后引用不同的cid:x即可。
from email import encoders
from email.header import Header
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email.utils import parseaddr, formataddr
import smtplib
def _format_addr(s):
name, addr = parseaddr(s)
return formataddr((Header(name, 'utf-8').encode(), addr))
#from_addr = input('From: ')
#password = input('Password: ')
#to_addr = input('To: ')
#smtp_server = input('SMTP server: ')
from_addr='183***[email protected]'
password='*****'
to_addr='23***[email protected]'
smtp_server='smtp.163.com'
# 邮件对象:
msg = MIMEMultipart()
msg['From'] = _format_addr('小明 <%s>' % from_addr)
msg['To'] = _format_addr('你的同伙 <%s>' % to_addr)
msg['Subject'] = Header('你的事发了', 'utf-8').encode()
msg['Reply-to']='[email protected]'
# 邮件正文是MIMEText:
msg.attach(MIMEText('''
<html>
<body>
<h3>hello world</h3>
<p><img src="cid:0" /></p>
</body>
</html>
''', 'html', 'utf-8'))
# 添加附件就是加上一个MIMEBase,从本地读取一个图片:
with open('''D:\\py\\www\\img\\android-icon.png''', 'rb') as f:
# 设置附件的MIME和文件名,这里是png类型:
mime = MIMEBase('image', 'png', filename='android-icon.png')
# 加上必要的头信息:
mime.add_header('Content-Disposition', 'attachment', filename='android-icon.png')
mime.add_header('Content-ID', '<0>')
mime.add_header('X-Attachment-Id', '0')
# 把附件的内容读进来:
mime.set_payload(f.read())
# 用Base64编码:
encoders.encode_base64(mime)
# 添加到MIMEMultipart:
msg.attach(mime)
server = smtplib.SMTP(smtp_server, 25)
server.set_debuglevel(1)
server.login(from_addr, password)
server.sendmail(from_addr, [to_addr], msg.as_string())
server.quit()
这样就可以把图片嵌套到内容里面了,而且接收者并不会接收到附件,只会显示图片
上一篇: chache的作用