您的位置:首页 > 大数据 > 人工智能

python发邮件smtplib+mail

2017-11-28 01:49 701 查看
python3.6中mail不是内置模块,所以需要手动安装,用下面的命令:

pip3 install mail却总是报错:

Command “python setup.py egg_info” failed with error code 1 in /private/tmp/pip-build-gg3k8x43/email/

解决方法:百度进入pypi搜索:下载

https://pypi.python.org/packages/bb/35/0aa85e06fc14fe86d4064f18ad05254ebc649e81235faf96d591b02158e9/email-6.0.0a1.tar.gz

然后解压缩,进入目录python3 setup.py install即可

关于163邮件发送报报错535,550 Error:authentication failed解决方法。

我们使用python发送邮件时相当于自定义客户端根据用户名和密码登录,然后使用SMTP服务发送邮件,新注册的163邮箱是默认不开启客户端授权的,因此登录总是被拒绝,解决办法(以163邮箱为例):进入163邮箱-设置-客户端授权密码-开启(授权码是用于登录第三方邮件客户端的专用密码),非第三方登录密码不变。以163邮箱为例,在开启POP3/SMTP服务,并开启客户端授权密码时会设置授权码,将这个授权码代替smtplib.SMTP().login(user,password)方法中的password即可。

错误1:smtplib.SMTPAuthenticationError: (550, b’User has no permission’)

错误2:smtplib.SMTPAuthenticationError: (535, b’Error: authentication failed’)

一些常用邮箱发件服务器及端口号

邮箱 发件服务器 非SSL协议端口 SSL协议端口

163 smtp.163.com 25 465

qq smtp.qq.com 25 465

xl mail.xl.com 25 465

这个错误并不是所有邮箱都需要的;如我给公司内部用的邮箱就不需要。

python实现发邮件

1)python发邮件需要掌握两个模块的用法,smtplib和email;smtplib模块主要负责发送邮件:是一个发送邮件的动作,连接邮箱服务器,登录邮箱,发送邮件(有发件人,收信人,邮件内容);email模块主要负责构造邮件:指的是邮箱页面显示的一些构造,如发件人,收件人,主题,正文,附件等。

2)smtplib模块

(1)smtp = smtplib.SMTP(host[, 25])或者smtplib.SMTP_SSL(host, 465)

host:为指定连接的邮箱服务器,为字符串类型,

如:

163网易邮箱:smtp.163.com

公司内部邮箱:mail.xxxxx.com

qq邮箱:smtp.qq.com

注意:163、公司内部邮箱用25和465端口均可以发送邮件(SMTP对应25,可以省略;SMTP_SSL对应465不可以省略),而qq只能用smtplib.SMTP_SSL(host, 465)发送!

(3)smtp.login(username, password)

username:登录邮箱的用户名。

password:若为网易邮箱,或者qq邮箱则只能用相应的授权码,默认是关闭的,开启时在相应的网页邮箱设置处可以设置授权码,此授权码会随着密码的变更失效,那时需要重新获取。qq的pop和imap的授权码不同,但测试均可使用。

(4)smtp.sendmail(sender, receiver, msg.as_string())

from_addr:邮件发送者地址,字符串类型;

receiver:若为单个地址直接用字符串表示,若收件人有多个,则用字符串列表:[‘接收地址1’,’接收地址2’,’接收地址3’,…]

msg.as_string():为一个字符串类型

(5)smtp.quit()

用于结束SMTP会话。

所以,用以上几步就可以实现一个邮件的发送,但发送的邮件无发件人,无主题,只有一个简单的msg.as_string()字符串作为内容。若需要添加各种附件等还需要email模块配合

3)email模块

email模块下有mime包(Multipurpose Internet Mail Extensions),即多用途互联网邮件扩展,是目前互联网电子邮件普遍遵循的邮件技术规范;

该mime包下常用的有三个模块:text,image,multpart

导入方法如下:

from email.mime.multipart import MIMEMultipart

from email.mime.text import MIMEText

from email.mime.image import MIMEImage

MIMEText对象:文本邮件对象

MIMEImage对象:表示一个作为附件的图片

MIMEMultipart对象:把多个对象组合起来

MIMEBase对象:可表示任何对象

Message对象:邮件对象

(1)MIMEText对象说明

邮件发送程序为了防止有些邮件阅读软件不能显示处理HTML格式的数据,通常都会用两类型分别为”text/plain”和”text/html”

MIMEText(text, _subtype=’plain’, _charset=None, *, policy=None)

第一个参数为邮件正文,第二个参数默认为plain(纯文本的普通文件),还可以指定为”html”,最后一定要用utf-8编码保证多语言兼容性。

a)添加普通文本(指定编码为utf-8所以可以为中文)

text = “Hi,All:\n How are you?\n我爱python”

text_plain = MIMEText(text,’plain’, ‘utf-8’)

b)添加html文本(可已有中文)



c)添加附件



这里的filename为要重命名显示的文件名,这里的方法附件名可以为中文,注意中间的那个空字符串不能省略。

2)添加图片MIMEImage(直接显示图片内容)



3)multpart说明

常见的multipart类型有下面三种:

multipart/alternative的邮件包括text/plain和text/html

multipart/related:邮件正文中包括图片,声音等内嵌资源

multipart/mixed:包含附件

注意:向上兼容,如果一个邮件有纯文本正文,超文本正文,内嵌资源,附件,则选择mixed类型。

msg = MIMEMultipart(‘mixed’),一开始就要设置msg对象,然后文本、图片、附件等用msg.attach(text_att/image)等附加。

我们必须把Subject,From,To,Date添加到MIMEText对象或者MIMEMultipart对象中,邮件中才会显示主题,发件人,收件人,时间(若无时间,就默认一般为当前时间,该值一般不设置)。

subject = ‘欢迎加入XX大家庭’

msg = MIMEMultipart(‘mixed’)

msg[‘Subject’] = subject

msg[‘From’] = ‘你yanngpeng@xnlei.com yangbigpeng@xunei.com

msg[‘To’] = ‘好yanng@xunle.com’



说明:

msg.add_header(_name,_value,**_params):添加邮件头字段。

msg.as_string():是将msg(MIMEText对象或者MIMEMultipart对象)变为str,如果只有一个html超文本正文或者plain普通文本正文的话,一般msg的类型可以是MIMEText;如果是多个的话,就都添加到MIMEMultipart,msg类型就变为MIMEMultipart。

msg.attach(MIMEText对象或MIMEImage对象):将MIMEText对象或MIMEImage对象添加到MIMEMultipart对象中。MIMEMultipart对象代表邮件本身,MIMEText对象或MIMEImage对象代表邮件正文。

以上的构造的文本,超文本,附件,图片都何以添加到MIMEMultipart(‘mixed’)中:

msg.attach(text_plain)

msg.attach(text_html)

msg.attach(text_att)

msg.attach(image)

4)文字,html,图片,附件实现实例





内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python 邮件