Python || 发送邮件

使用Python的stmplibemail发送邮件:

一、纯文本邮件

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

#=========================================
#格式化email的头部信息,不然会出错,当做垃圾邮件
#=========================================
def _format_addr(s):
    name, addr = parseaddr(s)
    return formataddr((Header(name, 'utf-8').encode(), addr))

from_addr = "your email"
password = "密码或者授权码"
to_addr = "target email"
smtp_server = "smtp.163.com"

#======================================
#注意添加Subject、To和From三个字段
#======================================
msg = MIMEText('hello, send by Python...', 'plain', 'utf-8')
msg['From'] = _format_addr('Tracy的Python <%s>' % from_addr)
msg['To'] = _format_addr('You <%s>' % to_addr)
msg['Subject'] = Header('来自SMTP……', 'utf-8').encode()

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()

二、HTML邮件

只需要在构造MIMEText时,传入HTML字符串,并且将第二个参数设置为html即可。

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

#=========================================
#格式化email的头部信息,不然会出错,当做垃圾邮件
#=========================================
def _format_addr(s):
    name, addr = parseaddr(s)
    return formataddr((Header(name, 'utf-8').encode(), addr))

from_addr = "your email"
password = "密码或者授权码"
to_addr = "target email"
smtp_server = "smtp.163.com"

#==========================================================
#注意添加Subject、To和From三个字段,更换字符串,改变第二个参数即可
#==========================================================
msg = MIMEText("<html><body><h1>Hello</h1>"+ 
"<p>send by <a href='http://www.baidu.com/'>Python</a>" + 
"</body></html>", 'html', 'utf-8')
msg['From'] = _format_addr('Tracy的Python <%s>' % from_addr)
msg['To'] = _format_addr('You <%s>' % to_addr)
msg['Subject'] = Header('来自SMTP……', 'utf-8').encode()

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()

三、发送带附件的邮件

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

#=========================================
#格式化email的头部信息,不然会出错,当做垃圾邮件
#=========================================
def _format_addr(s):
    name, addr = parseaddr(s)
    return formataddr((Header(name, 'utf-8').encode(), addr))

from_addr = "your email"
password = "密码或者授权码"
to_addr = "target email"
smtp_server = "smtp.163.com"

#======================================================
#带附件的邮件可以看做包含若干部分的邮件:文本和各个附件本身,
#所以,可以构造一个MIMEMultipart对象代表邮件本身,
#然后往里面加上一个MIMEText作为邮件正文,
#再继续往里面加上表示附件的MIMEBase对象即可。
#=====================================================
# 邮件对象:
msg = MIMEMultipart()
msg['From'] = _format_addr('Python爱好者 <%s>' % from_addr)
msg['To'] = _format_addr('管理员 <%s>' % to_addr)
msg['Subject'] = Header('来自SMTP的问候……', 'utf-8').encode()

# 邮件正文是MIMEText:
msg.attach(MIMEText('send with file...', 'plain', 'utf-8'))

# 添加附件就是加上一个MIMEBase,从本地读取一个图片:
with open('/Users/michael/Downloads/test.png', 'rb') as f:
    # 设置附件的MIME和文件名,这里是png类型:
    mime = MIMEBase('image', 'png', filename='test.png')
    # 加上必要的头信息:
    mime.add_header('Content-Disposition', 'attachment', filename='test.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()

4、搬运

#=========================================================================
# 加密SMTP
#
# 使用标准的25端口连接SMTP服务器时,使用的是明文传输,发送邮件的整个过程可能会被窃听。
#要更安全地发送邮件,可以加密SMTP会话,实际上就是先创建SSL安全连接,
#然后再使用SMTP协议发送邮件。网易163的STMP服务SSL端口号为465/994  
#=========================================================================

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

import smtplib

# return Alias_name <xxxx@example.com>


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

# 接收参数: 发件人地址
from_addr = ''

# 接收参数: 客户端授权密码
passwd = ''

# 接收参数: 收件人地址,可多个
to_addrs = ["abc@qq.com"]

# 接收参数: SMTP服务器(注意:是发件人的smtp服务器)
smtp_server = 'smtp.163.com'


# 接收参数: 邮件主题
subject = '人生苦短'

# 接收参数: 邮件正文
plain = '我用python!'

# 带附件邮件
# 指定subtype为alternative,同时支持html和plain格式
msg = MIMEMultipart('alternative')
# 邮件正文中显示图片,同时附件的图片将不再显示
# plain = 'Hello world and hello me!'
msg.attach(MIMEText(str(plain), 'plain', 'utf-8'))       # 纯文本
# html = '<html><body><h1>Hello</h1><p>![](cid:0)</p></body></html>'
# msg.attach(MIMEText(html, 'html', 'utf-8'))         # HTML
# 添加附件:即关联一个MIMEBase,图片为本地读取
with open('/home/kyxy/Desktop/dota.png', 'rb') as f:
    # 设置附件中的MIME和文件名
    mime = MIMEBase('image', 'jpeg', filename='dota.png')
    # 加上必要的头信息
    mime.add_header('Content-Disposition', 'attachment',
                    filename='dota.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)

# 未指定用户别名,则客户端会自动提取邮件地址中的名称作为邮件的用户别名
msg['From'] = _format_addr(from_addr)
# msg['To'] = _format_addr(to_addrs)
msg['To'] = '%s' % ','.join([_format_addr('<%s>' % to_addr)
                             for to_addr in to_addrs])
msg['Subject'] = Header(str(subject), 'utf-8').encode()
msg['Date'] = formatdate()


#=========================================================================
# 发送邮件
#=========================================================================
try:
    # SMTP服务器设置(地址,端口):
    server = smtplib.SMTP_SSL(smtp_server, 465)
    # server.set_debuglevel(1)
    # 连接SMTP服务器(发件人地址, 客户端授权密码)
    server.login(from_addr, passwd)

    # 发送邮件
    server.sendmail(from_addr, to_addrs, msg.as_string())

    print('邮件发送成功')

except smtplib.SMTPException as e:
    print(e)
    print('邮件发送失败')

finally:
    # 退出SMTP服务器
    server.quit()
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容

  • 简单邮件传输协议(SMTP)是一种协议,用于在邮件服务器之间发送电子邮件和路由电子邮件。 Python提供smtp...
    易百教程阅读 43,706评论 4 62
  • 背景 公司内网有个论坛,各种公司的前沿消息都会有人在讨论。一忙起来,经常忘记逛论坛,所以写了个爬虫,爬取论坛前10...
    aialin阅读 914评论 0 11
  • python发送邮件 准备 python中发送邮件主要用的是smtplib和email两个模块,下面主要对这两个模...
    爱撒谎的男孩阅读 491评论 0 2
  • Django 官方文档 发送email 官网地址:[https://docs.djangoproject.com/...
    学以致用123阅读 2,244评论 0 2
  • 有人说领导力就是能动口时不动手;有人说领导力就是粉丝力量,用自己的行为和修养的影响力去影响别人,让其成为你的粉丝;...
    茉莉雅利阅读 279评论 0 1