Python smtplib.SMTP()和smtplib.SMTP_SSL() 登录邮箱并发送邮件比较

一、邮件发送流程

 

Python smtplib.SMTP()和smtplib.SMTP_SSL() 登录邮箱并发送邮件比较_第1张图片

       邮件的发送是主动行为:主要通过 MUA/邮件客户端软件,将邮件内容发送给对应的服务器 暂存到投递服务区,然后由当前运营商根据邮件特征信息将邮件转发给目标服务器的投递服 务区,此时目标用户的邮件已经发送完成,等待对方收取即可。

       邮件的收取也是主动行为,用户可以打开邮件客户端软件,通过点击类似于收取这样的行为 就可以从自己邮箱所属的服务器投递区中提取邮件了。

二、邮件发送协议介绍

什么是POPO3、SMTP和IMAP?服务器地址和端口是什么? 

2.1、POP3

      POP3是Post Office Protocol 3的简称,即邮局协议的第3个版本,它规定怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的电子协议。它是因特网电子邮件的第一个离 线协议标准,POP3允许用户从服务器上把邮件存储到本地主机(即自己的计算机)上,同时删除保存在邮件服务器上的邮件,而POP3服务器则是遵循 POP3协议的接收邮件服务器,用来接收电子邮件的。(与IMAP有什么区别?) 

2.2、SMTP

       SMTP 的全称是“Simple Mail Transfer Protocol”,即简单邮件传输协议。它是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。SMTP 服务器就是遵循 SMTP 协议的发送邮件服务器。 SMTP 认证,简单地说就是要求必须在提供了账户名和密码之后才可以登录 SMTP 服务器,这就使得那些垃圾邮件的散播者无可乘之机。 增加 SMTP 认证的目的是为了使用户避免受到垃圾邮件的侵扰。 

2.3、IMAP

IMAP全称是Internet Mail Access Protocol,即交互式邮件存取协议,它是跟POP3类似邮件访问标准协议之一。不同的是,开启了IMAP后,您在电子邮件客户端收取的邮件仍然保留 在服务器上,同时在客户端上的操作都会反馈到服务器上,如:删除邮件,标记已读等,服务器上的邮件也会做相应的动作。所以无论从浏览器登录邮箱或者客户端 软件登录邮箱,看到的邮件以及状态都是一致的。(与POP3有什么区别?) 

2.4、网易126邮箱的相关服务器信息

邮件服务器 | 服务器地址 | 端口

POP3服务器 | pop.126.com | 110

SMTP服务器 | smtp.126.com | 25

IMAP服务器 | imap.126.com | 143

参考:http://wap.126.com/xm/static/html/126_3.html

三、25端口开放的开发服务器报警程序代码

即对于端口25开放的开发服务器来说,以下代码就可以发送报表邮件或者报警邮件。

#!/usr/bin/python2.7
# -*- coding:utf-8 -*-
"""
File: Email.py
Author: yyz
Date: 2019/04/03 15:26
"""
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart

class Email:
    @staticmethod
    def sendmail_with_attachment(subject, mail_msg, mailto_list, mailcc_list, in_attachment_name):

        msg = MIMEMultipart()
        msg1 = MIMEText(mail_msg, 'html', 'utf-8')

        msg.attach(msg1)
        if in_attachment_name != "":
            # 构造附件2,传送当前目录下的 runoob.txt 文件
            att2 = MIMEText(open(in_attachment_name, 'rb').read(), 'base64', 'utf-8')
            att2["Content-Type"] = 'application/octet-stream'
            att2["Content-Disposition"] = 'attachment; filename=' + str(in_attachment_name.split("/")[-1]).encode('utf-8')
            msg.attach(att2)

        reciver = mailto_list + mailcc_list
        mailfrom = "[email protected]"
        msg["Subject"] = subject
        msg["From"] = mailfrom
        msg["To"] = ','.join(mailto_list)
        msg["Cc"] = ','.join(mailcc_list)
        s = smtplib.SMTP('localhost',port=25)
        s.sendmail(mailfrom, reciver, msg.as_string())
        print "success"
        s.quit()
    @staticmethod
    def sendmail(subject, mail_msg, mailto_list, mailcc_list):
        Email.sendmail_with_attachment(subject, mail_msg, mailto_list, mailcc_list,in_attachment_name="")


if __name__ == "__main__":
    msg_content = """
            
小时 商品名字 商品链接 商品价格 竞品品牌 竞品价格 价格差距
January $100 20190301 January $100 20190301 20190301
""" msg_content="test msg content" # 发带附件的邮件 # Email.sendmail("test subject", mail_msg=msg_content,mailto_list= ["[email protected]"],mailcc_list= ["[email protected]"],in_attachment_name="jd.py") # 发不带附件的邮件 Email.sendmail("test subject", mail_msg=msg_content,mailto_list= ["[email protected]"],mailcc_list= ["[email protected]"])

四、25端口被禁的开发服务器报警程序代码

但由于smtp的25端口容易收到攻击,所以对于某些云服务器,比如说阿里云上的开发机,25端口是被禁止的;此时应该采用其他可用的端口和协议来发送报表和报警邮件啦,如下代码:

SMTP发件服务器地址:smtp.163.com 安全:开(SSL/TLS) 端口号:465 / 994 
注: 1、126邮箱的SMTP服务器地址:smtp.126.com ,yeah邮箱的SMTP服务器地址:smtp.yeah.net;
      2、若安全选择关闭,请将端口号改为 25。


IMAP收件服务器地址:imap.163.com 安全:开(SSL/TLS) 端口号:993
注:1、126邮箱的IMAP服务器地址:imap.126.com ,yeah邮箱IMAP服务器地址:imap.yeah.net,其余部分与163一致;
      2、若安全选择关闭,请将端口号改为 143。

