如何使用代码发送SMTP邮件?

702 阅读3分钟

1. 发送纯文本邮件

import smtplib
from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr

def _format_addr(s):
    name, addr = parseaddr(s)
    return formataddr((Header(name, 'utf-8').encode(), addr))

from_addr = "发件人邮箱"	 # 发件人地址
Password = "邮箱密码"	 # 密码
to_addr = '收件人邮箱'	 # 收件人地址	
Cc_mail = ['抄送人邮箱1', '抄送人邮箱2']		# 抄送人
smtp_server = 'IMAP.partner.outlook.cn'		# smtp服务器地址(此为outlook邮箱服务器地址)
message = MIMEText('你学会了吗?\n', 'plain', 'utf-8')	 	 # 正文
message['From'] = _format_addr('发件人名称 <%s>' % from_addr)	 # 发件人信息
message['To'] = _format_addr('收件人名称 <%s>' % to_addr)         # 收件人信息
message['Cc'] = ','.join(Cc_mail)				 # 抄送人信息
message['Subject'] = Header('快点使用起来吧!', 'utf-8').encode()  # 主题

try:
    server = smtplib.SMTP(smtp_server, 587) #587 为对应端口号
    server.set_debuglevel(1)
    server.ehlo()
    server.starttls()
    server.login(from_addr, Password)
    server.sendmail(from_addr, [to_addr]+Cc_mail, message.as_string())
    server.quit()
    print("邮件发送成功")
except smtplib.SMTPException:
    print("Error: 无法发送邮件")

2.发送HTML图片邮件(图片显示在正文)

from email import encoders
from email.header import Header
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email.utils import parseaddr, formataddr
from email.mime.multipart import MIMEMultipart
import smtplib

def _format_addr(s):
    name, addr = parseaddr(s)
    return formataddr((Header(name, 'utf-8').encode(), addr))

from_addr = "发件人邮箱"			        # 发件人地址
Password = "邮箱密码"				# 密码
to_addr = '收件人邮箱'				# 收件人地址	
Cc_mail = ['抄送人邮箱1', '抄送人邮箱2']		# 抄送人
smtp_server = 'IMAP.partner.outlook.cn'		# smtp服务器地址(此为outlook邮箱服务器地址)
message = MIMEMultipart('alternative')		# 发送附件

# html格式构造
html = """
    <html> 
      <head></head> 
      <body> 
          <p>
           <br>这里是正文,正文下方就是照片啦!</br>
           <br><img src="cid:image1"></br> 
          </p>
      </body> 
    </html> 
    """
message.attach(MIMEText(html, 'html', 'utf-8'))

# 添加一个附件至邮件正文,就是加上MIMEBASE,从本地读取一张图片,如此路径:C:\\Users\\lenovo\\Desktop\\1.png
with open('C:\\Users\\lenovo\\Desktop\\1.png', 'rb') as f:
    mime = MIMEBase('image', 'png', filename='1.png')	# 设置附件的MIME和文件名:
    mime.add_header('Content-Disposition', 'attachment', filename='1.png')	# 加上必要的头信息
    mime.add_header('Content-ID', '<0>')
    mime.add_header('X-Attachment-Id', '0')   
    mime.set_payload(f.read())			# 把附件内容读进来  
    encoders.encode_base64(mime)		# 用base64编码
    mime.add_header('Content-ID', '<image1>')	# 添加到MIMEMultipart
    message.attach(mime)

message['From'] = _format_addr(from_addr)	# 发件人信息
message['To'] = _format_addr(to_addr)		# 收件人信息
message['Cc'] = ','.join(Cc_mail)		# 抄送人信息
message['Subject'] = Header('图文皆在正文中', 'utf-8').encode()	# 主题

try:
    server = smtplib.SMTP(smtp_server, 587)		# 587 为对应端口号,根据实际情况填写
    server.set_debuglevel(1)
    server.ehlo()
    server.starttls()
    server.login(from_addr, password)
    server.sendmail(from_addr, [to_addr]+Cc_mail, message.as_string())
    server.quit()
    print("邮件发送成功")
except smtplib.SMTPException:
    print("Error: 无法发送邮件")

3. 发送附件邮件(图片附件+文档附件)

from email import encoders
from email.header import Header
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email.utils import parseaddr, formataddr
from email.mime.multipart import MIMEMultipart
import smtplib

def _format_addr(s):
    name, addr = parseaddr(s)
    return formataddr((Header(name, 'utf-8').encode(), addr))

from_addr = "发件人邮箱"			# 发件人地址
Password = "邮箱密码"			# 密码
to_addr = '收件人邮箱'			# 收件人地址	
Cc_mail = ['抄送人邮箱1', '抄送人邮箱2']	# 抄送人
smtp_server = 'IMAP.partner.outlook.cn'	# smtp服务器地址(此为outlook邮箱服务器地址)

message.attach(MIMEText('这里写正文内容\n', 'plain', 'utf-8'))	# 正文
message = MIMEMultipart('alternative')		                # 发送附件

# 添加一个附件至正文,就是加上MIMEBASE,从本地读取一张图片,如此路径:C:\\Users\\lenovo\\Desktop\\1.png
with open('C:\\Users\\lenovo\\Desktop\\1.png', 'rb') as f:
    mime = MIMEBase('image', 'png', filename='1.png')	    # 设置附件的MIME和文件名:
    mime.add_header('Content-Disposition', 'attachment', filename='DataImage.png')    # 加上必要的头信息
    mime.add_header('Content-ID', '<0>')
    mime.add_header('X-Attachment-Id', '0')
    mime.set_payload(f.read())    		# 把附件内容读进来
    encoders.encode_base64(mime)    		# 用base64编码
    mime.add_header('Content-ID', '<image1>')   # 添加到MIMEMultipart
    message.attach(mime)

# 添加一个附件,就是加上MIMEBASE,从本地读取一个文档
with open('C:\\Users\\lenovo\\Desktop\\1.docx', 'rb') as f:
    mime = MIMEBase('file', 'docx', filename='1.docx')    # 设置附件的MIME和文件名
    mime.add_header('Content-Disposition', 'attachment', filename='1.docx')    # 加上必要的头信息
    mime.add_header('Content-ID', '<0>')
    mime.add_header('X-Attachment-Id', '0')
    mime.set_payload(f.read())      # 把附件内容读进来
    encoders.encode_base64(mime)    # 用base64编码
    message.attach(mime)

message['From'] = _format_addr('发件人名称 <%s>' % from_addr)	# 发件人信息
message['To'] = _format_addr('收件人名称<%s>' % to_addr)		# 收件人信息
message['Cc'] = ','.join(Cc_mail)				# 抄送人信息
message['Subject'] = Header('正文+图片附件+文档附件', 'utf-8').encode()	  # 主题

try:
    server = smtplib.SMTP(smtp_server, 587)
    server.set_debuglevel(1)
    server.ehlo()
    server.starttls()
    server.login(from_addr, password)
    server.sendmail(from_addr, [to_addr]+Cc_mail, message.as_string())
    server.quit()
    print("邮件发送成功")
except smtplib.SMTPException:
    print("Error: 无法发送邮件")