Italian Spedire una email con un link

AlpVir

Well-Known Member
Licensed User
Longtime User
Vorrei semplicemente spedire una email (che contiene del codice HTML) all'interno della quale c'è un link. Non ci riesco.
Per spedire una email uso

B4X:
    SMTPExtras1.To.Add(accountName)
        SMTPExtras1.Subject = "SOGGETTO"
        SMTPExtras1.Body = Tutto
        SMTPExtras1.HtmlBody = True
        SMTPExtras1.Tag=Null
        SMTPExtras1.Send
La stringa Tutto la formo pian pianino utilizzando StringBuilder
Dapprima

B4X:
sb.Initialize
    sb.Append("<html><!DOCTYPE html>")
    S="<meta http-equiv=" & QUOTE & "content-type" & QUOTE & " content=" & QUOTE & "text/html; charset=UTF-8" & QUOTE & ">"
    sb.Append(S)
    sb.append ("<body>")
    sb.append ("<table border=0 style='font-family: Arial' cellspacing=3 cellpadding=3>")
    sb.append ("<tr>")
    sb.append ("<td>")
ed al punto cruciale uso uno dei due sistemi :

B4X:
Dim lk As String
    Dim su As StringUtils
    DateTime.DateFormat = "dd-MM-yyyy"
    '--- primo modo
    lk="http://" & SitoMio & "/qui/vedi.asp?"
    lk=lk & "cbodata=" & su.EncodeUrl(DateTime.date(DateTime.Now),"UTF8")
    lk=lk & "&cboautori=" & su.EncodeUrl(Proprietario,"UTF8")
    lk=lk & "&codice=" & CodiceAutorizzazione
    '--- secondo modo
    lk="http://" & SitoMio & "/qui/vedi.asp?"
    lk=lk & "cbodata=" & DateTime.date(DateTime.Now)
    lk=lk & "&amp;cboautori=" & Proprietario.Replace(" ","+")
    lk=lk & "&amp;codice=" & CodiceAutorizzazione
    Log(lk)  ' questo è assolutamente perfetto in entrambi i casi
    sb.append ("<a href='" & lk & "'>http://" & SitoMio & "/qui</a>")
    sb.Append("</td>")
    sb.append ("</tr>")
ma nell'email che ricevo appare
con due anomalie che ovviamente pregiudicano la funzionalità del link
1) la data dovrebbe essere 29-07-2017
2) il codice dovrebbe essere 5255

Per il resto l'email è perfetta con tutti i <TR> e <TD> chiusi al punto giusto.
Ho anche provato a NON utilizzare StringBuilder (formando la stringa Tutto con una serie di concatenazioni &) ma senza successo.
Dove sbaglio perchè è evidente che c'è un errore da qualche parte ?
Grazie per l'attenzione.
 

sirjo66

Well-Known Member
Licensed User
Longtime User
Analizzando il problema si capisce subito che la sequenza "=29" viene interpretata come un carattere, ed infatti se guardi nella tabella ASCII vedrai che il carattere che ha codice 0x29 corrisponde alla ")"
Stessa cosa per il codice, la sequenza "=52" viene interpretata come carattere, ed infatti il carattere 0x52 corrisponde alla lettera "R"
Questa cosa non succede alla variabile cboautori poichè "=no" non corrisponde a nessun valore esadecimale

