單郵件傳輸協(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é) -
SMTP對象有一個sendmail的實例方法,該方法通常用于執(zhí)行郵件發(fā)送的工作。它需要三個參數(shù) -
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)容 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
版本 | 日期 | 作者 | 修改內(nèi)容記錄 |
1.0 | 2012-08-10 | Vicent.Gao | 初始版本,講述了短信的基本操作,及PDU串的結(jié)構(gòu) |
2.0 | 2012-08-17 | Vicent.Gao | 加入新的一章:第5章 “短信工作過程” |
短消息,即SMS,英文全稱short message service,是一種使用手機發(fā)送和接收有限長度文本信息的通訊服務;
更加詳細的介紹,請查看鏈接:
http://www.jl.10086.cn/whatsnew/newrelease/duanxin.html
在用戶使用的角度看,短信共分為2類,分別是TEXT短信、PDU短信。
在寫短信、發(fā)送短信時,可以選擇使用TEXT短信方式,也可以選擇使用PDU短信方式;
在讀取短信時,可以選擇使用TEXT短信方式,也可以使用PDU短信方式;
編寫的短信、接收的短信,實際是以PDU短信方式存儲在ME或SM中;
在發(fā)送短信時,實際是以PDU短信方式發(fā)往SCA,再由SCA轉(zhuǎn)發(fā)至對方手機;
以可讀的方式,編寫、發(fā)送、讀取短信。在編寫短信、發(fā)送短信時,需要內(nèi)部轉(zhuǎn)換成PDU模式,才能進行存儲、發(fā)送。
如:
AT+CMGR=1
+CMGR: "REC UNREAD","+8615055135325","","2012/08/10 10:56:08+32"
0123456789
OK
根據(jù)指定的PDU格式,填充必要的域,如<SCA>, <FO>,<DCS>等,不需要內(nèi)部進行轉(zhuǎn)換,可以直接進行存儲或發(fā)送。也可以使用PDU短信方式,讀取編寫和接收的短信。
如:
AT+CMGR=1
+CMGR: 1,,29
0891683108501505F0040D91685150155323F50000218001016580230AB0986C46ABD96EB81C
OK
客戶在使用短信功能時,可以完成發(fā)送短信、編寫短信、轉(zhuǎn)發(fā)短信、讀取短信、刪除短信的操作。
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
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
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
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
需要指明短信存儲時使用的索引號,才能完成轉(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
使用CMGD讀取單條短信,使用CMGL讀取某一類別的短信。
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
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
在刪除短信時,建議使用CMGD刪除單條命令,使用QMGDA刪除指定類別的短信。當然,使用CMGD命令的<delflag>參數(shù),也可以刪除指定類別的短信。
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
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
在使用PDU短信方式,進行短信的發(fā)送、編寫、讀取時,對于PDU串結(jié)構(gòu)的了解是很有必要的。
PDU串共有2類,分別是SUBMIT-PDU,DELIVER-PDU,各有不同的結(jié)構(gòu)。
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 |
注:
表中的第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ù)范圍;
P1區(qū)域?qū)儆赟CA域的一部分,固定占有1個字節(jié),表示SCA域的長度,實際上表示的是P2區(qū)域和P3區(qū)域共同占有的字節(jié)數(shù)。
當P1=0x00時,表示SCA域不存在,此時平臺會從CSCA命令中,讀取需要的短信服務中心號碼。
P2區(qū)域?qū)儆赟CA域的一部分,當P1=0x00時,P2區(qū)域?qū)⒉淮嬖冢划擯1!=0x00時,P2 區(qū)域存在,并固定占有1字節(jié)大小;
P2區(qū)域,用于表示短信服務中心號碼的類型,可能取得值有:0x91(國際型),0x81(未知類型),0xA1(國內(nèi)型)。
P3區(qū)域?qū)儆赟CA域的一部分,當P1=0x00時,P3區(qū)域?qū)⒉淮嬖冢划擯1!=0x00時,P3 區(qū)域存在,其占有的字節(jié)數(shù)為:P1 – 1。
P3區(qū)域,用于存儲短信服務中心的號碼,此號碼采用BCD編碼。
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 |
說明如下:
[Vicent.Gao]:后續(xù)會對此段內(nèi)容,針對平臺中的代碼,進行更加詳細的描述。
P5區(qū)域固定占有1個字節(jié),為Message Reference,用于唯一標識一條短信。
P6區(qū)域?qū)儆贒A域的一部分,固定占有1個字節(jié),表示DA域的長度,實際上表示的是P8區(qū)域含有的BCD碼字符的個數(shù)。
P7區(qū)域?qū)儆贒A域的一部分,固定占有1個字節(jié),表示目標地址的類型,可能取得值有:0x91(國際型),0x81(未知類型),0xA1(國內(nèi)型)。
P8區(qū)域?qū)儆贒A域的一部分,當P6=0x00時,P8區(qū)域?qū)⒉淮嬖冢划擯6!=0x00時,P8區(qū)域存在,其占有的字節(jié)數(shù)為:P6 / 2。P8區(qū)域用于存儲目的地址號碼。
P9區(qū)域固定占有1個字節(jié),為Protocol Identifier,用于標識一條短信的種類,為文本短信,還是為其他的短信,如Voice Telephone, E-Mail SMS,一般設(shè)置為0x00即可。
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 |
說明如下:
一般設(shè)置為00
文本是否壓縮,0表示未壓縮,1表示采用GSM標準壓縮。
是否指定短消息類別,0表示沒有指定,1表示已指定。
指定短信內(nèi)容采用的編碼,00表示默認字母表,01表示8bit數(shù)據(jù),10表示UCS編碼,11表示保留。
指定短消息類別,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區(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區(qū)域,固定占有1個字節(jié),即User Data Length,表示用戶數(shù)據(jù)長度。
當短信內(nèi)容采用GSM-7bit編碼時,其表示P13區(qū)域含有的有效字符的個數(shù);
當短信內(nèi)容采用其他編碼時,如UCS2,其表示P13區(qū)域含有的字節(jié)數(shù);
當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個字符,如漢字字符。
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é)果:
內(nèi)容:08
解析:SCA域長度為8個字節(jié),即P2區(qū)域和P3區(qū)域總共的區(qū)域有8個字節(jié),其中P2區(qū)域固定占用1個字節(jié),P3區(qū)域占用7個字節(jié)。
內(nèi)容:91
解析:短信服務中心號碼為國際型。
內(nèi)容:683108501505F0
解析:短信服務中心號碼為:8613800551500
內(nèi)容:11
解析:此PDU類型為SUBMIT-PDU,采用相對有效期格式。
內(nèi)容:00
解析:Messge Reference,即短消息發(fā)送參考號,采用默認值00。
內(nèi)容:0D
解析:DA域長度為0D/02=7個字節(jié),含有0D=14個BCD碼字符,即P8區(qū)域占有7個字節(jié),含有14個BCD碼字符。
內(nèi)容:91
解析:目的地址號碼類型為國際型。
內(nèi)容:685150155323F5
解析:目的地址號碼為:8615055135325
內(nèi)容:00
解析:Protocol Identifier,采用默認值00,即普通文本短消息。
內(nèi)容:00
解析:Data Coding Scheme,采用默認值00,即GSM-7bit編碼,Class 1類型。
內(nèi)容:0A
解析:短消息在短信服務中心存儲的有效時間為:(0A + 1) * 5 = 55分鐘。
內(nèi)容:0A
解析:由于采用GSM-7bit編碼,所以此處表示P13區(qū)域內(nèi)含有10個字符。
內(nèi)容:B0986C46ABD96EB81C
解析:通過對GSM-7bit編碼內(nèi)容進行解碼,得知短信內(nèi)容為:0123456789
DELIVER-PDU,是接收到的短信采用的PDU串。
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ù)范圍;
P1區(qū)域?qū)儆赟CA域的一部分,固定占有1個字節(jié),表示SCA域的長度,實際上表示的是P2區(qū)域和P3區(qū)域共同占有的字節(jié)數(shù)。
P2區(qū)域?qū)儆赟CA域的一部分,固定占有1個字節(jié),用于表示短信服務中心號碼的類型,可能取得值有:0x91(國際型),0x81(未知類型),0xA1(國內(nèi)型)。
P3區(qū)域?qū)儆赟CA域的一部分,其占有的字節(jié)數(shù)為:P1 – 1,用于存儲短信服務中心的號碼,此號碼采用BCD編碼。
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 |
說明如下:
[Vicent.Gao]:后續(xù)會對此段內(nèi)容,針對平臺中的代碼,進行更加詳細的描述。
P5區(qū)域?qū)儆贠A域的一部分,固定占有1個字節(jié),表示DA域的長度,實際上表示的是P7區(qū)域含有的BCD碼字符的個數(shù)。
P6區(qū)域?qū)儆贒A域的一部分,固定占有1個字節(jié),表示目標地址的類型,可能取得值有:0x91(國際型),0x81(未知類型),0xA1(國內(nèi)型)。
P7區(qū)域?qū)儆贒A域的一部分,其占有的字節(jié)數(shù)為:P5 / 2,用于存儲發(fā)送方的號碼。
P8區(qū)域固定占有1個字節(jié),為Protocol Identifier,用于標識一條短信的種類,為文本短信,還是為其他的短信,如Voice Telephone, E-Mail SMS,一般都為0x00,即普通文本短信。
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 |
說明如下:
一般設(shè)置為00
文本是否壓縮,0表示未壓縮,1表示采用GSM標準壓縮。
是否指定短消息類別,0表示沒有指定,1表示已指定。
指定短信內(nèi)容采用的編碼,00表示默認字母表,01表示8bit數(shù)據(jù),10表示UCS編碼,11表示保留。
指定短消息類別,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區(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區(qū)域,固定占有1個字節(jié),即User Data Length,表示用戶數(shù)據(jù)長度。
當短信內(nèi)容采用GSM-7bit編碼時,其表示P12區(qū)域含有的有效字符的個數(shù);
當短信內(nèi)容采用其他編碼時,如UCS2,其表示P12區(qū)域含有的字節(jié)數(shù);
當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個字符,如漢字字符。
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é)果:
內(nèi)容:08
解析:SCA域長度為8個字節(jié),即P2區(qū)域和P3區(qū)域總共的區(qū)域有8個字節(jié),其中P2區(qū)域固定占用1個字節(jié),P3區(qū)域占用7個字節(jié)。
內(nèi)容:91
解析:短信服務中心號碼為國際型。
內(nèi)容:683108501505F0
解析:短信服務中心號碼為:8613800551500
內(nèi)容:04
解析:此PDU類型為DELIVER-PDU。
內(nèi)容:0D
解析:OA域長度為0D/02=7個字節(jié),含有0D=14個BCD碼字符,即P7區(qū)域占有7個字節(jié),含有14個BCD碼字符。
內(nèi)容:91
解析:發(fā)送方號碼類型為國際型。
內(nèi)容:685150155323F5
解析:發(fā)送方號碼為:8615055135325
內(nèi)容:00
解析:Protocol Identifier,采用默認值00,即普通文本短消息。
內(nèi)容:00
解析:Data Coding Scheme,采用默認值00,即GSM-7bit編碼,Class 1類型。
內(nèi)容:21800101658023
解析:短消息服務中心在轉(zhuǎn)發(fā)此條短信的時間戳為:2012年08月10日10時56分08秒。
內(nèi)容:0A
解析:由于采用GSM-7bit編碼,所以此處表示P12區(qū)域內(nèi)含有10個字符。
內(nèi)容:B0986C46ABD96EB81C
解析:通過對GSM-7bit編碼內(nèi)容進行解碼,得知短信內(nèi)容為:0123456789
碼示例
#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))
你學會了嗎?
*請認真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。