B4J Question javax.mail problem

Paola Tagini

New Member
I wrote this code:

#Region Project Attributes
#MainFormWidth: 600
#MainFormHeight: 600
#AdditionalJar:javax.mail
#AdditionalJar: activation-1.1
#End Region

Sub Process_Globals
Private fx As JFX
Private MainForm As Form
Private xui As XUI
Private Button1 As B4XView

Private Label1 As Label
Private TextArea1 As B4XView
End Sub

Sub AppStart (Form1 As Form, Args() As String)
MainForm = Form1
MainForm.RootPane.LoadLayout("Layout1")
MainForm.Show




End Sub

Sub Button1_Click
Dim server As String = "imap.navico-online.com" ' Server IMAP

Dim utente As String = "[email protected]" ' Indirizzo email
Dim password As String = "Password"
Dim porta As String = "143" ' Porta IMAP

EstrarreIndirizziEmail(server, utente, password, porta)
End Sub
Sub EstrarreIndirizziEmail(server As String, utente As String, password As String, porta As String)
Try
Log("Inizio configurazione JavaMail")

' Inizializza JavaMail
Dim props As JavaObject
props.InitializeNewInstance("java.util.Properties", Null)
props.RunMethod("put", Array("mail.store.protocol", "imaps"))
props.RunMethod("put", Array("mail.imap.port", porta)) ' Imposta la porta IMAP

Dim session As JavaObject
session.InitializeStatic("javax.mail.Session")
session = session.RunMethod("getInstance", Array(props, Null))

Log("Configurazione JavaMail completata")

' Connessione al server IMAP
Dim store As JavaObject = session.RunMethod("getStore", Array("imaps"))
store.RunMethod("connect", Array(server, utente, password))
Log("Connessione al server IMAP completata")

' Seleziona la cartella "inbox"
Dim folder As JavaObject = store.RunMethod("getFolder", Array("inbox"))
folder.RunMethod("open", Array(2)) ' 2 = READ_ONLY
Log("Apertura cartella 'inbox' completata")

' Ottieni i messaggi
Dim messages() As Object
messages = folder.RunMethod("getMessages", Null)

Dim indirizzi_email As List
indirizzi_email.Initialize

' Estrai gli indirizzi email dai messaggi
Log("Numero di messaggi nella inbox: " & messages.Length)
Dim conta As Int
For Each msg As JavaObject In messages

If msg.RunMethod("isMimeType", Array("text/plain")) Then
conta=conta+1
Log(conta)
Dim content As String = msg.RunMethod("getContent", Null)
indirizzi_email.AddAll(EstraiEmail(content))
Else If msg.RunMethod("isMimeType", Array("multipart/*")) Then
conta=conta+1
Log(conta)
Dim multipart As JavaObject = msg.RunMethod("getContent", Null)
indirizzi_email.AddAll(EstraiEmailFromMultipart(multipart))
End If
Next

' Utilizza una lista per gli indirizzi unici
Dim unici_indirizzi_email As List
unici_indirizzi_email.Initialize
For Each indirizzo As String In indirizzi_email
If unici_indirizzi_email.IndexOf(indirizzo) = -1 Then
unici_indirizzi_email.Add(indirizzo)
End If
Next

' Scrivi gli indirizzi email in un file di testo
ScriviFileIndirizziEmail(unici_indirizzi_email)

' Stampa gli indirizzi email estratti
For Each email As String In unici_indirizzi_email
Log(email)
Next

Catch
Log(LastException.Message)
End Try
End Sub

Sub EstraiEmail(content As String) As List
Dim emailList As List
emailList.Initialize
Dim pattern As String = "([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6})"
Dim matcher As Matcher
matcher = Regex.Matcher(pattern, content)
Do While matcher.Find
emailList.Add(matcher.Match)
Loop
Return emailList
End Sub

Sub EstraiEmailFromMultipart(multipart As JavaObject) As List
Dim emailList As List
emailList.Initialize
Dim count As Int = multipart.RunMethod("getCount", Null)
For i = 0 To count - 1
Dim part As JavaObject = multipart.RunMethod("getBodyPart", Array(i))
If part.RunMethod("isMimeType", Array("text/plain")) Then
Dim content As String = part.RunMethod("getContent", Null)
emailList.AddAll(EstraiEmail(content))
Else If part.RunMethod("isMimeType", Array("multipart/*")) Then
Dim subMultipart As JavaObject = part.RunMethod("getContent", Null)
emailList.AddAll(EstraiEmailFromMultipart(subMultipart))
End If
Next
Return emailList
End Sub

Sub ScriviFileIndirizziEmail(indirizzi As List)
Dim outputStream As OutputStream
outputStream = File.OpenOutput(File.DirApp, "indirizzi_email.txt", False)
For Each email As String In indirizzi
outputStream.WriteBytes(email.GetBytes("UTF8"), 0, email.Length)
outputStream.WriteBytes(CRLF.GetBytes("UTF8"), 0, CRLF.Length)
Log(email) ' Aggiunto per il log
'TextArea1.Text=TextArea1.Text & email
TextArea1.Text = TextArea1.Text & email & CRLF
Next

outputStream.Close
'Log("Indirizzi email scritti nel file di testo")
Label1.Text="Finito"
End Sub

Everything works under debug, but when I try to compile as Release everything stops and I get this
Inizio configurazione JavaMail

feb 01, 2025 11:56:59 AM javax.mail.Session loadResource
AVVERTENZA: expected resource not found: /META-INF/javamail.default.address.map
Configurazione JavaMail completata
Connessione al server IMAP completata
Apertura cartella 'inbox' completata
Numero di messaggi nella inbox: 9610
1
java.lang.RuntimeException: Method: getCount not found in: com.sun.mail.imap.IMAPInputStream

Anyone can help me?
 

Paola Tagini

New Member
Thanks
I apologize for the lack of experience, can I possibly attach?
Can't you post an example to do the same thing using jnet?
Still in this code, how can I make a progressbar update?
 
Upvote 0

Erel

B4X founder
Staff member
Licensed User
Longtime User
B4X:
Dim smtp As SMTP
smtp.Initialize("mail.server.com", 587, "username", "password", "smtp")
smtp.To.Add("[email protected]")
smtp.AddAttachment(File.DirAssets, "test.txt")
smtp.StartTLSMode = True
'show AnotherProgressBar from XUI Views
Wait For (smtp.Send) smtp_MessageSent(Success As Boolean)
'hide AnotherProgressBar
Log("result: " & Success)
 
Upvote 0
Top