Odesílání SMS bez omezení   otázka

VB.NET, Algoritmy, I/O operace

Ahoj, jsem začátečník a zkouším program na odesílání SMS ... Vše funguje ...

        Dim smtpServer As New SmtpClient()
        Dim mail As New MailMessage
        smtpServer.Credentials = New Net.NetworkCredential("[email protected]", "heslo")
        smtpServer.Port = 52
        smtpServer.Host = "smtp.server"
        smtpServer.EnableSsl = False
        mail.IsBodyHtml = False
        mail.From = New MailAddress("[email protected]", "Vol")
        mail.To.Add("+420" & TextBox1.Text & "@sms.cz.o2.com")
        mail.Headers
        mail.Body = RichTextBox1.Text
        mail.Dispose()

Odesílání funguje taky, problém nastává až po odeslání SMS ...

Odešlu např. ,,Mapa Ceske republiky se zakreslenim polohy mist, kde je mozne koupani a sluneni bez obleceni. ... Tak mi dojde SMS ,,[email protected]: B:Mapa Ceske republiky se zakreslenim p# a já bych potřeboval aby se ty SMSky nějak pospojovali do sebe a vznikla tak 1 SMS o velikosti třeba 300 znaků, jako to funguje u dnešních moderních telefonů ...

Předem děkuji

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak, jak to řešíte nyní, to nepůjde. Tento e-mail totiž funguje tak, že jakmile na něj dorazí zpráva, nějaká běžící služba na tom mailserveru jej prostě ostříhne, přidá ty žvásty na začátku a křížek na konci a pošle, o nic víc se nestará.

Jediné, co můžete udělat, je zjistit si jak velká část řetězce se pošle na jednu zprávu, programově svůj text rozdělit, a poslat několik zpráv za sebou. Rozlučte se ale s jejich spojením u příjemce a časovou synchronizací.

To umožňuje pouze komerční sms sender, který se dá v Česku koupit u několika firem. Ten vytváří zprávu jako binární stream podle specifikace a tam už je možné navolit si zajímavější věci, jako kódování, spojení několika zpráv (ve skutečnosti je totiž taková sms jeden velký soubor, a ne několik individuálních zpráv spojených nějakým příznakem nebo tak) a můžete využít i službu pojmenovaných příjemců, což funguje tak, že se místo čísla sms brány zobrazí jméno, které si sám určíte i když ho nemá uživatel v seznamu telefonních čísel.

Jak vidíte, schopnost spojovat velké SMS zprávy tak není záležitost moderních mobilů, ale je to dáno specifikací protokolu SMS a funguje to stejně i u starých mobilů. Delší zprávy ale používají jistou odrůdu UTF kódování, s kterou můžou mít starší mobily problém, tak se přesto z důvodů zpětné kompatibility ještě stále často využívá ANSI a také se obecně doporučuje to s délkou SMS nepřehánět, protože ačkoliv specifikace stanovuje možnost spojit tuším až 10 zpráv, některých starším mobilům se to nevejde do paměti a odmítnou s takovou zprávou pracovat. (Ovšem těchto mobilů už je asi tak 1% mezi uživateli, takže bych to zase tolik neřešil).

EDIT: Jo, a napadla mne ještě jedna věc: Vždycky si lze pořídit nějaký telefon za tisícovku s podnikatelským tarifem, připojit jej přes hyperterminál a posílat smsky tím reálným zařízením a nebo můžete napsal software, který bude dělat to samé se servisním kabelem pomocí AT příkazů. Ale to už je docela jiná legrace. Já jsem si zkusil zrealizovat to co Vy s tím roztříháním zprávy a došel jsem k tomuhle. Smsky chodí překvapivě často ve správném pořadí a prodlevy nebývají nijak hrozné, ale do reálného provozu bych to nenasazoval.

Imports System.Net.Mail
Imports System.Net
Imports System.Runtime.CompilerServices