Cambia la riga in
B4X:
sb.append ("<a href=""" & lk & """>http://" & SitoMio & "/qui</a>")
 

AlpVir

Well-Known Member
Licensed User
Longtime User
A seguito di qualche modifica, anche sulla scorta delle tue indicazioni, digitando in un browser
vengono correttamente lette le 3 variabili.
Bene !

Il seguente codice B4A
B4X:
Dim Parametri As String
Parametri="cbodata=" & DateTime.date(DateTime.Now) & "&nomecognome=" & Proprietario & "&codice=" & CodiceAutorizzazione
Log("Parametri=" & Parametri)
lk=su.EncodeUrl(Parametri,"UTF8")  ' produce http://www.nomesito.it/qui/vedi.asp?cbodata%3D29-07-2017%26nomecognome%3Dnome+cognome%26codice%3D5255
sb.append ("<a href=""http://" & SitoMio & "/qui/vedi.asp?" & lk & """>http://" & SitoMio & "/qui</a>")
invia una email in cui, passando il mouse sul link, appare in basso (sulla status bar di Thunderbird) il corretto link indicato nelle primissime righe di questo post.
Sembrerebbe che tutto fosse OK tuttavia la pagina vedi.asp viene lanciata ma nessuna delle 3 variabili è valorizzata. Quindi fallimento pressochè completo !
La pagina aperta nel browser ha per URL
http://www.nomesito.it/qui/vedi.asp?cbodata=29-07-2017&nomecognome=nome cognome&codice=5255
da cui si possono dedurre tutti i vari codici ASCII e non ASCII.
Ritengo che forse è un problema dell'istruzione EncodeURL che però mi sembra di aver applicato correttamente; la codifica va fatta ai parametri che vengono passati, non all'URL intero. Giusto ?
Possibile che non riesca a trovare un esempio funzionante di questa, mi sembra, semplice funzionalità ?

Aggiungo che nell'app ho la possibilità di aprire in un webbrowser la medesima pagina asp in questione, e tutto funziona correttamente con gli stessi medesimi parametri. Quindi mi par di capire che la colpa del malfunzionamento è dal lato B4A, non dal lato ASP.
 
Last edited:

sirjo66

Well-Known Member
Licensed User
Longtime User
per capire se il problema è il B4A o la pagina ASP basta che cambi il link sul tuo indirizzo e ci metti quello del mio sito alla pagina www.sirjo.com/getpost.php che ti dà la lista dei parametri passati e quindi capisci dove è il problema (ho fatto questa pagina proprio per capire cosa passavano i vari programmi, sia su GET sia su POST)

Ad esempio clicca qui: http://www.sirjo.com/getpost.php?cbodata=29-07-2017&nomecognome=nome cognome&codice=5255

Comunque l'URLencode va eseguito SOLO sui valori dei parametri passati, non su tutta la stringa come hai fatto tu, è normale quindi che ASP non riconosca i valori

B4X:
Dim Parametri AsString
Parametri = "cbodata=" & DateTime.date(DateTime.Now) & "&nomecognome=" & su.EncodeUrl(Proprietario,"UTF8") & "&codice=" & CodiceAutorizzazione
Log("Parametri=" & Parametri)
sb.append ("<a href=""http://" & SitoMio & "/qui/vedi.asp?" & Parametri & """>http://" & SitoMio & "/qui</a>")

Non serve fare UrlEncode sulla data visto che non ci sono sicuramente caratteri strani, e nemmeno su CodiceAutorizzazione (se sei sicuro che sono solo numeri)
 
Last edited:

AlpVir

Well-Known Member
Licensed User
Longtime User
Grazie molte delle prove che hai voluto fare.
Ho capito la funzione URLencode, inutile per la data (29-07-2019) e il codice (5255) ma utile per nomecognome.
Ho sostituito la linea
B4X:
'sb.append ("<a href=""http://" & SitoMio & "/qui/vedi.asp?" & lk & """>http://" & SitoMio & "/qui</a>")
con
B4X:
sb.append ("<a href="" http://www.sirjo.com/getpost.php?" & lk & """>http://" & SitoMio & "/qui</a>")
ed ho potuto una pagina web con i 3 parametri ma con il primo sballato in uno strano modo.
Array
(
[cbodata)-07-2017] =>
[nomecognome] => Pinco Pallino
[codice34] =>
)
Questo il codice B4A; come vedi ho fatto anche qualche variazione, senza successo :
B4X:
DateTime.DateFormat = "dd-MM-yyyy"
    Proprietario="Pinco Pallino"
    CodiceAutorizzazione="1234"
    Dim Parametri As String
    'Parametri = "cbodata=" & DateTime.date(DateTime.Now) & "&nomecognome=" & su.EncodeUrl(Proprietario,"UTF8") & "&codice=" & CodiceAutorizzazione
    Parametri = "cbodata=" & su.EncodeUrl(DateTime.date(DateTime.Now),"UTF8") & "&nomecognome=" & su.EncodeUrl(Proprietario,"UTF8") & "&codice=" & su.EncodeUrl(CodiceAutorizzazione,"UTF8")
    Log("Parametri=" & Parametri)
    'sb.append ("<a href=""http://www.sirjo.com/getpost.php?" & Parametri & """>http://" & SitoMio & "/qui</a>")
Nella pagina ASP ho utilizzato sia
codice=request("codice")
che
codice=request.querystring("codice")

Hai qualche idea del perchè del malfunzionamento ?
Il fatto che anche con la tua pagina PHP il risultato non sia positivo al 100% lascia pensare che la soluzione non sia banale. O no ?

EDIT: Thunderbird segnala la tua pagina PHP come un tentativo di frode ! Di bene in meglio !
 

sirjo66

Well-Known Member
Licensed User
Longtime User
stai ancora sbagliando qualcosa, e secondo me non hai capito che l'apice va sostituito con il doppio apice, controlla bene il tuo codice
 

AlpVir

Well-Known Member
Licensed User
Longtime User
Sono anch'io convinto che sto sbagliando qualcosa ma il problema - per me - è capire cosa.
Sono anche a conoscenza del famoso problema del doppio apice che, specie nelle query SQL, deve essere tenuto ben presente; so anche come risolverlo.
Ho fatto numerossssssime prove ed ho anche creado un progettino, qui sotto riportato, che da conto di qualcuna di queste prove dall'esito assai misterioso (per me).
Perchè (vedi primo e secondo link) "ALFAaaa" viene passato e "DAAHCAB" no ?
Mi sembra di aver capito che non è possibile passare più di un parametro ed allora mi sono attrezzato di conseguenza scrivendo la pagina p2.asp che accetta i 3 parametri separandoli con un trattino e li separa all'interno della pagina ASP.
Il terzo Link funziona ma perchè il quarto no ?
Ho anche pensato che, se non potessero essere passati dei numeri (ma la cosa mi sembra assai assurda) potrei convertire questi numeri in lettere (a=0, b=1, c=2, ecc).
Anche sviluppando il lato server con PHP mi sembra che le cose non siano poi così perfette visto che, come ti ho scritto nel post #5, la data non viene correttamente interpretata.
Ti ringrazio per l'aiuto che mi stai dando.
Continuo a cercare di capire, convinto che debba esserci una soluzione.

B4X:
Sub Process_Globals
    Dim SMTPExtras1                             As SMTPExtras
End Sub

Sub Globals
    Dim BotEmail            As Button
End Sub

Sub Activity_Create(FirstTime As Boolean)
    Dim g, e, psw   As String
    g="smtp.gmail.com"
    e="*******@gmail.com"
    psw="***********"
    If FirstTime Then
        SMTPExtras1.Initialize(g, 465, e, psw, "SMTPExtras1")
        SMTPExtras1.UseSSL = True
    End If
    BotEmail.Initialize("BotEmail")
    Activity.AddView(BotEmail,10dip,200dip,300dip,40dip)
    BotEmail.Text ="SEND EMAIL WITH LINK"
End Sub

Sub BotEmail_click
    Dim sb                As StringBuilder
    Dim MySite          As String ="www.**********.it/qui"
    Dim AllEmail        As String
    Dim ToEmail            As String = "*********@gmail.com"
  
    sb.Initialize
    '---
    sb.Append("<html>")
    sb.append ("<body>")
    sb.Append ("<table><tr><td>")
    sb.Append ("send email with link<BR>")
    Dim PP As String
  
    PP="ALFAaaa" '                  ' OK
    sb.append ("<a href=" & QUOTE & "http://" & MySite & "/" & "p.asp?cy=" & PP & QUOTE & ">link 1 OK</a>")    ' OK
    sb.Append ("<BR><BR>")
  
    PP="DAAHCAB"                    ' NO
    sb.append ("<a href=" & QUOTE & "http://" & MySite & "/" & "p.asp?cy=" & PP & QUOTE & ">link 1 NO</a>")   ' NO
    sb.Append ("<BR><BR>")
  
    PP="alfa-beta-gamma"             ' OK
    sb.append ("<a href=""http://" & MySite & "/" & "p2.asp?all=" & PP & """>link 3 OK</a>")               ' OK
    sb.Append ("<BR><BR>")
  
    PP="daahcabh-beta-gamma"         ' NO
    sb.append ("<a href=""http://" & MySite & "/" & "p2.asp?all=" & PP & """>link 3 NO</a>")               ' NO
  
    sb.Append ("</td></tr></table>")
    sb.Append ("</body")
    sb.Append ("</html>")
  
'-------------------------------------------------  
'''           p.asp  
'''    <%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
'''    <%
''    Response.Charset = "UTF-8"
''    cx = Request.QueryString("cx")
''    cy = Request.QueryString("cy")
''    Response.Write cx
''    response.write "<BR>"
    ''    Response.Write cy
    '''    %>

'''           p2.asp
'''    <%
'''    'Response.Charset = "UTF-8"
'''    all = Request.QueryString("all")
'''    NC=split(all,"-")
'''    cx=trim(NC(0))
'''    cy=trim(NC(1))
'''    cz=trim(NC(2))
'''    Response.Write cx
'''    response.write "<BR>"
'''    Response.Write cy
'''    response.write "<BR>"
'''    Response.Write cz
'''    %>
'------------------------------------------------  
  
    AllEmail=sb.ToString
    SMTPExtras1.To.Add(ToEmail)
    DateTime.DateFormat = "dd/MM/yyyy"
    SMTPExtras1.Subject = "TEST"
    SMTPExtras1.Body = AllEmail
    SMTPExtras1.HtmlBody = True
    SMTPExtras1.Tag=Null
    SMTPExtras1.Send
End Sub

Sub SMTPExtras1_MessageSent(Success As Boolean)
    If Success Then
        ToastMessageShow("OK", True)
    Else
        ToastMessageShow("Error", True)
        Log(LastException.Message)
    End If
End Sub

Sub Activity_Resume
End Sub

Sub Activity_Pause (UserClosed As Boolean)
End Sub
 

AlpVir

Well-Known Member
Licensed User
Longtime User
SOLUZIONE :
Bisogna sostituire il segno di uguale con un "=3D"

B4X:
DateTime.DateFormat = "ddMMyyyy"
    lk = "cbodata=3D" & DateTime.date(DateTime.Now) & "&nomecognome=3D" & su.EncodeUrl(Proprietario,"UTF8") & "&codice=3D" & CodiceAutorizzazione
    sb.append ("<a href="" http://" & SitoMio & "/qui/vedi.asp?" & lk & """>http://" & SitoMio & "/qui</a>")

Grazie a tutti ed in special modo a sirjo66
 

sirjo66

Well-Known Member
Licensed User
Longtime User
ottimo !!

solo per curiosità, prova a vedere cosa succede a mettere %3D al posto di =3D

Perchè (vedi primo e secondo link) "ALFAaaa" viene passato e "DAAHCAB" no ?

Per quello che ti ho spiegato prima, e cioè che lui prende i primi due caratteri e tenta di trasformarli in esadecimale, e quindi 0xDA corrisponde ad un valore esadecimale, ma invece 0xAL no

Altra prova interessante da fare è mettere
SMTPExtras1.HtmlBody = False
in modo che la email arrivi in modalità solo testo e vedere esattamente i caratteri spediti, perchè mi piacerebbe capire quale è la parte che converte i "=29" in ")", secondo me potrebbe addirittura essere l'interprete HTML del programma che visualizza le email
 
Last edited:

AlpVir

Well-Known Member
Licensed User
Longtime User
Mettendo %3D invece di =3D la pagina viene richiamata ugualmente ma reagisce in modo diverso; probabilmente la pagina legge solo il primo dei tre parametri e, come da me desiderato, visualizza un messaggio di errore (o meglio un messaggio che avverte della mancanza di qualche campo). E' da notare che la stessa pagina vedi.asp DEVE essere visualizzata anche nel consueto modo, ossia direttamente da un'altra pagina web; ed ho previsto appunto che ci sia un avvertimento se qualche campo non è stato compilato.
Con SMTPExtras1.HtmlBody = False viene restituito il sorgente della pagina.
Grazie ancora !!!
 
Top