python 发送短信 / 邮件

在介绍发送短信功能前,先说一说socket

socket

socket(简称 套接字) 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页、QQ 聊天、收发 email 等等。

socket的编程思路

TCP服务端:

1、创建套接字,绑定套接字到本地IP与端口

socket.socket(socket.AF_INET,socket.SOCK_STREAM) , s.bind()

2、开始监听连接

s.listen()

3、进入循环,不断接受客户端的连接请求

s.accept()

4、然后接收传来的数据,并发送给对方数据

s.recv() , s.sendall()

5、传输完毕后,关闭套接字

s.close()

TCP客户端:

1、创建套接字,连接远端地址

socket.socket(socket.AF_INET,socket.SOCK_STREAM) , s.connect()

2、连接后发送数据和接收数据

s.sendall(), s.recv()

3、传输完毕后,关闭套接字

s.close()

发送短信代码实例

#!/usr/bin/env python
#coding=utf-8
import socket
import sys
 
try:
    phone_list=open('./gsm_conf.txt')
except IOError,e:
    sys.exit(e)
 
def gsmsend(message="test message"):
    g_smsserver="10.33.333.333"
    g_smsport=15001
    smsserver=(g_smsserver,g_smsport)
    gsmsend = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    try:
            gsmsend.connect(smsserver)
    except socket.error:
            sys.exit("cannt connect to server")
    gsmsend.send(text_message)
    gsmsend.close()
 
desire_message=raw_input("Input here the sms message to send:\n")
 
for line in phone_list:
    try:
        line=line.split()[0]
    except Exception:
        continue
    if '#' not in line:
        phone_num=line.split()[0]
        if len(phone_num) != 11 and "g_" not in phone_num:
            continue
        text_message=phone_num+"@"+desire_message
        gsmsend(text_message)
        print "Message:",text_message,"has been send"
raw_input("Press enter to exit")

发送邮件

SMTP(Simple Mail Transfer Protocol)是简单邮件传输协议,它是一组用于由源地址到目的地址的邮件传输规则。

python中对SMTP进行了简单的封装,可以发送纯文本邮件,HTML邮件以及带附件的邮件

#!/usr/bin/python
#-*- coding: GB18030 -*-
"""
@desc: handover task, maintenance only
"""
import json
#import MySQLdb
from datetime import *
import time
import calendar
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.header import Header
import os
import sys
import logging

reload(sys)
sys.setdefaultencoding('gb18030')

log_file="./log/send_mail.log"
log_level = logging.NOTSET


if not os.path.exists(os.path.dirname(log_file)):
    os.makedirs(os.path.dirname(log_file))

# set up logging to file - see previous section for more details
logging.basicConfig(level = log_level,
                    format = '%(levelname)-8s: %(asctime)s: %(message)s',
                    datefmt = '%m-%d %H:%M:%S',
                    filename = log_file,
                    filemode = 'a')
# define a Handler which writes WARNING messages or higher to the log.wf
logfile_warn = open(log_file + ".warn", 'a')
fh_warn = logging.StreamHandler(logfile_warn)
fh_warn.setLevel(logging.WARNING)
# set a format which is simpler for console use
formatter = logging.Formatter('%(levelname)-8s: %(asctime)s: %(message)s', "%m-%d %H:%M:%S")
# tell the handler to use this format
fh_warn.setFormatter(formatter)
# add the handler to the root logger
logging.getLogger('').addHandler(fh_warn)

logger = logging.getLogger('')

class log:
    """
    @summary: log class
    """
    @staticmethod
    def info(msg):
        global logger
        logger.info(msg)
    @staticmethod
    def warning(msg):
        global logger_wf
        logger.warning(msg)

    @staticmethod
    def debug(msg):
        global logger
        logger.debug(msg)

    @staticmethod
    def stream():
        global logfile_warn
        return logfile_warn

class MyContent:
    """
    @summary : mycontent
    """
    def __init__(self, title="", content=""):
        """
        init
        """
        self.title = unicode(title, 'gbk')
        #self.content = content
        self.content = unicode(content, 'gbk')

    def gen_content(self):
        """
        @summary: gen content
        """
        thtml = "<table style=\"margin-top:20px;width:100%\">\n"
        thtml += "<table style=\"padding-top:1px;width:100%;\"><tr><td style=\"width:4px;background:red;margin:0;vertical-align:middle;\"></td><td><h3 style=\"font-family:Microsoft YaHei;font-size:16px;font-weight:bold;text-align:left;margin:0;gadding:0px 8px;\">\n"
        thtml += self.title
        thtml += "</h3></td>"
        thtml +="</tr></table>\n"

        #生成文本内容
        thtml +="<table><div>&nbsp;&nbsp;"
        thtml += self.content
        thtml +="</div></table>"
        thtml +="<br><br>"
        return thtml

