SMS 通道是多重執行緒的通道,可以將形成佇列的電子郵件轉換為 SMS 郵件,然後提交以將它們傳送至 SMSC。
本節包含以下通道作業主題:
依照SMS 通道配置討論的目的配置 SMS 通道時,讓我們假設主機名稱 sms.siroe.com 是與通道關聯的主機名稱。在這種情況下,電子郵件被導向此通道,使用的位址形式為:
local-part@sms.siroe.com
其中 local-part 可以是 SMS 目標位址 (例如,無線電話號碼、傳呼器 ID 等),也可以是屬性值對,格式如下:
/attribute1=value1/attribute 2=value2/.../@sms.siroe.com
識別的屬性名稱及其用法在表 D–1 中提供。這些屬性允許透過一些通道選項來針對每位收件者進行控制。
表 D–1 SMS 屬性
屬性名稱 |
屬性值和用法 |
---|---|
ID |
SMS 郵件導向的 SMS 目標位址 (例如無線電話號碼、傳呼器 ID 等)。此屬性與關聯值必須存在。 |
FROM |
SMS 來源位址。當選項 USE_HEADER_FROM=0 時忽略此屬性。 |
FROM_NPI |
使用指定的 NPI 值。當選項 USE_HEADER_FROM=0 時忽略此屬性。 |
FROM_TON |
使用指定的 TON 值。當選項 USE_HEADER_FROM=0 時忽略此屬性。 |
MAXLEN |
為此收件者產生的 SMS 郵件可包含的最大總位元組 (即八個位元形成的位元組數量)。使用 MAXLEN 和MAX_MESSAGE_SIZE通道選項指定的值兩者中較低的值。 |
MAXPAGES |
此收件者的電子郵件可分割成的 SMS 郵件最大數量。使用 MAXPAGES 和MAX_PAGES_PER_MESSAGE通道選項指定的值兩者中較低的值。 |
NPI |
為透過 ID 屬性指定的目標 SMS 位址,指定數值規劃指示器 (NPI) 的值。請參閱DEFAULT_DESTINATION_NPI通道選項的說明,以取得有關此屬性可接受的值之資訊。使用此屬性時,其值會覆寫 DEFAULT_DESTINATION_NPI 通道選項提供的值。 |
PAGELEN |
此收件者單封 SMS 郵件可包含的最大位元組數量。使用此值的最小值和透過MAX_PAGE_SIZE通道選項指定的值。 |
TO |
ID 的同義詞。 |
TO_NPI |
NPI 的同義詞。 |
TO_TON |
TON 的同義詞。 |
TON |
為透過 ID 屬性指定的目標 SMS 位址,指定數字類型 (TON) 的值。請參閱DEFAULT_DESTINATION_TON通道選項的說明,以取得有關此屬性可接受的值之資訊。使用此屬性時,其值會覆寫 DEFAULT_DESTINATION_TON 通道選項提供的值。 |
一些範例位址:
123456@sms.siroe.com /id=123456/@sms.siroe.com /id=123456/maxlen=100/@sms.siroe.com /id=123456/maxpages=1/@sms.siroe.com |
如需有關在電子郵件位址的 SMS 目標位址部分上執行翻譯、有效性檢查以及其他作業之資訊,請參閱網站定義的位址有效性檢查和轉譯
為了將電子郵件傳送至遠端網站,必須將電子郵件轉換成遠端 SMSC 可以理解的 SMS 郵件。本節說明將在 SMS 通道上已形成佇列的電子郵件轉換成一封或多封 SMS 郵件的程序。如下所述,可以使用選項來控制 SMS 郵件產生的最大數量、這些 SMS 郵件的最大總長度以及任一封 SMS 郵件的最大大小。只有電子郵件的文字部分 (即 MINE 文字內容類型) 會被使用,被轉換部分的最大數量也會受到控制。
電子郵件的標頭行和文字部分中使用的字元集全部都會轉換成 Unicode,然後再轉換成適當的 SMS 字元集。
當不存在 SMS_TEXT 對映表 (請參閱網站定義的文字轉換) 時,佇列至 SMS 通道的電子郵件會接收到處理,如圖 D–2 中所述。
以下步驟與圖 D–2 中編號的方塊相對應︰
開始時是一個空白的輸出緩衝區。緩衝區使用的字元集為 Unicode。
電子郵件的創建者位址可以取自以下五種來源之一,這些來源依優先順序由高到低顯示:
1. Resent-from: 2. From: 3. Resent-sender: 4. Sender: 5. Envelope From: |
如果創建者位址為空字串,則FROM_NONE通道選項的值會附加至緩衝區。
然而,如果創建者位址為非空字串,則處理FROM_FORMAT通道選項的結果和 LINE_STOP 通道選項的值會附加至輸出緩衝區。
請注意,如果USE_HEADER_RESENT選項值為 1,則僅考量 Resent-from: 和 Resent-sender: 標頭行。否則,忽略 Resent- 標頭行。
如果 Subject: 標頭行不存在或為空,則SUBJECT_NONE選項的值會附加至輸出緩衝區。
否則,處理SUBJECT_FORMAT選項的結果和LINE_STOP通道選項的值會附加至輸出緩衝區。
如果不存在文字郵件部分,則NO_MESSAGE通道選項的值會附加至輸出緩衝區。
如果存在文字郵件部分,則CONTENT_PREFIX通道選項的值會附加至輸出緩衝區。
將捨棄非文字郵件部分。
對於每個文字部分,如果未達到 MAX_MESSAGE_PARTS 的限制,就會被解碼成 Unicode,並連同 LINE_STOP 通道選項的值一起附加至緩衝區。
然後,輸出緩衝區的結果就會從 Unicode 轉換成 SMSC 的預設字元集或 UCS2 (UTF-16)。SMSC 的預設字元集使用SMSC_DEFAULT_CHARSET選項指定。
轉換之後,會將其截斷以不超過MAX_MESSAGE_SIZE位元組。
來自電子郵件至 SMS 轉換程序的轉換字串會被分割為一個或多個 SMS 郵件,任何單一 SMS 郵件均不超過 MAX_PAGE_SIZE 位元組。至多將產生MAX_PAGES_PER_MESSAGESMS 郵件。
由於一封電子郵件可能有多位收件者,可能需要對每個收件者位址都執行步驟 6 到步驟 8,這樣會使用第 4 頁「將電子郵件導向通道」中所述的 MAXLEN、MAXPAGES 或 PAGELEN 屬性。
例如,使用通道的預設設定,電子郵件為︰
From: John Doe To: 1234567@sms.siroe.com Subject: Today’s meeting Date: Fri, 26 March 2001 08:17 |
The staff meeting is at 14:30 today in the big conference room.
將會轉換成以下 SMS 郵件:
jdoe@siroe.com (Today’s meeting) The staff meeting is at 14:30 today in the big conference room.
如果使用以下這組不同的選項設定:
CONTENT_PREFIX=Msg: FROM_FORMAT=From:${pa} SUBJECT_FORMAT=Subj:$s |
則會產生:
From:John Doe Subj:Today’s meeting Msg:The staff meeting is at 14:30 today in the big conference room.
電子郵件轉換成一封或多封 SMS 郵件後,每位收件者可能有不同的設定,SMS 郵件將被提交給目標 SMSC。使用經由 TCP/IP 的 SMPP V3.4 實現提交。SMPP 伺服器的主機名稱 (SMPP_SERVER) 會被視為與 SMS 通道關聯的正式主機名稱;要使用的 TCP 連接埠 (SMPP_PORT) 則透過 port 通道關鍵字來指定。
有郵件需要處理時通道會啟動。通道做為傳輸器連結至 SMPP 伺服器,表示透過 ESME_ 通道選項指定的憑證,如SMPP 選項中所述。表 D–2 列出了 BIND_TRANSMITTER PDU (協定資料單位) 中設定的欄位,並提供其值︰
表 D–2 BIND_TRANSMITTER PDU 中產生的欄位
欄位 |
值 |
---|---|
system_id |
ESME_SYSTEM_ID通道選項;預設值為空字串 |
password |
ESME_PASSWORD通道選項;預設值為空字串 |
system_type |
ESME_SYSTEM_TYPE通道選項;預設值為空字串 |
interface_version |
0x34 表示 SMPP V3.4 |
addr_ton |
ESME_ADDRESS_TON;預設值為 0x00,表示不明的 TON |
addr_npi |
ESME_ADDRESS_NPI;預設值為 0x00,表示不明的 NPI |
addr_range |
ESME_IP_ADDRESS通道選項;預設值為空字串 |
請注意此通道為多重執行緒。根據要傳送之郵件的多少,通道可以執行多重移出佇列執行緒。(甚至可以執行多個通道程序。)每個執行緒均執行 BIND_TRANSMITTER,然後在 TCP/IP 連線上傳送所有必須傳送的 SMS 郵件,再傳送 UNBIND,之後關閉連線。請勿為可能的重複使用而嘗試保持該連線開啟,使其閒置一段時間。如果遠端 SMPP 伺服器傳回阻塞錯誤,則會執行 UNBIND,然後關閉 TCP/IP 連線並建立新的連線和 BIND。如果遠端 SMPP 伺服器在其完成傳送 SMS 郵件之前傳送 UNBIND,則運作方式相似。
然後,透過 SUBMIT_SM PDU 提交 SMS 郵件。如果傳回永久性錯誤 (例如,ESME_RINVDSTADR),則電子郵件會做為無法傳送的郵件傳回。如果傳回暫時性錯誤,則電子郵件會重新形成佇列,稍後再嘗試遞送。要闡明的是,永久性錯誤是指一種可能會無限期存在而且重複嘗試遞送將毫無積極效果的狀況,例如無效的 SMS 目標位址。而暫時性錯誤是指一種可能會在短期內消失的狀況,例如伺服器當機或伺服器擁塞狀況。
如果 USE_HEADER_FROM 選項的值為 1,則已提交之 SMS 郵件的來源位址會被設定。使用的值取自原始電子郵件,並選作最接近所有回覆應導向的 (電子郵件) 位址。因此,來源位址取自以下七種來源之一,這些來源依優先順序由高到低顯示:
1. Resent-reply-to: 2. Resent-from: 3. Reply-to: 4. From: 5. Resent-sender: 6. Sender: 7. Envelope From: |
請注意,如果USE_HEADER_REPLY_TO選項的值為 1,則僅考量 Resent-reply-to: 和 Reply-to: 標頭行。此外,如果USE_HEADER_RESENT選項的值為 1,則僅考量 Resent-reply-to:、Resent-from: 和 Resent-sender: 標頭行。(請注意,這意味著這兩個選項的值均必須為 1,才會考量 Resent-reply-to: 標頭行。) 這兩個選項的預設值均為 0。因此,依預設配置,僅考量項目 4、6 和 7。最後,由於 SMS 郵件中的來源位址被限制為 20 個位元組以內,如果超過此限制,選擇的來源位址就會被截斷。
表 D–3 顯示了在 SUBMIT_SM PDU 中設定的強制性欄位︰
表 D–3 SUBMIT_SM PDU 中產生的強制性欄位
欄位 |
值 |
---|---|
service_type |
DEFAULT_SERVICE_TYPE通道選項;預設值為空字串。 |
source_addr_ton |
DEFAULT_SOURCE_TON通道選項;如果 USE_HEADER_FROM=1,則通常此欄位會被強制設定為表示字母數字式 TON 之值 0x05;否則,為預設值 0x01,表示國際 TON。 |
source_addr_npi |
DEFAULT_SOURCE_NPI通道選項;預設值為 0x00。 |
source_addr |
如果 USE_HEADER_FROM=0,則為DEFAULT_SOURCE_ADDRESS通道選項;否則,為表示電子郵件創建者的字母數字式字串。 |
dest_addr_ton |
TON 定址屬性或DEFAULT_DESTINATION_TON通道選項;預設值為 0x01,表示國際 TON。 |
dest_addr_npi |
NPI 定址屬性或DEFAULT_SOURCE_NPI通道選項;預設值為 0x00,表示不明的 NPI。 |
dest_addr |
目標 SMS 位址取自電子郵件訊息封 To: 位址的本機部分;請參閱將電子郵件導向通道。 |
esm_class |
對於單向 SMS,設定為 0x03 表示儲存和轉寄模式,預設郵件 SMSC 類型並且不設定回覆路徑。對於雙向 MSM 郵件,設定為 0x83。 |
protocol_id |
0x00;不適用於 CDMA 及 TDMA;對於 GSM,0x00 表示無網際網路但使用 SME-to-SME 協定。 |
priority_flag |
用於 GSM 和 CDMA 的 0x00,以及用於 TDMA 的 0x01,全部表示一般優先權;請參閱DEFAULT_PRIORITY通道選項的說明。 |
schedule_delivery_time |
空白字串表示立即遞送。 |
validity_period |
DEFAULT_VALIDITY_PERIOD通道選項;預設值為空字串,表示應使用 SMSC 的預設。 |
registered_delivery |
0x00 表示沒有已註冊的遞送。 |
replace_if_present_flag |
0x00 表示不取代任何先前的 SMS 郵件。 |
data_coding |
對於 SMSC 預設字元集應為 0x00;對於 UCS2 字元集應為 0x08。 |
sm_default_msg_id |
0x00 表示不使用預先定義的郵件。 |
sm_length |
SMS 郵件的長度和內容;請參閱電子郵件至 SMS 轉換程序 |
short_message |
SMS 郵件的長度和內容;請參閱電子郵件至 SMS 轉換程序 |
表 D–4 顯示了 SUBMIT_SM PDU 中的可選欄位︰
表 D–4 SUBMIT_SM PDU 中產生的可選欄位
欄位 |
值 |
---|---|
privacy |
請參閱DEFAULT_PRIVACY通道關鍵字的說明;預設不會提供此欄位,除非電子郵件具有 Sensitivity: 標頭行 |
sar_refnum |
請參閱USE_SAR通道關鍵字的說明;預設不會提供這些欄位 |
sar_total |
請參閱上述 sar_refnum。 |
sar_seqnum |
請參閱上述 sar_refnum。 |
通道持續連結至 SMPP 伺服器,直至再沒有要提交的 SMS 郵件 (郵件佇列為空),或MAX_PAGES_PER_BIND已超過限制。在後一種情況下,如果還有 SMS 郵件需要傳送,則會建立新的連線並執行連結作業。
請注意 SMS 通道為多重執行緒。通道中每個處理執行緒都會維護其本身與 SMPP 伺服器的 TCP 連線。例如,如果有三個處理執行緒,每個執行緒都需要提交 SMS 郵件,則通道會有三個開啟的 TCP 連線連至 SMPP 伺服器。每個連線都會連結至作為傳輸器的 SMPP 伺服器。此外,任何給定的處理執行緒一次只有一個未完成的 SMS 提交。亦即,一個給定的執行緒將提交一封 SMS 郵件,然後在提交另一封 SMS 郵件之前,先等待提交回應 (亦即 SUBMIT_SM_RESP PDU)。
網站會將有效性檢查或翻譯套用至在收件者電子郵件中編碼的 SMS 目標位址,如將電子郵件導向通道中所述
刪除非數值字元 (例如:轉譯 800.555.1212 為 8005551212)
前置前綴 (例如轉譯 8005551212 為 +18005551212)
驗證正確性 (例如,123 過短)
可使用DESTINATION_ADDRESS_NUMERIC和DESTINATION_ADDRESS_PREFIX通道選項完成前兩個作業。一般,所有這三項任務以及其他任務,都可以使用對映表來實作:可以使用重寫規則呼叫對映表,也可以使用 FORWARD 對映表。使用重寫規則呼叫對映表將提供最大程度的靈活性,其中包括以網站定義的錯誤回應來拒絕位址的功能。本節後述部分將集中論述如何使用重寫規則呼叫對映表。
讓我們假設目標位址需要為全數值,長度為 10 或 11 位數,前綴為字串「+1」。使用以下重寫規則即可實現
sms.siroe.com ${X-REWRITE-SMS-ADDRESS,$U}@sms.siroe.com sms.siroe.com $?Invalid SMS address
以上第一個重寫規則呼叫名為 X-REWRITE-SMS-ADDRESS 的網站定義的對映表。將傳送此對映表電子郵件位址的本機部分以供檢查。如果對映程序決定可以接受此本機部分,則此位址會被接受,並重新寫入 SMS 通道。如果對映程序決定不接受此本機部分,則套用下一個重寫規則。由於其為 $? 重寫規則,位址會被拒絕,並隨附錯誤文字「無效的 SMS 位址」。
X-REWRITE-SMS-ADDRESS 對映表顯示如下。它會對屬性-值對清單格式或原始 SMS 目標位址中的本機部分執行必要的驗證步驟。
X-VALIDATE-SMS-ADDRESS ! Iteratively strip any non-numeric characters $_*$[$ -/:-~]%* $0$2$R ! Accept the address if it is of the form 1nnnnnnnnnn or nnnnnnnnnn ! In accepting it, ensure that we output +1nnnnnnnnnn 1%%%%%%%%%% +1$0$1$2$3$4$5$6$7$8$9$Y %%%%%%%%%% +1$0$1$2$3$4$5$6$7$8$9$Y ! We didn’t accept it and consequently it’s invalid * $N X-REWRITE-SMS-ADDRESS */id=$_*/* $C$0/id=$|X-VALIDATE-SMS-ADDRESS;$1|/$2$Y$E */id=$_*/* $N * $C$|X-VALIDATE-SMS-ADDRESS;$0|$Y$E * $N
對於以上設定,請確定DESTINATION_ADDRESS_NUMERIC選項值為 0 (預設)。否則,「+」將從 SMS 目標位址中被刪除。
網站可自訂步驟 1 - 6,如 MTA 對映檔案中的對映表電子郵件至 SMS 轉換程序中所述。
對映表的名稱應為 SMS_Channel_TEXT,其中,SMS_Channel 為 SMS 通道名稱;例如,SMS_TEXT (如果通道名為 sms) 或 SMS_MWAY_TEXT (如果通道名為 sms_mway)。
在此對映表中可以建立兩種項目類型。但是在詳細說明這些項目的格式之前,清楚瞭解如何使用對映檔案非常重要,這樣才能瞭解如何建構並使用這些項目。在說明這兩種項目類型之後,我們會提供範例對映表。
目前此兩種項目類型是:
這些項目指定哪些郵件標頭行應包含在 SMS 郵件中,以及應如何縮寫或轉換它們。僅當標頭行透過這些項目之一成功對映至一個非零長度的字串時,它才會包含在將要產生的 SMS 郵件中。每個項目的格式如下
H|pattern replacement-text
如果郵件標頭行符合此式樣,則系統將使用符合的對映檔案的式樣與字串替代功能以替代文字 replacement-text 替代該郵件標頭行。然後,標頭行對映的最終結果將包含在 SMS 郵件中 (如果取代文字內指定了中介字元 $Y)。如果標頭行不符合任何式樣字串,或者對映至一個零長度字串,又或者取代文字中未指定中介字元 $Y,則 SMS 郵件會忽略此標頭行。以下兩個項目
H|From:* F:$0$Y H|Subject:* S:$0$Y |
導致 From: 和 Subject: 標頭行包含在 SMS 郵件中,且 From: 和 Subject: 縮寫為 F: 和 S:。以下項目:
H|Date:* H|D:$0$R$Y H|D:*,*%19%%*:*:* H|D:$0$ $5:$6$R$Y |
導致 Date: 標頭行被接受並可進行對映,例如標頭行
Date: Wed, 16 Dec 1992 16:13:27 -0700 (PDT)
將被轉換成
D: Wed 16:13
可以建立極為複雜的反覆式對映。網站如果要設定自訂篩選器,首先就需要瞭解對映檔案是如何運作的。如有必要,可以省略項目右側的 H|。保留右側的 H|,以便減少各組反覆式對映所需要的表格項目數量。
這些項目建立的對映會套用於郵件內文中的每一行。郵件內文中的每一行在併入即將建立的 SMS 郵件之前都會通過這些對映。這些項目格式如下:
B|pattern B| replacement-text
如果郵件內文中某一行符合 pattern 的式樣,則會被替代文字 replacement-text 所替代。使用此功能也可以建構極為複雜的反覆式對映。如有必要,可以省略項目右側的 B|。
SMS_TEXT 對映表範例在範例 D–1 中顯示。每一行末端括號內的數字都對應於此表格之後名為說明文字的小節中的項目編號。
SMS_TEXT H|From:* H|F:$0$R$Y (1) H|Subject:* H|S:$0$R$Y (1) H|F:*<*>* H|F:$1$R$Y () H|F:*(*)* H|F:$0$2$R$Y (2) H|F:*"*"* H|F:$0$2$R$Y (3) H|F:*@* H|F:$0$R$Y (4) H|%:$ * H|$0:$1$R$Y (5) H|%:*$ H|$0:$1$R$Y (5) H|%:*$ $ * H|$0:$1$ $2$R$Y (6) B|*--* B|$0-$1$R (7) B|*..* B|$0.$1$R (7) B|*!!* B|$0!$1$R (7) B|*??* B|$0?$1$R (7) B|*$ $ * B|$0$ $1$R (6) B|$ * B|$0$R (5) B|*$ B|$0$R (5) |
上述 SMS_TEXT 對映表範例中的項目說明如下內容:
在上述範例中,中介字元 $R 用於實作與控制對映的反覆式應用程式。透過對這些對映進行迭代,可實現功能強大的篩選效果。例如,這些簡單對映可移除單一前導或尾隨空格 (6),或將兩個空格縮減為一個 (7),將這些對映作為整體來使用時,便可以得到一個篩選器,它可以刪除所有前導或尾隨空格,並將所有的連續多個空格縮減為一個。此種篩選作業有助於縮減每封 SMS 郵件的大小。
這兩個項目導致在 SMS 郵件中包含 From: 和 Subject: 標頭行。From: 和 Subject: 分別縮寫為 F: 和 S:。某些其他項目可能會進一步影響 From: 和 Subject: 標頭行。
此項目將包含 <...> 式樣的 From: 標頭行減少為僅包含角括號中的文字。例如:
F: "John C. Doe" <jdoe@siroe.com> (Hello)
將被取代為:
F: jdoe@siroe.com
此項目將僅移除 From: 標頭行中 (...) 式樣內的所有內容。例如:
F: "John C. Doe" <jdoe@siroe.com> (Hello)
將被取代為:
F: "John C. Doe" <jdoe@siroe.com>
此項目將僅移除 From: 標頭行中「...」式樣內的所有內容。例如:
F: "John C. Doe" <jdoe@siroe.com> (Hello)
將被取代為:
F: <jdoe@siroe.com> (Hello)
此項目將會移除 From: 標頭行中 @ 符號右側的所有內容。例如:
F: "John C. Doe" <jdoe@siroe.com> (Hello)
將被取代為:
F: "John C. Doe" <jdoe@
這四個項目可移除郵件標頭與內文中各行的前導和尾隨空格。
這兩個項目可將郵件標頭與內文中各行內的兩個空格縮減為一個。
這四個項目可將成對的破折號、句點、感嘆號及問號縮減成相應的單個字元。這同樣有助於縮減 SMS 郵件的大小。
項目的次序非常重要。例如,依給定的順序,郵件 From: 標頭行的內文︰
From: "John C. Doe" (Hello)
將被縮減成:
jdoe
實現此種效果的步驟如下:
從 From: 標頭行開始:
From: "John C. Doe" (Hello)
第一個對映項目中的式樣與此相符,並產生以下結果:
F: "John C. Doe" (Hello)
結果字串中的中介字元 $R 會使結果字串重新進行對映。
對映會套用於最後一個步驟的結果字串。會產生:
F: jdoe@siroe.com
對映中的 $R 會使整組對映重新套用於此步驟的結果。
接著套用此對映會產生:
F: jdoe
對映中的 $R 會使整組對映重新套用於此步驟的結果。
接著套用此對映會產生:
F:jdoe
對映中的 $R 會使整組對映重新套用於此步驟的結果。
由於沒有其他相符的項目,因此最終結果字串:
F:jdoe
將會併入 SMS 郵件中。
imsimta 對映測試公用程式可用於測試對映表。例如
# imsimta test -mapping -noimage_file -mapping_file=test.txt Enter table name: SMS_TEXT Input string: H|From: "John C. Doe" (Hello) Output string: H|F:jdoe Output flags: [0,1,2,89] Input string: ^D # |
如需有關 imsimta test 公用程式的進一步詳細資訊,請參閱「Sun Java System Messaging Server 6 2005Q4 Administration Reference」中的「imsimta test」。