Zal eerst even beginnen met de stukjes relevante code:
Het is een gedeelte van de code uit een klasse om mailtjes van een POP server te halen.
Als ik de klasse in een .vb file in mijn asp.net webapplicatie zet dan werkt alles perfect.
Maar als ik de vb als class library project pak en compile tot een .dll en deze gebruik in mijn Windows Forms applicatie knal hij er uit op het einde bij de regel
(regel 46)Hier bij heeft hend de waarde -1.
Hend heeft dus de posititie van waar de header van de mail ophoudt (1e lege regel). Maar als .dll vindt hij deze positie niet. Ik heb een gedebugged en de plaats van het probleem gevonden:
Als ik
uitvoer wordt het commando op de POP server uitgevoerd om de mail binnen te halen.
Als eerste response krijg ik:
+OK
Wat klopt, betekend gewoon dat commando dat ik stuur klopt. Hierna moet dus het mailtje komen maar GetData krijgt niks meer binnen (of doet het verkeerd). Mijn vraag is waarom gaat het daar fout? Nogmaals... met telnet naar popserver en exact dezelfde handelingen uitvoeren werkt wel. En de klasse als losse .vb file in asp.net app werkt ook, gaat dus alleen mis als de klasse apart als gecompileerde assembly/dll/class library in een windows form gebruikt wordt.
De code heb ik overigens van http://www.aspalliance.com/damianm/article1/3/
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
| Private Function getData() As String Dim bData(t.ReceiveBufferSize) As Byte getData = "" Do 'get the data s.Read(bData, 0, bData.Length) getData += System.Text.Encoding.ASCII.GetString(bData) MsgBox(getData) 'clear byte array for next pass bData.Clear(bData, 0, bData.Length) 'if there is more data repeat 'wait for the dataavailble flag to get set System.Threading.Thread.Sleep(100) Loop While s.DataAvailable End Function Private Function SendCmd(ByVal Cmd As String) As String Dim bCmd As Byte() 'byte encode the command bCmd = System.Text.Encoding.ASCII.GetBytes(Cmd + vbCrLf) MsgBox(Cmd) 'send the data s.Write(bCmd, 0, bCmd.Length) SendCmd = getData() End Function Public Function getMail(ByRef m As MailMessage) As Boolean Dim msg As String Dim hend As Integer 'if you haven't already go the message size 'get it If m.Size = -1 Then getSize(m) End If 'make sure the buffer is big enough to hold the message. 'to be sure make it just a little bigger t.ReceiveBufferSize = m.Size msg = SendCmd("retr " + m.ID.ToString + " 0") 'check the command was accepted OK If Left(msg, 3) = "+OK" Then 'find the end of the header. 'this is denoted by the first empty line in the message hend = msg.IndexOf(vbCrLf + vbCrLf) 'set the header setHeader(m, Left(msg, hend)) 'set the mail body 'this is everything after the header. m.Body = msg.Substring(hend + 4) Return True Else Return False End If End Function |
Het is een gedeelte van de code uit een klasse om mailtjes van een POP server te halen.
Als ik de klasse in een .vb file in mijn asp.net webapplicatie zet dan werkt alles perfect.
Maar als ik de vb als class library project pak en compile tot een .dll en deze gebruik in mijn Windows Forms applicatie knal hij er uit op het einde bij de regel
Visual Basic:
1
| setHeader(m, Left(msg, hend)) |
(regel 46)Hier bij heeft hend de waarde -1.
Hend heeft dus de posititie van waar de header van de mail ophoudt (1e lege regel). Maar als .dll vindt hij deze positie niet. Ik heb een gedebugged en de plaats van het probleem gevonden:
Als ik
Visual Basic:
(regel 39)1
| msg = SendCmd("retr " + m.ID.ToString + " 0") |
uitvoer wordt het commando op de POP server uitgevoerd om de mail binnen te halen.
Als eerste response krijg ik:
+OK
Wat klopt, betekend gewoon dat commando dat ik stuur klopt. Hierna moet dus het mailtje komen maar GetData krijgt niks meer binnen (of doet het verkeerd). Mijn vraag is waarom gaat het daar fout? Nogmaals... met telnet naar popserver en exact dezelfde handelingen uitvoeren werkt wel. En de klasse als losse .vb file in asp.net app werkt ook, gaat dus alleen mis als de klasse apart als gecompileerde assembly/dll/class library in een windows form gebruikt wordt.
De code heb ik overigens van http://www.aspalliance.com/damianm/article1/3/
edit:
Belangrijk punt dat ik vergeten was. Het gaat alleen verkeerd bij het binnenhalen van het eerste emailtje. De klasse kan terug geven hoeveel mailtjes erop de server staan en dat getal gebruik ik in een FOR NEXT loop om ze 1 voor 1 op te halen. Het probleem is niet dat loopje met 0 begint oid. Hij begint bij gewoon bij 1
Belangrijk punt dat ik vergeten was. Het gaat alleen verkeerd bij het binnenhalen van het eerste emailtje. De klasse kan terug geven hoeveel mailtjes erop de server staan en dat getal gebruik ik in een FOR NEXT loop om ze 1 voor 1 op te halen. Het probleem is niet dat loopje met 0 begint oid. Hij begint bij gewoon bij 1
[ Voor 8% gewijzigd door Verwijderd op 12-02-2003 09:18 ]