Android Question Extracting and decoding Base64 eMail Body

William Hunter

Active Member
Licensed User
Longtime User
I have attached a raw email message encoded Base64. I would like to extract the message body, and then decode it to utf-8. There don't seem to be any tags to identify the beginning and end of the body, so I'm at a loss as to how to do this. The code below is for a Sub I have created to decode Base64, but it does not deal with extracting the body. Is there a way of doing this? Any help gretly appreciated.

Best regards :)
B4X:
Sub Base64Decode(MyString As String) As String
   If Regex.Matcher2("^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", _
     Regex.CASE_INSENSITIVE, MyString).Find = True Then
     'Log("Base64Text")
     Try
       Dim su As StringUtils
       Dim Data() As Byte = su.DecodeBase64(MyString)
       MyString = BytesToString(Data, 0, Data.Length, "UTF8")
     Catch
       Log("LastException: " & LastException)
     End Try
   End If
   Return MyString
End Sub
 

Attachments

  • RawMailLibrary.txt
    8.1 KB · Views: 252

DonManfred

Expert
Licensed User
Longtime User
. There don't seem to be any tags to identify the beginning and end of the body
The message has the following boundary.

----boundary_223389_fb6d2117-94ea-4f10-8100-eaf0eda49579

This is the splitpoint of the parts of the mail.
The first is the textpart, the second the html-part


B4X:
----boundary_223389_fb6d2117-94ea-4f10-8100-eaf0eda49579
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: base64

RGVhciBDYWxnYXJ5IFB1YmxpYyBMaWJyYXJ5IHVzZXIsDQoNClRoZSBmb2xsb3dpbmcg
ZGlnaXRhbCB0aXRsZSB0aGF0IHlvdSBwbGFjZWQgb24gaG9sZCBoYXMgYmVlbiBhdXRv
bWF0aWNhbGx5IGNoZWNrZWQgb3V0IHRvIHlvdToNCg0KICAgQ29uY2VhbGVkIGluIERl
YXRoOiBJbiBEZWF0aCBTZXJpZXMsIEJvb2sgMzgNCiAgIGJ5IEouIEQuIFJvYmINCiAg
IGVCb29rIA0KDQpTaWduIGludG8gdGhlIDxDYWxnYXJ5IFB1YmxpYyBMaWJyYXJ5PiBk
aWdpdGFsIGNvbGxlY3Rpb24gPGh0dHA6Ly9jYWxnYXJ5LmxpYi5vdmVyZHJpdmUuY29t
PiwgdG8gYWNjZXNzIHRoaXMgdGl0bGUgZnJvbSB5b3VyIENoZWNrb3V0cyBwYWdlLg0K
DQpUaGFuayB5b3Uh
----boundary_223389_fb6d2117-94ea-4f10-8100-eaf0eda49579
Content-Type: text/html
Content-Transfer-Encoding: base64

PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNp
dGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwx
LXRyYW5zaXRpb25hbC5kdGQiPg0KPGh0bWw+DQo8aGVhZD4NCgk8bWV0YSBodHRwLWVx
dWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYt
OCIgLz4NCjwvaGVhZD4NCjxib2R5IGxlZnRtYXJnaW49IjAiIG1hcmdpbndpZHRoPSIw
IiB0b3BtYXJnaW49IjAiIG1hcmdpbmhlaWdodD0iMCIgb2Zmc2V0PSIwIj4NCgk8dGFi
bGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGhlaWdo
dD0iMTAwJSIgd2lkdGg9IjEwMCUiIHN0eWxlPSJoZWlnaHQ6MTAwJSAhaW1wb3J0YW50
O21hcmdpbjowO3BhZGRpbmc6MDt3aWR0aDoxMDAlICFpbXBvcnRhbnQ7Ij4NCgkJPHRy
Pg0KCQkJPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj4NCgkJCQk8dGFibGUg
Ym9yZGVyPSIwIiBjZWxscGFkZGluZz0iMTAiIGNlbGxzcGFjaW5nPSIwIiB3aWR0aD0i
MTAwJSI+DQoJCQkJCTx0cj48dGQgc3R5bGU9ImxpbmUtaGVpZ2h0OjA7Zm9udC1zaXpl
OjA7bWFyZ2luOjA7cGFkZGluZzowOyIgaGVpZ2h0PSIxMiI+Jm5ic3A7PC90ZD48L3Ry
Pg0KCQkJCQk8dHI+DQo8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0IiBzdHlsZT0i
Y29sb3I6IzIyMjIyMjtkaXNwbGF5OmJsb2NrO2ZvbnQtZmFtaWx5OidIZWx2ZXRpY2En
LCdBcmlhbCcsc2Fucy1zZXJpZjtmb250LXdlaWdodDpub3JtYWw7dGV4dC1hbGlnbjps
ZWZ0O2xpbmUtaGVpZ2h0OjEuMzt3b3JkLWJyZWFrOm5vcm1hbDtmb250LXNpemU6MTRw
eDttYXJnaW46MDtwYWRkaW5nOjA7Ij5DYWxnYXJ5IFB1YmxpYyBMaWJyYXJ5IHVzZXIs
PC90ZD4NCgkJCQkJPC90cj4NCgkJCQkJPHRyPjx0ZCBzdHlsZT0ibGluZS1oZWlnaHQ6
MDtmb250LXNpemU6MDttYXJnaW46MDtwYWRkaW5nOjA7IiBoZWlnaHQ9IjEyIj4mbmJz
cDs8L3RkPjwvdHI+DQoJCQkJCTx0cj4NCgkJCQkJCTx0ZCB2YWxpZ249InRvcCIgc3R5
bGU9ImNvbG9yOiMyMjIyMjI7ZGlzcGxheTpibG9jaztmb250LWZhbWlseTonSGVsdmV0
aWNhJywnQXJpYWwnLHNhbnMtc2VyaWY7Zm9udC13ZWlnaHQ6bm9ybWFsO3RleHQtYWxp
Z246bGVmdDtsaW5lLWhlaWdodDoxLjM7d29yZC1icmVhazpub3JtYWw7Zm9udC1zaXpl
OjE0cHg7bWFyZ2luOjA7cGFkZGluZzowOyIgYWxpZ249ImxlZnQiPg0KVGhlIGZvbGxv
d2luZyBkaWdpdGFsIHRpdGxlIHRoYXQgeW91IHBsYWNlZCBvbiBob2xkIGhhcyBiZWVu
IGF1dG9tYXRpY2FsbHkgY2hlY2tlZCBvdXQgdG8geW91Og0KCQkJCQkJPC90ZD4NCgkJ
CQkJPC90cj4NCgkJCQkJPHRyPjx0ZCBzdHlsZT0ibGluZS1oZWlnaHQ6MDtmb250LXNp
emU6MDttYXJnaW46MDtwYWRkaW5nOjA7IiBoZWlnaHQ9IjEyIj4mbmJzcDs8L3RkPjwv
dHI+DQoJCQkJCTx0cj4NCgkJCQkJCTx0ZCBzdHlsZT0id29yZC1icmVhazpicmVhay13
b3JkOy13ZWJraXQtaHlwaGVuczphdXRvOy1tb3otaHlwaGVuczphdXRvO2h5cGhlbnM6
YXV0bztib3JkZXItY29sbGFwc2U6Y29sbGFwc2UgIWltcG9ydGFudDt2ZXJ0aWNhbC1h
bGlnbjp0b3A7dGV4dC1hbGlnbjpsZWZ0O3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmc6
MTBweCAwcHggMHB4OyIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4NCgkJCQkJCQk8
dGFibGUgYWxpZ249ImxlZnQiIHN0eWxlPSJib3JkZXItc3BhY2luZzowO2JvcmRlci1j
b2xsYXBzZTpjb2xsYXBzZTt2ZXJ0aWNhbC1hbGlnbjp0b3A7dGV4dC1hbGlnbjpsZWZ0
O3dpZHRoOjEwMCU7bWFyZ2luOjAgYXV0bztwYWRkaW5nOjA7IiBhbGlnbj0ibGVmdCI+
DQoJCQkJCQkJCTx0ciBzdHlsZT0idmVydGljYWwtYWxpZ246dG9wO3RleHQtYWxpZ246
bGVmdDtwYWRkaW5nOjA7IiBhbGlnbj0ibGVmdCI+DQo8dGQgc3R5bGU9IndvcmQtYnJl
YWs6YnJlYWstd29yZDstd2Via2l0LWh5cGhlbnM6YXV0bzstbW96LWh5cGhlbnM6YXV0
bztoeXBoZW5zOmF1dG87Ym9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlICFpbXBvcnRhbnQ7
dmVydGljYWwtYWxpZ246dG9wO3RleHQtYWxpZ246bGVmdDtiYWNrZ3JvdW5kOiNlZWVl
ZWU7cGFkZGluZzoxMHB4O2JvcmRlcjoxcHggc29saWQgI2JmYmZiZjsiIGFsaWduPSJs
ZWZ0IiBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCI+DQo8cCBzdHlsZT0iY29s
b3I6IzIyMjIyMjtkaXNwbGF5OmJsb2NrO2ZvbnQtZmFtaWx5OidIZWx2ZXRpY2EnLCdB
cmlhbCcsc2Fucy1zZXJpZjtmb250LXdlaWdodDpub3JtYWw7dGV4dC1hbGlnbjpsZWZ0
O2xpbmUtaGVpZ2h0OjE5cHg7Zm9udC1zaXplOjE0cHg7bWFyZ2luOjA7IiBhbGlnbj0i
bGVmdCI+Q29uY2VhbGVkIGluIERlYXRoOiBJbiBEZWF0aCBTZXJpZXMsIEJvb2sgMzg8
YnIgLz5ieSBKLiBELiBSb2JiPGJyIC8+ZUJvb2s8L3A+DQoJCQkJCQkJCQk8L3RkPg0K
CQkJCQkJCQk8L3RyPg0KCQkJCQkJCTwvdGFibGU+DQoJCQkJCQk8L3RkPg0KCQkJCQk8
L3RyPg0KCQkJCQk8dHI+PHRkIHN0eWxlPSJsaW5lLWhlaWdodDowO2ZvbnQtc2l6ZTow
O21hcmdpbjowO3BhZGRpbmc6MDsiIGhlaWdodD0iMTIiPiZuYnNwOzwvdGQ+PC90cj4N
CgkJCQkJPHRyPg0KPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCIgc3R5bGU9ImNv
bG9yOiMyMjIyMjI7ZGlzcGxheTpibG9jaztmb250LWZhbWlseTonSGVsdmV0aWNhJywn
QXJpYWwnLHNhbnMtc2VyaWY7Zm9udC13ZWlnaHQ6bm9ybWFsO3RleHQtYWxpZ246bGVm
dDtsaW5lLWhlaWdodDoxLjM7d29yZC1icmVhazpub3JtYWw7Zm9udC1zaXplOjE0cHg7
bWFyZ2luOjA7cGFkZGluZzowOyI+DQo8L3RkPg0KPC90cj4NCgkJCQkJPHRyPjx0ZCBz
dHlsZT0ibGluZS1oZWlnaHQ6MDtmb250LXNpemU6MDttYXJnaW46MDtwYWRkaW5nOjA7
IiBoZWlnaHQ9IjEyIj4mbmJzcDs8L3RkPjwvdHI+DQo8dHI+DQo8dGQgdmFsaWduPSJ0
b3AiIGFsaWduPSJsZWZ0IiBzdHlsZT0iY29sb3I6IzIyMjIyMjtkaXNwbGF5OmJsb2Nr
O2ZvbnQtZmFtaWx5OidIZWx2ZXRpY2EnLCdBcmlhbCcsc2Fucy1zZXJpZjtmb250LXdl
aWdodDpub3JtYWw7dGV4dC1hbGlnbjpsZWZ0O2xpbmUtaGVpZ2h0OjEuMzt3b3JkLWJy
ZWFrOm5vcm1hbDtmb250LXNpemU6MTRweDttYXJnaW46MDtwYWRkaW5nOjA7Ij48cCBz
dHlsZT0iY29sb3I6IzIyMjIyMjtkaXNwbGF5OmJsb2NrO2ZvbnQtZmFtaWx5OidIZWx2
ZXRpY2EnLCdBcmlhbCcsc2Fucy1zZXJpZjtmb250LXdlaWdodDpub3JtYWw7dGV4dC1h
bGlnbjpsZWZ0O2xpbmUtaGVpZ2h0OjEuMzt3b3JkLWJyZWFrOm5vcm1hbDtmb250LXNp
emU6MTRweDttYXJnaW46MDtwYWRkaW5nOjA7Zm9udC1zaXplOiAwOyBtYXgtaGVpZ2h0
OiAwOyBsaW5lLWhlaWdodDogMDsgbXNvLWhpZGU6IGFsbDsgb3ZlcmZsb3c6IGhpZGRl
bjsgd2lkdGg6MDsgZGlzcGxheTogbm9uZTsiPlRoZSBhY2NvdW50IHVzZWQgdG8gcGxh
Y2UgdGhpcyByZXF1ZXN0IGhhcyB0aGUgZm9sbG93aW5nIGxhc3QgNCBkaWdpdHM6IDc0
NTk8L3A+DQo8cCBzdHlsZT0iY29sb3I6IzIyMjIyMjtkaXNwbGF5OmJsb2NrO2ZvbnQt
ZmFtaWx5OidIZWx2ZXRpY2EnLCdBcmlhbCcsc2Fucy1zZXJpZjtmb250LXdlaWdodDpu
b3JtYWw7dGV4dC1hbGlnbjpsZWZ0O2xpbmUtaGVpZ2h0OjEuMzt3b3JkLWJyZWFrOm5v
cm1hbDtmb250LXNpemU6MTRweDttYXJnaW46MDtwYWRkaW5nOjA7Ij5TaWduIGludG8g
dGhlIDxhIHN0eWxlPSJjb2xvcjojMmJhNmNiO3RleHQtZGVjb3JhdGlvbjpub25lIiBo
cmVmPSJodHRwOi8vY2FsZ2FyeS5saWIub3ZlcmRyaXZlLmNvbS9CQU5HQXV0aGVudGlj
YXRlLmRsbD9BY3Rpb249QXV0aENoZWNrJmFtcDtVUkw9TXlBY2NvdW50Lmh0bT9QZXJQ
YWdlPTQwIj5DYWxnYXJ5IFB1YmxpYyBMaWJyYXJ5IGRpZ2l0YWwgY29sbGVjdGlvbjwv
YT4gdG8gYWNjZXNzIHRoaXMgdGl0bGUgZnJvbSB5b3VyIENoZWNrb3V0cyBwYWdlLjwv
cD48L3RkPjwvdHI+DQoJCQkJCTx0cj48dGQgc3R5bGU9ImxpbmUtaGVpZ2h0OjA7Zm9u
dC1zaXplOjA7bWFyZ2luOjA7cGFkZGluZzowOyIgaGVpZ2h0PSIxMiI+Jm5ic3A7PC90
ZD48L3RyPg0KPHRyPjx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiIHN0eWxlPSJj
b2xvcjojMjIyMjIyO2Rpc3BsYXk6YmxvY2s7Zm9udC1mYW1pbHk6J0hlbHZldGljYScs
J0FyaWFsJyxzYW5zLXNlcmlmO2ZvbnQtd2VpZ2h0Om5vcm1hbDt0ZXh0LWFsaWduOmxl
ZnQ7bGluZS1oZWlnaHQ6MS4zO3dvcmQtYnJlYWs6bm9ybWFsO2ZvbnQtc2l6ZToxNHB4
O21hcmdpbjowO3BhZGRpbmc6MDsiPlRoYW5rIHlvdSE8L3RkPjwvdHI+DQoJCQkJPC90
YWJsZT4NCgkJCTwvdGQ+DQoJCTwvdHI+DQoJPC90YWJsZT4NCjwvYm9keT4NCjwvaHRt
bD4=
----boundary_223389_fb6d2117-94ea-4f10-8100-eaf0eda49579--
 
Upvote 0

William Hunter

Active Member
Licensed User
Longtime User
The message has the following boundary.

This is the splitpoint of the parts of the mail.
The first is the textpart, the second the html-part

B4X:
----boundary_223389_fb6d2117-94ea-4f10-8100-eaf0eda49579
Thank you DonManfred. Yes, I know the boundaries are there, but the MailParser doesn't recognize them. When parsed this message comes through as a 0 byte file. In an earlier post Erel has stated that the MailParser is specifically not compatible with multipart/alternative, so the result is not unexpected. I am trying to find a way to display this type of message in a WebView by extracting the text part for the body by some other means, and then decoding it. I haven't even thought of trying to decode the html. :eek: Do you have any other thoughts?

Best regards :)
 
Upvote 0

Erel

B4X founder
Staff member
Licensed User
Longtime User
I've just tested MailParser with the mail you posted and it parses this email successfully.

It treats each part as an attachment:
B4X:
Dim m As Message = MailParser.ParseMail(File.ReadString(File.DirAssets, "RawMailLibrary.txt"), File.DirInternal)
For Each s As String In m.Attachments
   Log(File.ReadString(File.DirInternal, s))
Next
 
Upvote 0
Top