整合營銷服務商

          電腦端+手機端+微信端=數(shù)據(jù)同步管理

          免費咨詢熱線:

          Python發(fā)送郵件(三十)

          單郵件傳輸協(xié)議(SMTP)是一種協(xié)議,用于在郵件服務器之間發(fā)送電子郵件和路由電子郵件。

          Python提供smtplib模塊,該模塊定義了一個SMTP客戶端會話對象,可用于使用SMTP或ESMTP偵聽器守護程序向任何互聯(lián)網(wǎng)機器發(fā)送郵件。

          這是一個簡單的語法,用來創(chuàng)建一個SMTP對象,稍后將演示如何用它來發(fā)送電子郵件 -

          import smtplib
          smtpObj = smtplib.SMTP( [host [, port [, local_hostname]]] )
          

          這里是上面語法的參數(shù)細節(jié) -

          • host - 這是運行SMTP服務器的主機。可以指定主機的IP地址或類似felix.com的域名。這是一個可選參數(shù)。
          • port - 如果提供主機參數(shù),則需要指定SMTP服務器正在偵聽的端口。通常這個端口默認值是:25。
          • local_hostname - 如果SMTP服務器在本地計算機上運行,那么可以只指定localhost選項。

          SMTP對象有一個sendmail的實例方法,該方法通常用于執(zhí)行郵件發(fā)送的工作。它需要三個參數(shù) -

          • sender - 具有發(fā)件人地址的字符串。
          • receivers - 字符串列表,每個收件人一個。
          • message - 作為格式如在各種RFC中指定的字符串。

          1.使用Python發(fā)送純文本電子郵件

          示例

          以下是使用Python腳本發(fā)送一封電子郵件的簡單方法 -

          #!/usr/bin/python3
          import smtplib
          sender = 'from@fromdomain.com'
          receivers = ['to@todomain.com']
          message = """From: From Person <from@fromdomain.com>
          To: To Person <to@todomain.com>
          Subject: SMTP e-mail test
          This is a test e-mail message.
          """
          try:
           smtpObj = smtplib.SMTP('localhost')
           smtpObj.sendmail(sender, receivers, message) 
           print "Successfully sent email"
          except SMTPException:
           print "Error: unable to send email"
          

          在這里,已經(jīng)發(fā)送了一封基本的電子郵件,使用三重引號,請注意正確格式化標題。一封電子郵件需要一個From,To和一個Subject標題,與電子郵件的正文與空白行分開。

          要發(fā)送郵件,使用smtpObj連接到本地機器上的SMTP服務器。 然后使用sendmail方法以及消息,從地址和目標地址作為參數(shù)(即使來自和地址在電子郵件本身內(nèi),這些并不總是用于路由郵件)。

          如果沒有在本地計算機上運行SMTP服務器,則可以使用smtplib客戶端與遠程SMTP服務器進行通信。除非您使用網(wǎng)絡郵件服務(如gmail或Yahoo! Mail),否則您的電子郵件提供商必須向您提供可以提供的郵件服務器詳細信息。以騰訊QQ郵箱為例,具體如下:

          mail = smtplib.SMTP('smtp.qq.com', 587) # 端口465或587
          

          2.使用Python發(fā)送HTML電子郵件

          當使用Python發(fā)送郵件信息時,所有內(nèi)容都被視為簡單文本。 即使在短信中包含HTML標簽,它也將顯示為簡單的文本,HTML標簽將不會根據(jù)HTML語法進行格式化。 但是,Python提供了將HTML消息作為HTML消息發(fā)送的選項。

          發(fā)送電子郵件時,可以指定一個Mime版本,內(nèi)容類型和發(fā)送HTML電子郵件的字符集。

          以下是將HTML內(nèi)容作為電子郵件發(fā)送的示例 -

          #!/usr/bin/python3
          import smtplib
          message = """From: From Person <from@fromdomain.com>
          To: To Person <to@todomain.com>
          MIME-Version: 1.0
          Content-type: text/html
          Subject: SMTP HTML e-mail test
          This is an e-mail message to be sent in HTML format
          <b>This is HTML message.</b>
          <h1>This is headline.</h1>
          """
          try:
           smtpObj = smtplib.SMTP('localhost')
           smtpObj.sendmail(sender, receivers, message) 
           print "Successfully sent email"
          except SMTPException:
           print "Error: unable to send email"
          

          3.發(fā)送附件作為電子郵件

          要發(fā)送具有混合內(nèi)容的電子郵件,需要將Content-type標題設(shè)置為multipart / mixed。 然后,可以在邊界內(nèi)指定文本和附件部分。

          一個邊界以兩個連字符開始,后跟一個唯一的編號,不能出現(xiàn)在電子郵件的消息部分。 表示電子郵件最終部分的最后一個邊界也必須以兩個連字符結(jié)尾。

          所附的文件應該用包(“m”)功能編碼,以便在傳輸之前具有基本的64編碼。

          4.發(fā)送示例

          首先我們要知道用python代理登錄qq郵箱發(fā)郵件,是需要更改自己qq郵箱設(shè)置的。在這里大家需要做兩件事情:郵箱開啟SMTP功能 、獲得授權(quán)碼。之后我們來看看如何更改模板代碼,實現(xiàn)使用Python登錄QQ郵箱發(fā)送QQ郵件。

          注意:也可以使用其他服務商的 SMTP 訪問(QQ、網(wǎng)易、Gmail等)。

          使用QQ郵件發(fā)送郵件之前如何設(shè)置授權(quán)碼,參考:

          http://service.mail.qq.com/cgi-bin/help?subtype=1&&id=28&&no=1001256

          4.1.發(fā)送一純文本郵件到指定郵件

          #! /usr/bin/env python
          #coding=utf-8
          from email.mime.text import MIMEText
          from email.header import Header
          from smtplib import SMTP_SSL
          #qq郵箱smtp服務器
          host_server = 'smtp.qq.com'
          #sender_qq為發(fā)件人的qq號碼
          sender_qq = '123123123@qq.com'
          #pwd為qq郵箱的授權(quán)碼
          pwd = '****kenbb***' ## xh**********bdc
          #發(fā)件人的郵箱
          sender_qq_mail = '123123123@qq.com'
          #收件人郵箱
          receiver = 'felix.com@gmail.com'
          #郵件的正文內(nèi)容
          mail_content = '你好,這是使用python登錄qq郵箱發(fā)郵件的測試'
          #郵件標題
          mail_title = 'Maxsu的郵件'
          #ssl登錄
          smtp = SMTP_SSL(host_server)
          #set_debuglevel()是用來調(diào)試的。參數(shù)值為1表示開啟調(diào)試模式,參數(shù)值為0關(guān)閉調(diào)試模式
          smtp.set_debuglevel(1)
          smtp.ehlo(host_server)
          smtp.login(sender_qq, pwd)
          msg = MIMEText(mail_content, "plain", 'utf-8')
          msg["Subject"] = Header(mail_title, 'utf-8')
          msg["From"] = sender_qq_mail
          msg["To"] = receiver
          smtp.sendmail(sender_qq_mail, receiver, msg.as_string())
          smtp.quit()
          

          執(zhí)行上面代碼后,登錄接收郵件的郵件帳號,這里接收郵件的賬號為:felix.com@gmail.com,登錄 http://gmail.com 應該會看到有接收到郵件如下 -

          錄內(nèi)容

          目錄內(nèi)容 2

          0. 修改記錄 3

          1. 短信概念 4

          2. 短信分類 5

          2.1. TEXT短信 5

          2.2. PDU短信 5

          3. 短信應用 6

          3.1. 發(fā)送短信 6

          3.1.1. TEXT短信方式 6

          3.1.2. PDU短信方式 6

          3.2. 編寫短信 7

          3.2.1. TEXT短信方式 7

          3.2.2. PDU短信方式 7

          3.3. 轉(zhuǎn)發(fā)短信 8

          3.4. 讀取短信 9

          3.4.1. TEXT短信方式 9

          3.4.2. PDU短信方式 9

          3.5. 刪除短信 10

          3.5.1. TEXT短信方式 10

          3.5.2. PDU短信方式 11

          4. PDU串分類及結(jié)構(gòu) 12

          4.1. SUBMIT-PDU 12

          4.1.1. 結(jié)構(gòu) 12

          4.1.2. 說明 12

          4.1.3. 舉例分析 15

          4.2. DELIVER-PDU 16

          4.2.1. 結(jié)構(gòu) 17

          4.2.2. 說明 17

          4.2.3. 舉例分析 19

          5. 短信工作過程 22

          5.1. 設(shè)備之間的交互過程 22

          5.2. 平臺的消息處理過程 23

          5.2.1. 發(fā)送短信 23

          5.2.2. 接收短信 23

          0. 修改記錄

          版本

          日期

          作者

          修改內(nèi)容記錄

          1.0

          2012-08-10

          Vicent.Gao

          初始版本,講述了短信的基本操作,及PDU串的結(jié)構(gòu)

          2.0

          2012-08-17

          Vicent.Gao

          加入新的一章:第5章 “短信工作過程”

          1. 短信概念

          短消息,即SMS,英文全稱short message service,是一種使用手機發(fā)送和接收有限長度文本信息的通訊服務;

          更加詳細的介紹,請查看鏈接:

          http://www.jl.10086.cn/whatsnew/newrelease/duanxin.html

          2. 短信分類

          在用戶使用的角度看,短信共分為2類,分別是TEXT短信、PDU短信。

          在寫短信、發(fā)送短信時,可以選擇使用TEXT短信方式,也可以選擇使用PDU短信方式;

          在讀取短信時,可以選擇使用TEXT短信方式,也可以使用PDU短信方式;

          編寫的短信、接收的短信,實際是以PDU短信方式存儲在ME或SM中;

          在發(fā)送短信時,實際是以PDU短信方式發(fā)往SCA,再由SCA轉(zhuǎn)發(fā)至對方手機;

          2.1 TEXT短信

          以可讀的方式,編寫、發(fā)送、讀取短信。在編寫短信、發(fā)送短信時,需要內(nèi)部轉(zhuǎn)換成PDU模式,才能進行存儲、發(fā)送。

          如:

          AT+CMGR=1

          +CMGR: "REC UNREAD","+8615055135325","","2012/08/10 10:56:08+32"

          0123456789

          OK

          2.2 PDU短信

          根據(jù)指定的PDU格式,填充必要的域,如<SCA>, <FO>,<DCS>等,不需要內(nèi)部進行轉(zhuǎn)換,可以直接進行存儲或發(fā)送。也可以使用PDU短信方式,讀取編寫和接收的短信。

          如:

          AT+CMGR=1

          +CMGR: 1,,29

          0891683108501505F0040D91685150155323F50000218001016580230AB0986C46ABD96EB81C

          OK

          3. 短信應用

          客戶在使用短信功能時,可以完成發(fā)送短信、編寫短信、轉(zhuǎn)發(fā)短信、讀取短信、刪除短信的操作。

          3.1 發(fā)送短信

          3.1.1 TEXT短信方式

          AT+CMGF=1 //設(shè)置使用TEXT短信方式

          OK

          AT+CSCS="GSM" //設(shè)置編輯短信時,使用的字符集

          OK

          AT+CMGS="15055135325" //使用CMGS發(fā)送短信給自身,此處需要填寫DA,即目標地址

          > 0123456789 //按<CTRL+Z>開始發(fā)送短信

          +CMGS: 28 //短信已發(fā)送,MR=28,其中MR為Messge Reference,用來唯一標識一條短信

          OK //短信發(fā)送成功

          +CMTI: "SM",1 //接收到的短信,存儲在SM中,索引號為1的位置上

          參考的QCOM Script,請見壓縮包路徑:

          QCOM_Script\CMGS\CMGS_TEXT.ini

          3.1.2 PDU短信方式

          AT+CMGF=0 //設(shè)置使用PDU短信方式

          OK

          AT+CMGS=24 //使用CMGS發(fā)送短信給自身,此處需要填寫TPDU串的長度,即PDU串中除去SCA域之后的數(shù)據(jù)長度,以Byte為單位

          > 0891683108501505F011000D91685150155323F500000A0AB0986C46ABD96EB81C //按<CTRL+Z>開始發(fā)送短信

          +CMGS: 29 //短信已發(fā)送,MR=29,其中MR為Messge Reference,用來唯一標識一條短信

          OK //短信發(fā)送成功

          +CMTI: "SM",2 //接收到的短信,存儲在SM中,索引號為2的位置上

          參考的QCOM Script,請見壓縮包路徑:

          QCOM_Script\CMGS\CMGS_PDU.ini

          3.2 編寫短信

          3.2.1 TEXT短信方式

          AT+CMGF=1 //設(shè)置使用TEXT短信方式

          OK

          AT+CSCS="GSM" //設(shè)置編輯短信時,使用的字符集

          OK

          AT+CMGW //使用CMGW編寫短信,沒有指明DA,即目標地址,也可以在命令中指明

          > 0123456789 //按<CTRL+Z>開始存儲短信

          +CMGW: 5 //編寫的短信,存儲在索引號為5的位置上

          OK //編寫短信成功

          參考的QCOM Script,請見壓縮包路徑:

          QCOM_Script\CMGW\CMGW_TEXT.ini

          3.2.2 PDU短信方式

          AT+CMGF=0 //設(shè)置使用PDU短信方式

          OK

          AT+CMGW=17 //使用CMGW編寫短信,此處需要填寫TPDU串的長度,即PDU串中除去SCA域之后的數(shù)據(jù)長度,以Byte為單位

          > 0011FF00000000470AB0986C46ABD96EB81C //按<CTRL+Z>開始存儲短信

          +CMGW: 7 //編寫的短信,存儲在索引號為7的位置上

          OK //編寫短信成功

          參考的QCOM Script,請見壓縮包路徑:

          QCOM_Script\CMGW\CMGW_PDU.ini

          3.3 轉(zhuǎn)發(fā)短信

          需要指明短信存儲時使用的索引號,才能完成轉(zhuǎn)發(fā)操作。由于短信在存儲時,都是以PDU短信方式來進行存儲的,所以此命令與使用的短信方式(TEXT或PDU)無關(guān)。

          AT+CMGF=0 //設(shè)置使用TEXT短信方式

          OK

          AT+CSCS="GSM" //設(shè)置編輯短信時,使用的字符集

          OK

          AT+CMSS=7,"15055135325" //使用CMSS轉(zhuǎn)發(fā)短信給自身,此短信存儲在索引號為7的位置上,此處指明了DA,即目標地址

          +CMSS: 30 //短信已發(fā)送,MR=29,其中MR為Messge Reference,用來唯一標識一條短信

          OK //短信發(fā)送成功

          +CMTI: "SM",9 //接收到的短信,存儲在SM中,索引號為9的位置上

          AT+CMGF=1 //設(shè)置使用PDU短信方式

          OK

          AT+CSCS="GSM" //設(shè)置編輯短信時,使用的字符集

          OK

          AT+CMSS=7,"15055135325" //使用CMSS轉(zhuǎn)發(fā)短信給自身,此短信存儲在索引號為7的位置上,此處指明了DA,即目標地址

          +CMSS: 31 //短信已發(fā)送,MR=29,其中MR為Messge Reference,用來唯一標識一條短信

          OK //短信發(fā)送成功

          +CMTI: "SM",10 //接收到的短信,存儲在SM中,索引號為10的位置上

          注:

          在TEXT短信方式、PDU短信方式下,轉(zhuǎn)發(fā)同一條短信,都可以成功發(fā)送,則說明CMSS轉(zhuǎn)發(fā)短信與具體采用的短信方式(使用CMGF命令設(shè)置)無關(guān)。

          參考的QCOM Script,請見壓縮包路徑:

          QCOM_Script\CMSS\CMSS.ini

          3.4 讀取短信

          使用CMGD讀取單條短信,使用CMGL讀取某一類別的短信。

          3.4.1 TEXT短信方式

          AT+CMGF=1 //設(shè)置使用TEXT短信方式

          OK

          AT+CMGR=1 //使用CMGR命令,讀取索引號1位置上的短信

          +CMGR: "REC UNREAD","+8615055135325","","2012/08/10 10:56:08+32"

          0123456789 //在TEXT短信方式下,列出的短信內(nèi)容

          OK

          AT+CMGL=? //使用CMGL讀取指定類別的短信,在TEXT短信方式下,查詢CMGL命令的用法

          +CMGL: ("REC UNREAD","REC READ","STO UNSENT","STO SENT","ALL") //在TEXT短信方式下,使用String方式來指明要讀取短信的類別

          OK

          AT+CMGL="STO UNSENT" //顯示所有未發(fā)送的短信

          +CMGL: 3,"STO UNSENT","","", //第1條未發(fā)送短信,存儲在索引號3位置上

          0123456789

          +CMGL: 4,"STO UNSENT","15055135325","", //第2條未發(fā)送短信,存儲在索引號4位置上

          0123456789

          +CMGL: 5,"STO UNSENT","","", //第3條未發(fā)送短信,存儲在索引號5位置上

          0123456789

          +CMGL: 6,"STO UNSENT","","", //第4條未發(fā)送短信,存儲在索引號6位置上

          0123456789

          OK

          參考的QCOM Script,請見壓縮包路徑:

          QCOM_Script\CMGR+CMGL\CMGR+CMGL_TEXT.ini

          3.4.2 PDU短信方式

          AT+CMGF=0 //設(shè)置使用PDU短信方式

          OK

          AT+CMGR=1 //使用CMGR命令,讀取索引號1位置上的短信

          +CMGR: 1,,29

          0891683108501505F0040D91685150155323F50000218001016580230AB0986C46ABD96EB81C //在PDU短信方式下,列出的短信內(nèi)容

          OK

          AT+CMGL=? //使用CMGL讀取指定類別的短信,在PDU短信方式下,查詢CMGL命令的用法

          +CMGL: (0-4) //在PDU短信方式下,使用Integer方式來指明要讀取短信的類別

          OK

          AT+CMGL=2 //顯示所有未發(fā)送的短信

          +CMGL: 3,2,,17 //第1條未發(fā)送短信,存儲在索引號3位置上

          0011FF00000000470AB0986C46ABD96EB81C

          +CMGL: 4,2,,23 //第2條未發(fā)送短信,存儲在索引號4位置上

          0011FF0B815150155323F50000470AB0986C46ABD96EB81C

          +CMGL: 5,2,,17 //第3條未發(fā)送短信,存儲在索引號5位置上

          0011FF00000000470AB0986C46ABD96EB81C

          +CMGL: 6,2,,17 //第4條未發(fā)送短信,存儲在索引號6位置上

          0011FF00000000470AB0986C46ABD96EB81C

          OK

          參考的QCOM Script,請見壓縮包路徑:

          QCOM_Script\CMGR+CMGL\CMGR+CMGL_PDU.ini

          3.5 刪除短信

          在刪除短信時,建議使用CMGD刪除單條命令,使用QMGDA刪除指定類別的短信。當然,使用CMGD命令的<delflag>參數(shù),也可以刪除指定類別的短信。

          3.5.1 TEXT短信方式

          AT+CMGF=1 //設(shè)置使用TEXT短信方式

          OK

          AT+CMGD=1 //使用CMGD刪除索引號1位置上的短信

          OK

          AT+QMGDA=? //使用QMGDA刪除某一類別的短信,在TEXT短信方式下,查詢QMGDA命令的用法

          +QMGDA:("DEL READ","DEL UNREAD","DEL SENT","DEL UNSENT","DEL INBOX","DEL ALL") //在TEXT短信方式下,使用String方式來指明要刪除短信的類別

          OK

          AT+QMGDA="DEL READ" //刪除所有已讀短信

          OK

          參考的QCOM Script,請見壓縮包路徑:

          QCOM_Script\CMGD+QMGDA\CMGD+QMGDA_TEXT.ini

          3.5.2 PDU短信方式

          AT+CMGF=0 //設(shè)置使用PDU短信方式

          OK

          AT+CMGD=1 //使用CMGD刪除索引號1位置上的短信

          OK

          AT+QMGDA=? //使用QMGDA刪除某一類別的短信,在PDU短信方式下,查詢QMGDA命令的用法

          +QMGDA:(1-6) //在PDU短信方式下,使用Integer方式來指明要刪除短信的類別

          OK

          AT+QMGDA=1 //刪除所有已讀短信

          OK

          參考的QCOM Script,請見壓縮包路徑:

          QCOM_Script\CMGD+QMGDA\CMGD+QMGDA_PDU.ini

          4. PDU串分類及結(jié)構(gòu)

          在使用PDU短信方式,進行短信的發(fā)送、編寫、讀取時,對于PDU串結(jié)構(gòu)的了解是很有必要的。

          PDU串共有2類,分別是SUBMIT-PDU,DELIVER-PDU,各有不同的結(jié)構(gòu)。

          4.1 SUBMIT-PDU

          SUBMIT-PDU,是發(fā)送短信時采用的PDU串。

          SUBMIT-PDU

          SCA

          TPDU




          DA






          Len

          Type

          Addr

          FO

          MR

          Len

          Type

          Addr

          PID

          DCS

          VP

          UDL

          UD

          P1

          P2

          P3

          P4

          P5

          P6

          P7

          P8

          P9

          P10

          P11

          P12

          P13

          1

          0~1

          0~10

          1

          1

          1

          1

          0~10

          1

          1

          1

          1

          0~140

          1 ~ 12



          2~12






          4.1.1 結(jié)構(gòu)

          注:

          表中的第1行為 表頭部分,說明表所要表達的內(nèi)容;

          表中的第2行為 PDU串結(jié)構(gòu)中,包含有2大部分;

          表中的第3行為 PDU串結(jié)構(gòu)中,TPDU部分中再劃分的結(jié)構(gòu);

          表中的第4行為 PDU串結(jié)構(gòu)中,細分的每個部分;

          表中的第5行為 對PDU串結(jié)構(gòu)中,細分的每個部分,進行重新編碼,方便后續(xù)的描述;

          表中的第6行為 PDU串結(jié)構(gòu)中,細分的每個部分,編碼時占用的字節(jié)數(shù)范圍;

          表中的第7行為 PDU串結(jié)構(gòu)中,包含的地址區(qū)域,編碼時占用的字節(jié)數(shù)范圍;

          4.1.2 說明

          • P1

          P1區(qū)域?qū)儆赟CA域的一部分,固定占有1個字節(jié),表示SCA域的長度,實際上表示的是P2區(qū)域和P3區(qū)域共同占有的字節(jié)數(shù)。

          當P1=0x00時,表示SCA域不存在,此時平臺會從CSCA命令中,讀取需要的短信服務中心號碼。

          • P2

          P2區(qū)域?qū)儆赟CA域的一部分,當P1=0x00時,P2區(qū)域?qū)⒉淮嬖冢划擯1!=0x00時,P2 區(qū)域存在,并固定占有1字節(jié)大小;

          P2區(qū)域,用于表示短信服務中心號碼的類型,可能取得值有:0x91(國際型),0x81(未知類型),0xA1(國內(nèi)型)。

          • P3

          P3區(qū)域?qū)儆赟CA域的一部分,當P1=0x00時,P3區(qū)域?qū)⒉淮嬖冢划擯1!=0x00時,P3 區(qū)域存在,其占有的字節(jié)數(shù)為:P1 – 1。

          P3區(qū)域,用于存儲短信服務中心的號碼,此號碼采用BCD編碼

          • P4

          P4區(qū)域固定占有1個字節(jié),為TPDU域的第1個字節(jié),即First Octet。P4區(qū)域用于設(shè)置PDU串的類型,及其他重要參數(shù)。

          其結(jié)構(gòu)如下表:

          SUBMIT-PDU FO (First Octet)

          7

          6

          5

          4

          3

          2

          1

          0

          RP

          UDHI

          SRR

          VPF

          VPF

          RD

          MTI

          MTI

          說明如下:

          • MTI 2bit消息類型00收01發(fā)
          • RD 1bit重復信元丟棄0通知服務中心碰到同源同目的地同樣的MR短消息序號的短消息接受1拋棄此時將在短消息提交報告中返回一個適當?shù)腇CS值
          • VPF 2bit有效期限格式00 VP不存在10 VP區(qū)存在用一個字節(jié)表示是相對值01 保留11 存在半個字節(jié)表示絕對值
          • SRR 1bit狀態(tài)報告要求.
          • UDHI 1bit用戶數(shù)據(jù)頭標示0用戶數(shù)據(jù)沒有頭信息1有一般為0
          • RP 1bit是否有回復路徑的標示1有0沒有一般為0

          [Vicent.Gao]:后續(xù)會對此段內(nèi)容,針對平臺中的代碼,進行更加詳細的描述。

          • P5

          P5區(qū)域固定占有1個字節(jié),為Message Reference,用于唯一標識一條短信。

          • P6

          P6區(qū)域?qū)儆贒A域的一部分,固定占有1個字節(jié),表示DA域的長度,實際上表示的是P8區(qū)域含有的BCD碼字符的個數(shù)

          • P7

          P7區(qū)域?qū)儆贒A域的一部分,固定占有1個字節(jié),表示目標地址的類型,可能取得值有:0x91(國際型),0x81(未知類型),0xA1(國內(nèi)型)。

          • P8

          P8區(qū)域?qū)儆贒A域的一部分,當P6=0x00時,P8區(qū)域?qū)⒉淮嬖冢划擯6!=0x00時,P8區(qū)域存在,其占有的字節(jié)數(shù)為:P6 / 2。P8區(qū)域用于存儲目的地址號碼。

          • P9

          P9區(qū)域固定占有1個字節(jié),為Protocol Identifier,用于標識一條短信的種類,為文本短信,還是為其他的短信,如Voice Telephone, E-Mail SMS,一般設(shè)置為0x00即可。

          • P10

          P10區(qū)域固定占有1個字節(jié),為Data Coding Scheme,表示短信內(nèi)容采用的編碼,及短信的類別(Message Class)。

          其結(jié)構(gòu)如下表:

          DCS (Data Coding Scheme)

          7

          6

          5

          4

          3

          2

          1

          0

          -

          -

          Bit5

          Bit4

          Bit3

          Bit2

          Bit1

          Bit0

          說明如下:

          • Bit7 Bit6

          一般設(shè)置為00

          • Bit5

          文本是否壓縮,0表示未壓縮,1表示采用GSM標準壓縮。

          • Bit4

          是否指定短消息類別,0表示沒有指定,1表示已指定。

          • Bit3 Bit2

          指定短信內(nèi)容采用的編碼,00表示默認字母表,01表示8bit數(shù)據(jù),10表示UCS編碼,11表示保留。

          • Bit1 Bit0

          指定短消息類別,00表示Class 0,01表示Class 1,10表示Class 2,11表示Class 3。

          其中:

          Class 0,直接顯示到用戶終端;

          Class 1,短消息存儲在SIM卡上;

          Class 2,短消息必須存儲在SIM卡上禁止直接傳輸?shù)浇K端;

          Class 3,短消息存貯在用戶設(shè)備上;

          平臺解碼方法:

          smsal_decode_dcs

          • P11

          P11區(qū)域,固定占有1個字節(jié),即Validiy Period,用于表示短信服務中心在收到短信后,最長可以暫存的時間,過了有效時間之后,如果這條短信仍然沒有被短信服務中心轉(zhuǎn)發(fā)出去,那么將會被短信服務中心丟棄。

          有效時間,分為2種格式,相對格式和絕對格式,一般都采用相對格式。

          相對格式的有效時間計算方法如表:

          VP

          計算方法

          00 – 8F

          (VP+1)*5 分鐘 從 5 分鐘間隔到 12 個小時

          90 – A7

          12 小時 + (VP – 143)*30 分鐘

          A8 – C4

          (VP – 166) * 1 天

          C5 – FF

          (VP – 192) * 1 周

          • P12

          P12區(qū)域,固定占有1個字節(jié),即User Data Length,表示用戶數(shù)據(jù)長度。

          當短信內(nèi)容采用GSM-7bit編碼時,其表示P13區(qū)域含有的有效字符的個數(shù);

          當短信內(nèi)容采用其他編碼時,如UCS2,其表示P13區(qū)域含有的字節(jié)數(shù);

          • P13

          當P12=0x00時,P13區(qū)域不存在;當P12!=0x00時,P13區(qū)域存在,用于存儲用戶實際發(fā)送的短信內(nèi)容。

          P13區(qū)域最大只有140字節(jié)的空間可供利用,當短信內(nèi)容采用GSM-7bit編碼時,其最大可以存儲140 + 140 / 7 = 160個字符;當短信內(nèi)容采用UCS2編碼時,其最大可以存儲140 / 2 = 70個字符,如漢字字符。

          4.1.3 舉例分析

          SUBMIT-PDU串如下:

          0891683108501505F011000D91685150155323F500000A0AB0986C46ABD96EB81C

          拆分如下:

          08 91 683108501505F0 11 00 0D 91 685150155323F5 00 00 0A 0A B0986C46ABD96EB81C

          08 91 683108501505F0 11 00 0D 91 685150155323F5 00 00 AA 0A B0986C46ABD96EB81C

          如表:

          P1/SCA Len

          P2/SCA Type

          P3/SCA Addr

          P4/FO

          P5/MR

          08

          91

          683108501505F0

          11

          00

          P6/DA Len

          P7/DA Type

          P8/DA Addr

          P9/PID

          P10/DCS

          0D

          91

          685150155323F5

          00

          00

          P11/VP

          P12/UDL

          P13/UD



          0A

          0A

          B0986C46ABD96EB81C



          分析結(jié)果:

          • P1

          內(nèi)容:08

          解析:SCA域長度為8個字節(jié),即P2區(qū)域和P3區(qū)域總共的區(qū)域有8個字節(jié),其中P2區(qū)域固定占用1個字節(jié),P3區(qū)域占用7個字節(jié)。

          • P2

          內(nèi)容:91

          解析:短信服務中心號碼為國際型。

          • P3

          內(nèi)容:683108501505F0

          解析:短信服務中心號碼為:8613800551500

          • P4

          內(nèi)容:11

          解析:此PDU類型為SUBMIT-PDU,采用相對有效期格式。

          • P5

          內(nèi)容:00

          解析:Messge Reference,即短消息發(fā)送參考號,采用默認值00。

          • P6

          內(nèi)容:0D

          解析:DA域長度為0D/02=7個字節(jié),含有0D=14個BCD碼字符,即P8區(qū)域占有7個字節(jié),含有14個BCD碼字符。

          • P7

          內(nèi)容:91

          解析:目的地址號碼類型為國際型。

          • P8

          內(nèi)容:685150155323F5

          解析:目的地址號碼為:8615055135325

          • P9

          內(nèi)容:00

          解析:Protocol Identifier,采用默認值00,即普通文本短消息。

          • P10

          內(nèi)容:00

          解析:Data Coding Scheme,采用默認值00,即GSM-7bit編碼,Class 1類型。

          • P11

          內(nèi)容:0A

          解析:短消息在短信服務中心存儲的有效時間為:(0A + 1) * 5 = 55分鐘。

          • P12

          內(nèi)容:0A

          解析:由于采用GSM-7bit編碼,所以此處表示P13區(qū)域內(nèi)含有10個字符

          • P13

          內(nèi)容:B0986C46ABD96EB81C

          解析:通過對GSM-7bit編碼內(nèi)容進行解碼,得知短信內(nèi)容為:0123456789

          4.2 DELIVER-PDU

          DELIVER-PDU,是接收到的短信采用的PDU串。

          4.2.1 結(jié)構(gòu)

          DELIVER-PDU

          SCA

          TPDU



          OA






          Len

          Type

          Addr

          FO

          Len

          Type

          Addr

          PID

          DCS

          SCST

          UDL

          UD

          P1

          P2

          P3

          P4

          P5

          P6

          P7

          P8

          P9

          P10

          P11

          P12

          1

          1

          6~10

          1

          1

          1

          6~10

          1

          1

          7

          1

          0~140

          8~ 12


          8~12






          注:

          表中的第1行為 表頭部分,說明表所要表達的內(nèi)容;

          表中的第2行為 PDU串結(jié)構(gòu)中,包含有2大部分;

          表中的第3行為 PDU串結(jié)構(gòu)中,TPDU部分中再劃分的結(jié)構(gòu);

          表中的第4行為 PDU串結(jié)構(gòu)中,細分的每個部分;

          表中的第5行為 對PDU串結(jié)構(gòu)中,細分的每個部分,進行重新編碼,方便后續(xù)的描述;

          表中的第6行為 PDU串結(jié)構(gòu)中,細分的每個部分,編碼時占用的字節(jié)數(shù)范圍;

          表中的第7行為 PDU串結(jié)構(gòu)中,包含的地址區(qū)域,編碼時占用的字節(jié)數(shù)范圍;

          4.2.2 說明

          • P1

          P1區(qū)域?qū)儆赟CA域的一部分,固定占有1個字節(jié),表示SCA域的長度,實際上表示的是P2區(qū)域和P3區(qū)域共同占有的字節(jié)數(shù)。

          • P2

          P2區(qū)域?qū)儆赟CA域的一部分,固定占有1個字節(jié),用于表示短信服務中心號碼的類型,可能取得值有:0x91(國際型),0x81(未知類型),0xA1(國內(nèi)型)。

          • P3

          P3區(qū)域?qū)儆赟CA域的一部分,其占有的字節(jié)數(shù)為:P1 – 1,用于存儲短信服務中心的號碼,此號碼采用BCD編碼

          • P4

          P4區(qū)域固定占有1個字節(jié),為TPDU域的第1個字節(jié),即First Octet。P4區(qū)域用于設(shè)置PDU串的類型,及其他重要參數(shù)。

          其結(jié)構(gòu)如下表:

          DELIVER-PDU FO (First Octet)

          7

          6

          5

          4

          3

          2

          1

          0

          RP

          UDHI

          SRI

          -

          -

          MMS

          MTI

          MTI

          說明如下:

          • MTI 2bit消息類型00收01發(fā)
          • MMS 1bit短消息服務中心是否有更多短消息等待移動臺1有0無默認為1
          • SRI 1bit狀態(tài)報告標示0不需要狀態(tài)返回到移動設(shè)備1需要默認為0
          • UDHI 1bit用戶數(shù)據(jù)頭標示0用戶數(shù)據(jù)沒有頭信息1有一般為0
          • RP 1bit是否有回復路徑的標示1有0沒有一般為0

          [Vicent.Gao]:后續(xù)會對此段內(nèi)容,針對平臺中的代碼,進行更加詳細的描述。

          • P5

          P5區(qū)域?qū)儆贠A域的一部分,固定占有1個字節(jié),表示DA域的長度,實際上表示的是P7區(qū)域含有的BCD碼字符的個數(shù)。

          • P6

          P6區(qū)域?qū)儆贒A域的一部分,固定占有1個字節(jié),表示目標地址的類型,可能取得值有:0x91(國際型),0x81(未知類型),0xA1(國內(nèi)型)。

          • P7

          P7區(qū)域?qū)儆贒A域的一部分,其占有的字節(jié)數(shù)為:P5 / 2,用于存儲發(fā)送方的號碼。

          • P8

          P8區(qū)域固定占有1個字節(jié),為Protocol Identifier,用于標識一條短信的種類,為文本短信,還是為其他的短信,如Voice Telephone, E-Mail SMS,一般都為0x00,即普通文本短信。

          • P9

          P9區(qū)域固定占有1個字節(jié),為Data Coding Scheme,表示短信內(nèi)容采用的編碼,及短信的類別(Message Class)。

          其結(jié)構(gòu)如下表

          DCS (Data Coding Scheme)

          7

          6

          5

          4

          3

          2

          1

          0

          -

          -

          Bit5

          Bit4

          Bit3

          Bit2

          Bit1

          Bit0

          說明如下:

          • Bit7 Bit6

          一般設(shè)置為00

          • Bit5

          文本是否壓縮,0表示未壓縮,1表示采用GSM標準壓縮。

          • Bit4

          是否指定短消息類別,0表示沒有指定,1表示已指定。

          • Bit3 Bit2

          指定短信內(nèi)容采用的編碼,00表示默認字母表,01表示8bit數(shù)據(jù),10表示UCS編碼,11表示保留。

          • Bit1 Bit0

          指定短消息類別,00表示Class 0,01表示Class 1,10表示Class 2,11表示Class 3。

          其中:

          Class 0,直接顯示到用戶終端;

          Class 1,短消息存儲在SIM卡上;

          Class 2,短消息必須存儲在SIM卡上禁止直接傳輸?shù)浇K端;

          Class 3,短消息存貯在用戶設(shè)備上;

          平臺解碼方法:

          smsal_decode_dcs

          • P10

          P10區(qū)域固定占有7個字節(jié),即Serive Center Time Stamp,用于存儲SCA轉(zhuǎn)發(fā)該條短信的時間戳。

          其結(jié)構(gòu)如下表:

          SCTS

          1

          2

          3

          4

          5

          6

          7

          時區(qū)

          說明如下:

          假設(shè)P10區(qū)域為:21800101658023,再拆分成:21 80 01 01 65 80 23,則表示SCTS為:12年 08月 10日 10時 56分 08秒 32時區(qū)

          • P11

          P11區(qū)域,固定占有1個字節(jié),即User Data Length,表示用戶數(shù)據(jù)長度。

          當短信內(nèi)容采用GSM-7bit編碼時,其表示P12區(qū)域含有的有效字符的個數(shù);

          當短信內(nèi)容采用其他編碼時,如UCS2,其表示P12區(qū)域含有的字節(jié)數(shù);

          • P12

          當P11=0x00時,P12區(qū)域不存在;當P11!=0x00時,P12區(qū)域存在,用于存儲用戶實際發(fā)送的短信內(nèi)容。

          P12區(qū)域最大只有140字節(jié)的空間可供利用,當短信內(nèi)容采用GSM-7bit編碼時,其最大可以存儲140 + 140 / 7 = 160個字符;當短信內(nèi)容采用UCS2編碼時,其最大可以存儲140 / 2 = 70個字符,如漢字字符。

          4.2.3 舉例分析

          DELIVER-PDU串如下:

          0891683108501505F0040D91685150155323F50000218001016580230AB0986C46ABD96EB81C

          拆分如下:

          08 91 683108501505F0 04 0D 91 685150155323F5 00 00 21800101658023 0A B0986C46ABD96EB81C

          如表:

          P1/SCA Len

          P2/SCA Type

          P3/SCA Addr

          P4/FO

          P5/OA Len

          08

          91

          683108501505F0

          04

          0D

          P6/OA Type

          P7/OA Addr

          P8/PID

          P9/DCS

          P10/SCTS

          91

          685150155323F5

          00

          00

          21800101658023

          P11/UDL

          P12/UD




          0A

          B0986C46ABD96EB81C




          分析結(jié)果:

          • P1

          內(nèi)容:08

          解析:SCA域長度為8個字節(jié),即P2區(qū)域和P3區(qū)域總共的區(qū)域有8個字節(jié),其中P2區(qū)域固定占用1個字節(jié),P3區(qū)域占用7個字節(jié)。

          • P2

          內(nèi)容:91

          解析:短信服務中心號碼為國際型。

          • P3

          內(nèi)容:683108501505F0

          解析:短信服務中心號碼為:8613800551500

          • P4

          內(nèi)容:04

          解析:此PDU類型為DELIVER-PDU。

          • P5

          內(nèi)容:0D

          解析:OA域長度為0D/02=7個字節(jié),含有0D=14個BCD碼字符,即P7區(qū)域占有7個字節(jié),含有14個BCD碼字符。

          • P6

          內(nèi)容:91

          解析:發(fā)送方號碼類型為國際型。

          • P7

          內(nèi)容:685150155323F5

          解析:發(fā)送方號碼為:8615055135325

          • P8

          內(nèi)容:00

          解析:Protocol Identifier,采用默認值00,即普通文本短消息。

          • P9

          內(nèi)容:00

          解析:Data Coding Scheme,采用默認值00,即GSM-7bit編碼,Class 1類型。

          • P10

          內(nèi)容:21800101658023

          解析:短消息服務中心在轉(zhuǎn)發(fā)此條短信的時間戳為:2012年08月10日10時56分08秒。

          • P11

          內(nèi)容:0A

          解析:由于采用GSM-7bit編碼,所以此處表示P12區(qū)域內(nèi)含有10個字符。

          • P12

          內(nèi)容:B0986C46ABD96EB81C

          解析:通過對GSM-7bit編碼內(nèi)容進行解碼,得知短信內(nèi)容為:0123456789

          5. 短信工作過程

          5.1 設(shè)備之間的交互過程

          5.2 平臺的消息處理過程

          5.2.1 發(fā)送短信

          5.2.2 接收短信

          碼示例

          #python3
          #接口類型:互億無線觸發(fā)短信接口,支持發(fā)送驗證碼短信、訂單通知短信等。
          #賬戶注冊:請通過該地址開通賬戶 http://user.ihuyi.com/?9vXc7
           
          #注意事項:
          #(1)調(diào)試期間,請用默認的模板進行測試,默認模板詳見接口文檔;
          #(2)請使用 用戶名 及 APIkey來調(diào)用接口,APIkey在會員中心可以獲取;
          #(3)該代碼僅供接入互億無線短信接口參考使用,客戶可根據(jù)實際需要自行編寫;
          
          import urllib.parse
          import urllib.request
          
          #接口地址
          url = 'http://106.ihuyi.com/webservice/sms.php?method=Submit'
          
          #定義請求的數(shù)據(jù)
          values = {
              'account':'xxxxxxxx',
              'password':'xxxxxxxxxxxx',
              'mobile':'134xxxxxxxx',
              'content':'您的驗證碼是:7835。請不要把驗證碼泄露給其他人。',
              'format':'json',
          }
          
          #將數(shù)據(jù)進行編碼
          data = urllib.parse.urlencode(values).encode(encoding='UTF8')
          
          #發(fā)起請求
          req = urllib.request.Request(url, data)
          response = urllib.request.urlopen(req)
          res = response.read()
          
          #打印結(jié)果
          print(res.decode("utf8"))
          
          -----------------------------------
          #python2
          
          #接口類型:互億無線觸發(fā)短信接口,支持發(fā)送驗證碼短信、訂單通知短信等。
          #賬戶注冊:請通過該地址開通賬戶http://user.ihuyi.com/register.html
          #注意事項:
          #(1)調(diào)試期間,請使用用系統(tǒng)默認的短信內(nèi)容:您的驗證碼是:【變量】。請不要把驗證碼泄露給其他人。
          #(2)請使用 APIID 及 APIKEY來調(diào)用接口,可在會員中心獲取;
          #(3)該代碼僅供接入互億無線短信接口參考使用,客戶可根據(jù)實際需要自行編寫;
             
          #!/usr/local/bin/python
          #-*- coding:utf-8 -*-
          import httplib
          import urllib
           
          host  = "106.ihuyi.com"
          sms_send_uri = "/webservice/sms.php?method=Submit"
           
          #查看用戶名 登錄用戶中心->驗證碼通知短信>產(chǎn)品總覽->API接口信息->APIID
          account  = "用戶名"
          #查看密碼 登錄用戶中心->驗證碼通知短信>產(chǎn)品總覽->API接口信息->APIKEY
          password = "密碼"
           
          def send_sms(text, mobile):
              params = urllib.urlencode({'account': account, 'password' : password, 'content': text, 'mobile':mobile,'format':'json' })
              headers = {"Content-type": "application/x-www-form-urlencoded", "Accept": "text/plain"}
              conn = httplib.HTTPConnection(host, port=80, timeout=30)
              conn.request("POST", sms_send_uri, params, headers)
              response = conn.getresponse()
              response_str = response.read()
              conn.close()
              return response_str
           
          if __name__ == '__main__':
           
              mobile = "138xxxxxxxx"
              text = "您的驗證碼是:121254。請不要把驗證碼泄露給其他人。"
           
              print(send_sms(text, mobile))
          



          你學會了嗎?


          主站蜘蛛池模板: 国产高清在线精品一区小说| 伊人久久精品无码麻豆一区 | 国产精品一区二区久久沈樵| 爆乳熟妇一区二区三区| 精品一区二区视频在线观看| 精品福利一区二区三区| 国产成人精品无码一区二区老年人| 久久免费区一区二区三波多野| 无码人妻AⅤ一区二区三区水密桃| 亚洲综合一区国产精品| 无码少妇一区二区| 精品一区二区三区在线视频| 精品国产一区二区三区久久蜜臀| 国产成人AV区一区二区三| 一区二区和激情视频| 亚洲一区二区三区国产精华液| 一区二区在线免费观看| 久久久久人妻精品一区二区三区 | 日本不卡在线一区二区三区视频| 无码精品前田一区二区| 日本高清无卡码一区二区久久| 在线电影一区二区| 国产嫖妓一区二区三区无码| 午夜一区二区在线观看| 国产伦一区二区三区免费| 精品国产一区二区三区久久影院| 亚洲AV成人精品日韩一区| 国产乱码精品一区二区三区| 九九无码人妻一区二区三区| 九九无码人妻一区二区三区 | 国模吧无码一区二区三区| 国产福利电影一区二区三区久久老子无码午夜伦不 | 亚洲国产AV无码一区二区三区| 久久精品国产第一区二区三区| 无码日韩精品一区二区三区免费| 一区二区视频在线| 中文乱码字幕高清一区二区| 亚洲AV噜噜一区二区三区| 日本一区二区三区免费高清在线| 久久人做人爽一区二区三区| 中文字幕日韩一区|