参考:http://wap.mail.163.com/xm/static/html/163_symbian_2.html

#!/usr/bin/python2.7
# -*- coding:utf-8 -*-
"""
File: Email.py
Author: yyz
Date: 2020/06/02 15:26
"""
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart

class Email:
    @staticmethod
    def sendmail_with_attachment(subject, mail_msg, mailto_list, mailcc_list, in_attachment_name):

        msg = MIMEMultipart()
        msg1 = MIMEText(mail_msg, 'html', 'utf-8')

        msg.attach(msg1)
        if in_attachment_name != "":
            # 构造附件2,传送当前目录下的 runoob.txt 文件
            att2 = MIMEText(open(in_attachment_name, 'rb').read(), 'base64', 'utf-8')
            att2["Content-Type"] = 'application/octet-stream'
            att2["Content-Disposition"] = 'attachment; filename=' + str(in_attachment_name.split("/")[-1]).encode('utf-8')
            msg.attach(att2)

        reciver = mailto_list + mailcc_list
        mailfrom = "[email protected]"
        msg["Subject"] = subject
        msg["From"] = mailfrom
        msg["To"] = ','.join(mailto_list)
        msg["Cc"] = ','.join(mailcc_list)
        
    #s = smtplib.SMTP('47.94.16.179',80)
    
    SMTP_SERVER='smtp.126.com'
    EMAIL_USER='[email protected]'
    EMAIL_PASS='xxxx'  # 填写邮箱授权码
    # 连接邮件服务器
    #s = smtplib.SMTP_SSL(SMTP_SERVER,465) # SMTP发件服务器地址:smtp.163.com 安全:开(SSL/TLS) 端口号:465 / 994 都可以
    s = smtplib.SMTP_SSL(SMTP_SERVER,994)
    # 设置信息展示级别
    s.set_debuglevel(1)
    # 登录邮箱服务器
    s.login(EMAIL_USER, EMAIL_PASS)

        s.sendmail(mailfrom, reciver, msg.as_string())
        print "success"
        s.quit()
    @staticmethod
    def sendmail(subject, mail_msg, mailto_list, mailcc_list):
        Email.sendmail_with_attachment(subject, mail_msg, mailto_list, mailcc_list,in_attachment_name="")


if __name__ == "__main__":
    msg_content = """
            
小时 商品名字 商品链接 商品价格 竞品品牌 竞品价格 价格差距
January $100 20190301 January $100 20190301 20190301
""" msg_content="test msg content" # 发带附件的邮件 # Email.sendmail("test subject", mail_msg=msg_content,mailto_list= ["[email protected]"],mailcc_list= ["[email protected]"],in_attachment_name="jd.py") # 发不带附件的邮件 Email.sendmail("test subject", mail_msg=msg_content,mailto_list= ["[email protected]"],mailcc_list= ["[email protected]"])

执行以上代码,能遇到下面问题:

4.1、问题一:报smtplib.SMTPAuthenticationError 505/535 的解决方法

Python smtplib.SMTP()和smtplib.SMTP_SSL() 登录邮箱并发送邮件比较_第2张图片

4.2、问题二:获取网易邮箱pop3/smtp服务授权密码示意图

网易126邮箱,成功开启POP3/SMTP服务,在第三方客户端登录时,登录密码输入以下授权密码。其授权码开启如下图所示:

Python smtplib.SMTP()和smtplib.SMTP_SSL() 登录邮箱并发送邮件比较_第3张图片

4.3、QQ邮箱如何设置POP3/SMTP的SSL加密方式?

使用SSL的通用配置如下:

接收邮件服务器:pop.qq.com,使用SSL,端口号995

发送邮件服务器:smtp.qq.com,使用SSL,端口号465或587

账户名:您的QQ邮箱账户名(如果您是VIP帐号或Foxmail帐号,账户名需要填写完整的邮件地址)

密码:您的QQ邮箱密码

电子邮件地址:您的QQ邮箱的完整邮件地址

参考:https://service.mail.qq.com/cgi-bin/help?subtype=1&&id=28&&no=369

4.4、腾讯企业邮箱如何设置IMAP、POP3/SMTP及其SSL加密方式?

如果您的电子邮件客户端支持SSL,可以在设置中选择使用SSL。
 
通用配置参数:
(我们已经默认都支持这些协议,用户无需自己手动开启这些服务器与端口)
 
POP3/SMTP协议
接收邮件服务器:pop.exmail.qq.com ,使用SSL,端口号995
发送邮件服务器:smtp.exmail.qq.com ,使用SSL,端口号465
海外用户可使用以下服务器
接收邮件服务器:hwpop.exmail.qq.com ,使用SSL,端口号995
发送邮件服务器:hwsmtp.exmail.qq.com ,使用SSL,端口号465
 
IMAP协议
接收邮件服务器:imap.exmail.qq.com  ,使用SSL,端口号993
发送邮件服务器:smtp.exmail.qq.com ,使用SSL,端口号465
海外用户可使用以下服务器
接收邮件服务器:hwimap.exmail.qq.com ,使用SSL,端口号993
发送邮件服务器:hwsmtp.exmail.qq.com ,使用SSL,端口号465
 
账户名:您的企业邮箱账户名,账户名需要填写完整的邮件地址
密码:您的企业邮箱密码
电子邮件地址:您的企业邮箱的完整邮件地址
 
使用SSL协议之前,请您先参考常用客户端的一般配置方式:
参考: https://service.exmail.qq.com/cgi-bin/help?subtype=1&id=28&no=1000585

参考:https://blog.csdn.net/Homewm/article/details/80103593

           Python使用POP3和SMTP协议收发邮件

你可能感兴趣的:(Python,smtp,python,运维,邮件服务)