Python -- 服务器与客户端,发送邮箱与短信

本文介绍了一个简易聊天室的实现方法,包括服务器与客户端的设计,并演示了如何使用UDP协议进行图片传输,此外还展示了如何利用Python发送邮件及短信。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

主要内容:建立简易聊天室服务器及客户端、采用UDP协议发送及接受图片,采用smtplib发送邮件,采用urllib发送短信

建立简易聊天室
服务器
from socket import socket
from threading import Thread


def main():
    class ClientHandler(Thread):
        def __init__(self, client):
            super(ClientHandler, self).__init__()
            self._client = client

        def run(self):
            try:
                while True:
                    try:
                        data = self._client.recv(1024)
                        if data.decode('utf-8') == 'byebye':
                            clients.remove(self._client)
                            self._client.close()
                            break
                        else:
                            for client in clients:
                                client.send(data)  # 转发给每个客户端
                    except Exception as e:
                        print(e)
                        clients.remove(self._client)
                        break
            except Exception as e:
                print(e)

    server = socket()
    # 可以用命令行参数 传入IP - sys.argv
    server.bind(('10.7.189.92', 6789))
    server.listen(512)
    clients = []
    while True:
        now_client, address = server.accept()
        print(address[0], '连接到服务器')
        clients.append(now_client)
        ClientHandler(now_client).start()


if __name__ == '__main__':
    main()
客户端
from socket import socket
from threading import Thread


def main():
    class Refresh(Thread):
        def __init__(self, client):
            super(Refresh, self).__init__()
            self._client = client

        def run(self):
            while running:
                data = self._client.recv(1024)
                print(data.decode('utf - 8'))

    name = input('昵称:')
    my_client = socket()
    my_client.connect(('10.7.189.92', 6789))
    running = True
    Refresh(my_client).start()
    while running:
        content = input('发言:')
        if content == 'byebye':
            my_client.send(content.encode('utf-8'))
            running = False
        else:
            msg = name + ':' + content
            my_client.send(msg.encode('utf - 8'))


if __name__ == '__main__':
    main()
采用UDP协议发送与接收图片
发送
# TCP - Transfer Control Protocol
# UDP - User Datagram Protocol
from socket import socket, SOCK_DGRAM


def main():
    sender = socket(type=SOCK_DGRAM)
    with open('ml.jpg', 'rb') as f:
        data = f.read()
        data_len = len(data)
        total = 0
        while total < data_len:
            sender.sendto(data[total:total + 1024],
                          ('此处为ip地址即发送给谁', 端口号))
            total += 1024


if __name__ == '__main__':
    main()
接收
from socket import socket, SOCK_DGRAM


def main():
    receiver = socket(type=SOCK_DGRAM)
    receiver.bind(('绑定自己的IP', 端口号))
    data = bytes()  # bytes 代表二进制数据
    while True:
        seg, address = receiver.recvfrom(1024)
        data += seg
        print(len(data))
        if len(data) >= 609856:
            break
    with open('mlm.jpg', 'wb') as f:
        f.write(data)
    print('图片已接收!')


if __name__ == '__main__':
    main()
小结:采用UDP协议发送消息或者图片等,可以不经过对方同意,只需要对方一连接,就可以发送给对应客户端,但是可能受各种信号的干扰导致发送不成功或者发送不完全。图片太大的话可以分字节发送,或者加上time,每隔0.01或者更多时间发送一次,这样可以降低收到的干扰,使得文件等不容易发送丢失
发送邮件及附件
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart


def main():
    sender = smtplib.SMTP('smtp.163.com')
    sender.login('1邮箱账号', '邮箱密码')
    # MIME - Multipurpose Internet Mail Extension
    message = MIMEMultipart()
    # message['From'] = '来自于本大人'
    # message['To'] = '发给哈戳戳'
    message['Subject'] = 'DBYQX,晚上好!请查收附件!'
    text_msg = MIMEText('请查收附件,你懂得!', 'plain','utf-8')
    message.attach(text_msg)
    att = MIMEText(open('相关信息.docx','rb').read(), 'base64', 'utf-8')
    att['Content-Type'] = 'application/octet-stream'  # 每一种附件此处类型都有不同的写法
    att['Content-Disposition'] = 'attachment;filename=too.docx'
    message.attach(att)
    sender.sendmail('18281604435@163.com', ['1113792848@qq.com'],
                    message.as_string())
    print('发送完成!')


if __name__ == '__main__':
    main()
小结:通过在邮箱内开通stmp协议,可以让右件通过第三方登陆,从而可以通过python发送邮件,但是很可能当成垃圾邮件
给手机发送短信
import urllib.parse
import http.client
import json

host = "106.ihuyi.com"  # 群发网站,需要借用他们的服务器,50条免费,之后收费
sms_send_uri = "/webservice/sms.php?method=Submit"

params = urllib.parse.urlencode({
    'account': '账号',
    'password': '密码',
    'content': '您的验证码是:147258。请不要把验证码泄露给其他人。',
    'mobile': '此处为电话号码,发送给谁?',
    'format': 'json'
})
print(params)
headers = {'Content-type': 'application/x-www-form-urlencoded', 'Accept': 'text/plain'}
conn = http.client.HTTPConnection(host, port=80, timeout=10)
conn.request('POST', sms_send_uri, params, headers)
response = conn.getresponse()
response_str = response.read()
jsonstr = response_str.decode('utf-8')
print(json.loads(jsonstr))
conn.close()
小结:通过第三方,可以群发短消息,就好像以前的飞信一样,可以群发消息,不过这次是写代码完成,而不是简单的编辑短信然后发送~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值