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 :)
Code:
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

. 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


Code:
----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
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

Code:
----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
I've just tested MailParser with the mail you posted and it parses this email successfully.

It treats each part as an attachment:
Code:
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
Back
Top