欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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() #退出

结果:

python发送邮件(带附件)

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的作用

下一篇: