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

2023-05-16

一、邮件发送流程

 

       邮件的发送是主动行为:主要通过 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 = "dianjin@datax.credit.lycc.qihoo.net"
        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 = """
            <table border="1">
                  <tr>
                    <th>小时</th>
                    <th>商品名字</th>
                    <th>商品链接</th>
                    <th>商品价格</th>
                    <th>竞品品牌</th>
                    <th>竞品价格</th>
                    <th>价格差距</th>
                  </tr>
                  <tr>
                    <td>January</td>
                    <td>$100</td>
                    <td>20190301</td>
                    <td>January</td>
                    <td>$100</td>
                    <td>20190301</td>
                    <td>20190301</td>
                  </tr>
            </table>
            """
    msg_content="test msg content"
    # 发带附件的邮件
    # Email.sendmail("test subject", mail_msg=msg_content,mailto_list= ["username@xxx.net"],mailcc_list= ["username@126.com"],in_attachment_name="jd.py")
    # 发不带附件的邮件
    Email.sendmail("test subject", mail_msg=msg_content,mailto_list= ["username@xxx.net"],mailcc_list= ["username@126.com"])

四、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 = "work_for_job@126.com"
        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='work_for_job@126.com'
    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 = """
            <table border="1">
                  <tr>
                    <th>小时</th>
                    <th>商品名字</th>
                    <th>商品链接</th>
                    <th>商品价格</th>
                    <th>竞品品牌</th>
                    <th>竞品价格</th>
                    <th>价格差距</th>
                  </tr>
                  <tr>
                    <td>January</td>
                    <td>$100</td>
                    <td>20190301</td>
                    <td>January</td>
                    <td>$100</td>
                    <td>20190301</td>
                    <td>20190301</td>
                  </tr>
            </table>
            """
     msg_content="test msg content"
    # 发带附件的邮件
    # Email.sendmail("test subject", mail_msg=msg_content,mailto_list= ["username@xxx.net"],mailcc_list= ["username@126.com"],in_attachment_name="jd.py")
    # 发不带附件的邮件
    Email.sendmail("test subject", mail_msg=msg_content,mailto_list= ["username@xxx.net"],mailcc_list= ["username@126.com"])

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

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

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

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

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协议收发邮件

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python smtplib.SMTP()和smtplib.SMTP_SSL() 登录邮箱并发送邮件比较 的相关文章

  • 电脑连WIFI网速慢,手机却很快

    问题 xff1a 在同一个位置 xff0c 电脑连上wifi速度特别慢 xff0c 手机连wifi速度却很快 把电脑搬到路由器附近发现电脑的速度也很快了 xff0c 说明之前是因为电脑接收信号有问题 怎么解决呢 xff1f 我的一种解决方法
  • mac日历显示国家节假日及补班日期

    mac日历显示国家节假日及补班日期 先上效果图订阅链接订阅方法 先上效果图 系统日历页面简洁 而且目前支持节假日 农历显示 只是少了放假与补班的标识 为了区分节假日与补班的颜色 整了两个ics文件 所以得订阅两个链接 如果你不想区分颜色就把
  • 【QT】error: LNK1104: 无法打开文件“release\xxxxx.exe”报错解决方案

    一 问题重述 出现这种报错一般是程序运行之后存在空指针问题 xff0c 然后直接崩溃掉 xff0c 下一次调试的时候就出现这种报错 如下图所示 xff1a 二 原因分析 出现这种情况是因为上次运行之后 xff0c 程序的exe文件异常退出了
  • linux下编译clang, libc++, libc++abi,以及第二遍自举编译

    最新的mint16 xff0c 附带gcc4 8 1 第一步 xff1a 用gcc编译clang 1 下载llvm 43 clang最新版本 具体见http clang llvm org get started html 2 mkdir b
  • 安卓获取手机唯一设备号

    感谢该作者提供的方法 http blog csdn net langzi7758521 article details 52575724 之前项目都是获取imei码 xff0c 遇到的麻烦就是要权限或者某些机器 xff0c 返回垃圾数据 现
  • ubuntu系统下载地址

    ubuntu官方下载地址 http releases ubuntu com ubuntu国内常用地址 xff1a http mirrors ustc edu cn ubuntu releases Windows官方下载地址 https ww
  • 学习笔记必备软件:OneNote+ Mindmaster完美搭配使用

    做笔记有两个关键点 xff1a 一是笔记内容详略得当 二是知识的框架清晰完整 为什么这样说 xff1f 举个例子 xff0c 如图是我的笔记界面 xff0c 用的是免费的OneNote xff0c OneNote是微软出的笔记软件 xff0
  • 高中生的高效学习法之“纵横术”

    考试的时候 xff0c 你或许遇经常遇到这种情况 xff1a 面对考试题 xff0c 你冥思苦想这个题是哪一章的知识点 xff0c 到底想要考什么 xff1f 或许你知道这个题考的是什么 xff0c 但是由于你对这部分知识掌握不牢而导致还是
  • 学习必备软件:OneNote+Mindmaster完美结合(精彩内容持续更新中…….)

    一 为什么做笔记 xff1f 做笔记应该注意哪些方面 xff1f 1 为什么做笔记 xff1f 做笔记的意义体现在以下几个方面 xff1a xff08 1 xff09 抵抗忘记 根据艾宾浩斯遗忘曲线 xff0c 前一天记住的信息 xff0c
  • 关于数学建模(或科研论文)的画图学习建议

    对于数学建模画图来说 xff0c PPT xff0c visio matlab就够用了 xff0c 其他根据特点备选 首先搞清楚 xff0c 我们需要画的图主要分为两种 xff1a 一是 示意图 xff0c 主要是用于表达思路 xff0c
  • Linux 网桥配置br-lan、eth0、eth1、ra0、rai0

    Linux网关模式下将有线LAN和无线LAN共享网段实现局域网内互联 思路其实很简单 xff1a 就是将虚拟出一个bridge口 xff0c 将对应的有线LAN和无线LAN都绑定在这个虚拟bridge口上 xff0c 并给这个bridge口
  • 用java -jar 命令执行架包时出现了Invalid or corrupt jarfile xxxx.jar

    将一个 java文件打包 jar后 xff0c 需要在META INF目录下的MANIFEST ME中添加Main Class选项 使用命令java jar xxxx jar后出现了Invalid or corrupt jarfile xx
  • 如何用Stata完成(shui)一篇经济学论文(三):基本命令

    目录 变量的生成 gen与egen区别 xff09 变量的删除变量的更改 在开始正式学习前 xff0c 有一个小建议 xff0c 希望大家养成在do file里写代码的习惯 xff0c 主要是方便保存已经写过的代码 xff0c 因为Stat
  • 阿里云服务器ECS入门题库

    Apsara Clouder云计算专项技能认证 xff1a 云服务器ECS入门题库 题库一多选题题库二多选题题库三多选题 保证及格 xff0c 不保证100分 xff01 xff01 xff01 保证及格 xff0c 不保证100分 xff
  • mysql 设置大小写不敏感

    一 原理与参数 mysql大小写敏感配置与两个参数相关 lower case file system 和 lower case table names 查看当前mysql的大小写敏感配置 show global variables like
  • mysql字符集查看与设置

    一 查看 MySQL 字符集 以下命令 Windows amp Linux通用 1 服务器和数据库 mysql gt show variables like 39 char 39 43 43 43 Variable name Value 4
  • WindTerm使用(暂停更新)

    作为一个经常和代码以及服务器打交道的人 xff0c 连接远程服务器所使用的工具肯定是越方便越好 目前 xff0c 我使用的是xshell5和MobaXterm两个 Xshell最新的是7 xff0c 破解版的我懒得去找 xff0c 那xsh
  • 彻底解决[未识别的网络][公共网络]的问题

    未识别的网络 导致网络变成 未知网络 或 公共网络 会造成一系列问题 比如防火墙的一些端口会挡在公共之外 等等 不细说 那么要如何把 未知网络 公用网络 怎么改变为 家庭 和 工作网络 网络的回答比如 百度问题上的回答都是无脑的回答 不可能
  • centos7安装Docker详细步骤(无坑版教程)

    一 安装前必读 在安装 Docker 之前 xff0c 先说一下配置 xff0c 我这里是Centos7 Linux 内核 xff1a 官方建议 3 10 以上 xff0c 3 8以上貌似也可 注意 xff1a 本文的命令使用的是 root
  • windows通过xrdp实现远程ubuntu

    首先声明 xff1a 我使用的是root用户 xff0c 所以无视权限问题 第一步 安装vncserver wget http www c nergy be downloads tigervncserver 1 6 80 4 amd64 z

随机推荐

  • 【Vue2+Vue3】开发指令使用总结,未完待续

    目录 一 watch监听及深度监听 二 directive自定义指令详解 43 实例 三 1 vue父子组件 xff1a 数据双向绑定 一 数据双向绑定 sync xff08 支持多个双向绑定值 xff09 三 2 父子组件间方法的调用 1
  • 南京大学数字电路与计算机组成实验的Verilator仿真(二)

    实验二 1 2 4译码器 top v module span class token function decode24 span span class token punctuation span x span class token p
  • firefox 的cookie 存放在哪里?

    在地址栏输入about surpport 打开配置页 找到about profiles 点击打开 看到有两个目录项 看准正在使用的那一个 34 正在使用此配置文件 34 找到cookie sqlite 的位置 正在使用的那个配置是删不掉的
  • C++ 构造函数和New运算符

    算法和数据结构就是编程的一个重要部分 xff0c 你若失掉了算法和数据结构 xff0c 你就把一切都失掉了 系统会自动在栈中为每个变量开辟内存空间 xff0c 以保证数值被合理地存放 由于栈是系统自动分配的 xff0c 因此速度较快 xff
  • matlab函数interp2及其c++代码

    最近将一个matlab程序转为c 途中遇到interp2这个家伙 我是左查右查 发现网上没有人总结这个玩意 于是我来初探一下 还是别有洞天的 嘿嘿 1 关于interp2 nbsp nbsp Vq interp2 X Y V Xq Yq l
  • CentOS 7中利用Snapper快照进行系统备份与恢复

    为什么要使用Snapper快照 xff1f 我们可以想像以下场景 xff1a 1 场景一 xff1a 系统发生意外宕机 xff0c 工程师无法快速定位问题 xff0c 业务受到中断 xff0c 客户十分不满意 2 场景二 xff1a 项目会
  • 计蒜之道 作弊揭发者(测试赛)

    鉴于我市拥堵的交通状况 xff0c 市政交管部门经过听证决定在道路两侧安置自动停车收费系统 当车辆驶入车位 xff0c 系统会通过配有的摄像头拍摄车辆画面 xff0c 通过识别车牌上的数字 字母序列识别车牌 xff0c 通过连接车管所车辆信
  • 7-10 兔子繁衍问题

    7 10 兔子繁衍问题 xff08 15 分 xff09 一对兔子 xff0c 从出生后第3个月起每个月都生一对兔子 小兔子长到第3个月后每个月又生一对兔子 假如兔子都不死 xff0c 请问第1个月出生的一对兔子 xff0c 至少需要繁衍到
  • Ubuntu运行tkinter程序的部署

    软件部署 xff08 Ubuntu系统 xff09 1 安装python环境 前提需要有网 ubuntu会自带python xff0c 不用单独安装 xff0c 但python的pip工具和tkinter包需要安装 xff08 1 xff0
  • Linux-用shell脚本写一个进度条

    shell执行脚本 xff1a 创建一个 sh文件 xff0c 编辑文件即可执行脚本 Shell脚本中用 表示注释 xff0c 相当于c语言的 注释 但如果 位于第一行开头 xff0c 并且是则例外 xff0c 它表示该脚本使用后面指定的解
  • S3C2440裸机按键控制小灯

    1 环境 1 操作系统 xff1a win7 64位 2 集成开发环境 xff1a keil4 7 3 开发板 xff1a FL2440 4 下载器 xff1a Jlink V9 2 按键以及LED灯原理图 根据FL2440开发板原理图可知
  • 数组存邻接表

    模板 xff1a 数组表示邻接表 int top 61 0 向 点中存第top个边 int head MAX N 61 1 每个点在建立邻接表时 xff0c 栈顶的边的编号 边的结构体 struct Edge int v 另一端连接的点 i
  • windows远程桌面到Ubuntu

    环境 xff1a VMware 43 Ubuntu18 04 方案 xff1a xrdp 43 gnome ubuntu xff08 不要安装xubuntu xff0c 费力不讨好 xff09 自己分步安装有时会遇到配置困难 xff0c 建
  • 系列一、NotePad++离线安装NppFTP插件

    一 下载离线插件 链接 xff1a https pan baidu com s 16EEGYOTKkMP bB8LcnwpsQ pwd 61 yyds 提取码 xff1a yyds 二 解压自己NotePad 43 43 对应版本 xff0
  • Ubuntu18 AMD和ARM版本的源的区别

    Ubuntu18 AMD和ARM版本的源的区别 文章目录 Ubuntu18 AMD和ARM版本的源的区别AMD版本ARM版本主要区别 之前因为懒没有仔细研究ubuntu AMD和ARM版本系统apt源的区别 xff0c 导致今天换源时候走了
  • 【C51】基于C51单片机的定时闹钟(含代码,电路,拿走即可用)

    基于C51单片机的定时闹钟 上电后设置定时时间 xff0c 按键1选择设置的是小时分钟还是秒钟 按键2对其进行具体的数字设置 一次选择完成之后就默认进入计时模式 达到计时时间后响铃 按键3可以关闭响铃 代码 span class token
  • 解决Centos7.9图形界面root用户登录报“sorry, that didn‘t work please try again”问题

    一 问题描述 xff1a 新装的Centos7 9 在图形界面以root身份进行登录时报 sorry that didn t work please try again xff0c 如下图所示 xff1a 经确认 xff0c root密码是
  • ubuntu 安装QT 5.0出现错误:Failed to load platform plugin "xcb".

    当你安装QT 5 0 时 xff0c 启动的时候会出现如下错误 xff1a Failed to load platform plugin 34 xcb 34 Available platforms are linuxfb minimal x
  • 获取Android设备的序列号(SN号)

    方法 xff08 一 xff09 通过反射获取sn号 public static String getDeviceSN String serial 61 null try Class lt gt c 61 Class forName 34
  • Python smtplib.SMTP()和smtplib.SMTP_SSL() 登录邮箱并发送邮件比较

    一 邮件发送流程 邮件的发送是主动行为 xff1a 主要通过 MUA 邮件客户端软件 xff0c 将邮件内容发送给对应的服务器 暂存到投递服务区 xff0c 然后由当前运营商根据邮件特征信息将邮件转发给目标服务器的投递服 务区 xff0c