Python中发邮件(明文/SSL/TLS三种方式)

我们公司的exchange,smtp使用587端口,关于smtpsever的配置就是

self.sender = smtplib.SMTP("smtp.gtland.cn", 587)

 而不是网上说的tls配置成

self.sender = smtplib.SMTP_SSL("smtp.gtland.cn", 587)

测试下邮箱的发送

for i in {huangshumao@gtland.cn,106140873@qq.com};do /etc/keepalived/send.py ${i} 'Keepalive 节点一恢复正常' '192.168.20.191已成为主机!'; done

 base64加密

#!/usr/bin/python2.7
# coding=utf-8
import base64
a = base64.b64encode('this is an example')
print a
print base64.b64decode(a)

记得chmod +x example-base64

./example-base64
dGhpcyBpcyBhbiBleGFtcGxl
this is an example

发送邮件脚本

#!/usr/bin/python2.7
# coding=utf-8
import smtplib,sys
import base64
from email.mime.text import MIMEText
from email.header import Header
class Msmtp():
    def __init__(self, target, subject, content):#收件人、标题、内容
        self.msg_from = '邮箱地址'
        self.password =  base64.b64decode('加密后的密码')
        self.sender = smtplib.SMTP("smtp服务器地址", 587)
#如https://blog.csdn.net/zyx_ly/article/details/88032283
#这个文章才是正确的很多文章tls都是配置587用SMTP_SSL
#公司的邮箱配置587是用smtplib.SMTP("smtp服务器地址", 587)
    # smtp = smtplib.SMTP_SSL(smtpHost, sslPort)
        self.msg_to = target
        self.subject = subject
        self.content = content

    def _login(self):
        self.sender.login(self.msg_from, self.password)

    def _msg(self):
        self.msg = MIMEText(self.content)
        self.msg['Subject'] = self.subject
        self.msg['From'] = self.msg_from
        self.msg['To'] = self.msg_to

    def send_mail(self):
        self.sender.set_debuglevel(1)
        self.sender.docmd("EHLO server")
        self.sender.starttls()
        #self.sender.docmd("AUTH LOGIN")

        self._login()
        self._msg()
        self.sender.sendmail(self.msg_from, self.msg_to, self.msg.as_string())
        self.sender.quit()

# email log 记录日志
#    with open('data.txt','w') as f:
    with open('/var/log/Email.log', 'a') as f:
        date=time.strftime("%y-%m-%d %H:%M:%S")
        str = date + "    " + sys.argv[1] +"    " + sys.argv[2] + "\r\n" + "\n"
#        str1 = str.decode('gbk').encode('utf-8')
#       print("%s" %str1)
#       f.write(str)
        print("%s" %str)
        f.write(str)



if __name__ == '__main__':
    a = Msmtp(sys.argv[1], sys.argv[2], sys.argv[3])
    a.send_mail()

 

发送邮箱开了debug模式,在命令行可以看到base64加密后的用户名和密码

下以是通用实例,请根据实际情况配置。 

# !/usr/bin/python
#  coding:utf-8
from email import encoders
from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr, formatdate
import smtplib
import sys
import importlib
 
 
# 设置默认字符集为UTF8 不然有些时候转码会出问题
default_encoding = 'utf-8'
if sys.getdefaultencoding() != default_encoding:
    importlib.reload(sys)
    sys.setdefaultencoding(default_encoding)
 
# 发送邮件的相关信息,根据你实际情况填写
smtpHost = 'smtp.qq.com'
smtpPort = '25'
sslPort = '587'
fromMail = 'zyx'
toMail = 'xxxxxxxxxxx@163.com'
username = 'xxxxxxxxxx@qq.com'
password = 'xxxxxxxxxxxxxxxx'
 
# 邮件标题和内容
subject = u'[Notice]hello'
body = u'hello,this is a mail from ' + fromMail
 
# 初始化邮件
encoding = 'utf-8'
mail = MIMEText(body.encode(encoding), 'plain', encoding)
mail['Subject'] = Header(subject, encoding)
mail['From'] = fromMail
mail['To'] = toMail
mail['Date'] = formatdate()
 
try:
    # 连接smtp服务器,明文/SSL/TLS三种方式,根据你使用的SMTP支持情况选择一种
 
    # 普通方式,通信过程不加密
    # smtp = smtplib.SMTP(smtpHost, smtpPort)
    # smtp.ehlo()
    # smtp.login(username, password)
 
    # tls加密方式,通信过程加密,邮件数据安全,使用正常的smtp端口
    smtp = smtplib.SMTP(smtpHost, smtpPort)
    smtp.set_debuglevel(True)
    smtp.ehlo()
    smtp.starttls()
    smtp.ehlo()
    smtp.login(username, password)
 
    # 纯粹的ssl加密方式,通信过程加密,邮件数据安全
    # smtp = smtplib.SMTP_SSL(smtpHost, sslPort)
    # smtp.ehlo()
    # smtp.login(username, password)
 
    # 发送邮件
    smtp.sendmail(fromMail, toMail, mail.as_string())
    smtp.close()
    print('OK')
 
except Exception as e:
    print(e)

 

### 如何通过SSL/TLS实现数据传输加密 #### 加密机制概述 SSL/TLS 协议的核心功能在于保障网络通信的安全性,其主要目标包括保密性、完整性和身份验证。具体而言,SSL/TLS 的三个核心目的是由不同的密码学工具支持的:保密性(Confidentiality)依赖于加密技术;完整性(Integrity)依靠哈希函数来检测数据是否被篡改;而真实性(Authentication)则借助公钥基础设施(PKI)完成认证过程[^4]。 #### 数据传输加密的具体流程 当客户端与服务器之间建立连接时,SSL/TLS 会执行一系列操作以确保后续通信的安全: 1. **握手阶段** 客户端向服务器发起请求并交换必要的参数,例如支持的协议版本、加密套件等。在此期间,双方协商选定一种共同支持的加密算法,并通过证书验证彼此的身份。这一阶段还涉及生成共享的秘密密钥用于实际的数据加解密工作[^2]。 2. **记录层协议** 握手完成后进入应用数据传输环节,在此之前所有的消息都会经由记录层封装后再发送出去。每条记录都包含了明文内容加上附加的信息如MAC值用来校验数据未遭中途更改。随后整个报文会被分割成固定大小的小块逐一处理[^1]。 3. **加密与解密** 实际上传输的内容已经过预先商定好的对称加密方式进行了转换,即使第三方截获也无法轻易解读其中含义除非拥有对应的私钥来进行还原动作[^3]。 以下是简单的 Python 示例展示如何创建一个基本的支持 TLS 的服务器端程序片段: ```python import ssl import socket context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH) context.load_cert_chain(certfile="server.crt", keyfile="server.key") with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as tcp_socket: with context.wrap_socket(tcp_socket, server_side=True) as tls_socket: tls_socket.bind(("localhost", 8080)) tls_socket.listen(5) while True: conn, addr = tls_socket.accept() print(f"Connected by {addr}") data = conn.recv(1024) if not data: break conn.sendall(b'Hello Client') ``` 上述脚本展示了设置带有自定义上下文对象的服务端逻辑框架,其中包括加载本地存储的数字证书以及私钥文件路径指定部分[^5]。 #### 总结 综上所述,采用 SSL/TLS 技术能够有效增强互联网环境下各类应用程序之间的交互安全性水平。它不仅提供了强大的防护手段防止敏感资料泄露风险同时也维护了交易过程中的可靠性标准。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值