class MyTable:
    """
        生成表格,表格样式为:title,表格内容,查看更过,表格说明
    """
    def __init__(self, title="", header=[], body=[], current=-1, more="", desc=""):
        self.title = title
        self.header = header
        self.body = body
        self.current = current
        self.more = more
        self.desc = desc

    def gen_table(self):
        length = len(self.header)
        thtml = "<table style=\"margin-top:20px;width:100%\">\n"
        thtml += "<table style=\"padding-top:1px;width:100%;\"><tr><td style=\"width:4px;background:red;margin:0;vertical-align:middle;\"></td><td><h3 style=\"font-family:Microsoft YaHei;font-size:16px;font-weight:bold;text-align:left;margin:0;gadding:0px 8px;\">\n"
        thtml += unicode(self.title, 'gbk')
        thtml += "</h3></td>"
        thtml +="</tr></table>\n"
        #生成表格
        thtml += "<table style=\"width:100%;border:1px solid black;border:0px;border-collapse:separate;\">"
        thtml += "<tr>\n"
        for i in range(0, length):
            if i == self.current:
                thtml += "<th style=\"height:33px;background:rgb(68, 87, 117);color:#fff;font-size:13px;font-weight:bold;text-align:center;vertical-align:middle\">"
            else:
                thtml += "<th style=\"height:33px;background:#6e9e9e;color:#fff;font-size:13px;font-weight:bold;text-align:center;vertical-align:middle\">"
            thtml += unicode(self.header[i], 'gbk')
            thtml += "</th>\n";
        thtml += "</tr>\n"

        for i in range(0, len(self.body)):
            line = self.body[i]
            if i%2 == 0:
                thtml += "<tr style=\"display:table-row;border-collapse:separate;height:33px;line-height:33px;font-family:Microsoft YaHei;font-size:13px;vertical-align:middle;\">\n"
            else:
                thtml += "<tr style=\"display:table-row;border-collapse:separate;height:33px;line-height:33px;font-family:Microsoft YaHei;font-size:13px;vertical-align:middle;background:#e3e6e6;\">\n"
            for j in range(0, len(line)):
                thtml += "<td style=\"vertical-align:middle;text-align:center;\">"
                thtml += str(line[j])
                thtml += "</td>\n"
            thtml += "</tr>\n"
        thtml += "</table>"
        #生成表格说明
        if self.desc != "":
            thtml += "<table style=\"width:100%;padding-bottom: 1px;\"><tr><td align=\"left\"><p style=\"font-family:Microsoft YaHei;font-size:13px;color:gray\">&nbsp;"
            thtml += unicode(self.desc, 'gbk')
            thtml += "</p><td></tr></table>"
        thtml += "</table>"
        thtml +="<br><br>"
        return thtml

class MyHtml:
    """
    @summary myhtml
    """
    def __init__(self, title):
        """
        init
        """
        self.html = "<html>"

    def add_content(self, title, content):
        """
        add content
        """
        content = MyContent(title, content)
        self.html += content.gen_content()

    def add_table(self, title, header, body, current=-1, more="", desc=""):
        table =  MyTable(title=title, header=header, body=body, current=current, more=more, desc=desc)
        self.html += table.gen_table()

    def get_html(self):
        self.html += "</table></html>"
        return self.html

class MailSender:
    def __init__(self, receiver_list=[], subject="", attach_list=[], html="", sender="data@8888.com"):
        self.receiver_list = receiver_list
        self.subject = unicode(subject, "gbk")
        self.attach_list = attach_list
        self.sender = sender
        self.html = html

    def send_email(self):
        if len(self.receiver_list) == 0:
            log.warning("receiver num is 0,will exit")
            return False

        msg = MIMEMultipart('alternative')
        msg['Subject'] = u"【效果监控】" + self.subject
        msg['To'] = ";".join(self.receiver_list)
        msg["From"] = ("%s<data@88888.com>") % (Header(u'abp-data', 'utf-8'),)

        # Create the body of the message (an HTML version).
        part1 = MIMEText(self.html, 'html', _charset='gbk')
        msg.attach(part1)

        # add attach
        for filelist in self.attach_list:
            if os.path.exists(filelist[0]):
                att = MIMEText(open(filelist[0], 'r').read(), 'base64', 'utf-8')
                att["Content-Type"] = '%s' % filelist[1]
                att["Content-Disposition"] = 'attachment; filename="%s"' % os.path.basename(filelist[0])
                msg.attach(att)

        smtp = smtplib.SMTP()
        smtp.connect('XXXXXXX-in.8888.com')
        smtp.sendmail(self.sender, self.receiver_list, msg.as_string())
        smtp.quit()

if __name__ == '__main__':
    #正文标题
    mail_content = MyHtml("html title")
    #邮件正文中添加一段文本描述
    mail_content.add_content("summary", "a test contest</br> a test contest")

    #邮件正文中添加一个表格,表格可以包括(标题,表格内容,点击查看更过,表格数据说明)
    mail_content.add_table(title="table1", header=["收入", "消费"], body=[[12, 34], [34, 78]])

    #生成html格式的邮件正文
    html = mail_content.get_html()
    out_f = open("./out_mail.html",'w')
    out_f.write(html+"\n")

    #指定邮件标题,添加附件,不指定attach_list表示没有附件
    sender = MailSender(receiver_list=["xiaoming@8888.com"], \
            subject="test_subject", attach_list=[["./test.txt", 'text/plain']], html=html)

    #邮件发送
    sender.send_email()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值