Public Class Form1

    Private Const SmsLength = 43 ' Affected by mail address length

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        Send("123456789", "This text won't get to one SMS, because it's too long. But it doesn't matter, because we will split it.")
        Me.Close()
    End Sub

    Private Sub Send([to] As String, sms As String)
        Using client = New SmtpClient("smtp.mail.com", 587)
            client.Credentials = New NetworkCredential("[email protected]", "password")
            For index = 0 To sms.Length Mod SmsLength
                client.Send("[email protected]", String.Format("+420{0}@sms.cz.o2.com", [to]), String.Empty, sms.Substring2(index * SmsLength, SmsLength))
            Next
        End Using
    End Sub

End Class

Module ExtensionMethods

    <Extension()> _
    Public Function Substring2(input As String, index As Integer) As String
        If index < 0 Then
            Return input.Substring(input.Length + index, -index)
        Else
            Return input.Substring(index, input.Length - index)
        End If
    End Function

    <Extension()> _
    Public Function Substring2(input As String, index As Integer, length As Integer) As String
        Dim index2 = index + length
        If index2 > input.Length Then
            length = input.Length Mod length
        End If
        Return input.Substring(index, length)
    End Function

End Module
nahlásit spamnahlásit spam 3 / 3 odpovědětodpovědět

Děkuji za script, pomohl mi, ale nefunguje správně jak má, píše to chybu při odeslání zde:

 <Extension()> _
    Public Function Substring2(input As String, index As Integer, length As Integer) As String
        Dim index2 = index + length
        If index2 > input.Length Then
            length = input.Length Mod length
        End If
        Return input.Substring(index, length) 'Tento radek vyhazuje chybu
    End Function

Chyba co mi to píše při kompilaci na tom řádku ,,Hodnota startIndex nemůže být větší než délka řetězce.

Název parametru: startIndex ... Poradili by jste mi prosím, jsem v tom začátečník, tak budu vděčný. Děkuji

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Jaký text se tímto kódem snažíte poslat? Stačí jeho délka.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Kód:

Send("123456789", "Text oznacuje jakekoliv uskupeni slov, ktere dohromady tvori nejakou vypoved. Vetsinou ale byva jako text oznacovan nejaky delsi oddil nebo odstavec.")

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Kód:

Send("123456789", "Text oznacuje jakekoliv uskupeni slov, ktere dohromady tvori nejakou vypoved. Vetsinou ale byva jako text oznacovan nejaky delsi oddil nebo odstavec.")

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Já z vlastní zkušenosti mohu říct, že posílání SMS není relativně úplně nejlevnější. Pokud ale potřebuje rozesílat v řádek desítek nebo stovek SMS za měsíc, tak to zase není tak hrozné. Navíc existuje řada služeb, přes které to lze velmi pohodlně realizovat.

Je možné se dohodnout i s operátorem, ale to je záležitost za desítky tisíc korun a vyplatí se opravdu jen velkým projektům.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

outůčko není zrovna operátor který by vám upozornění na mejl do mobilu poslal včas. Nezřídka ho nedoručí vůbec. Spolehlivě přeposílá vodafon ale jen pár esemesek poslaných zasebou, potom nastává prodleva. Týmobajl jsem neskoušel tam je nyní potřeba se registrovat zvlášť. Tuším, že služba Postman nebo něco takového. Nic na tom však nemění skutečnost, že je to jen upozornění na mobil. Posílat něco důležitého mejlem a ještě přes operátora není dobré řešení. Hodí se jen na hlouposti. Jedna z možností je opatřit si terminál a nastudovat si více programování. Samozřejmě to také není zadarmo, ale máte jistotu.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Děkuji za script, pomohl mi, ale nefunguje správně jak má, píše to chybu při odeslání zde:

 <Extension()> _
    Public Function Substring2(input As String, index As Integer, length As Integer) As String
        Dim index2 = index + length
        If index2 > input.Length Then
            length = input.Length Mod length
        End If
        Return input.Substring(index, length) 'Tento radek vyhazuje chybu
    End Function

Chyba co mi to píše při kompilaci na tom řádku ,,Hodnota startIndex nemůže být větší než délka řetězce.

Název parametru: startIndex" ... Poradili by jste mi prosím, jsem v tom začátečník, tak budu vděčný. Děkuji

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Jste si jist? Já to totiž s tím Vaším textem zkoušel a fungovalo to v pořádku.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:  
Heslo:  

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback