python发送邮件(带附件)

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***295@163.com'
password='*****'
to_addr='2396**790@qq.com'
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***295@163.com'
password='*****'
to_addr='23***790@qq.com'
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']='2532542343@qq.com'
# 邮件正文是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()

这样就可以把图片嵌套到内容里面了,而且接收者并不会接收到附件,只会显示图片

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值