[.NET] POP3 MAIL naar MailMessage

Pagina: 1
Acties:

  • vinnux
  • Registratie: Maart 2001
  • Niet online
.NET beschikt niet over een eigen POP3 klasse waarmee het mogelijk is om berichten op te halen. Voor dit doeleinde heb ik een POP3 klasse geschreven.

Ik heb twee vragen:
Alles wat ik naar de server stuur haal ik door een System.Text.Encoding.ASCII, echter weet ik niet welke codering ik moet gebruiken voor hetgeen ik terug krijg. Iemand een idee?

De klasse levert mij heel mooi een hele lang string met de inhoud van het mailtje. Dit doormiddel van het commando RETR <number>. Echter valt er op deze ruwe manier weinig met deze berichten te beginnen, zeker als er attachements inzitten en het b.v. MIME messages zijn.
Nu heeft .NET een mooie klasse System.Web.MailMessage, echter hoe krijg ik de string die ik heb makkelijk omgezet naar dit object of een soortgelijk object?

Het lijkt mij toch niet de bedoeling dat ik zelf de header ga parsen etc en dan de juiste properties zet in het betreffende object?

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 22:24

gorgi_19

Kruimeltjes zijn weer op :9

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • vinnux
  • Registratie: Maart 2001
  • Niet online
Dat gedeelte heb ik al geprogrammeerd, echter gaat het er mij vooral om om de attachements eruit te halen.

  • vinnux
  • Registratie: Maart 2001
  • Niet online
Ondertussen ben ik al begonnen met handmatig parsen, maar dat is echt super irritant. Niemand een ander idee?

Verwijderd

Indy misschien iets? Ik weet niet in welke taal je progt?

http://www.indyproject.org/

Het project is nog niet helemaal af maar pop3 zit er sowieso al in...

[ Voor 31% gewijzigd door Verwijderd op 04-02-2004 16:21 ]


  • vinnux
  • Registratie: Maart 2001
  • Niet online
Ik programmeer in C#
Om misschien wat meer te motiveren hier hetgeen ik tot nu toe geschreven heb.
Dit is en werkende POP3 Client. Hij is nog niet helemaal uitegwerkt en commentaar is nog ver te zoeken. Maar misschien kunnen jullie er iets mee?
code:
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
    public enum POP3ClientState  {
        DISCONNECTED    ,
        AUTHORIZATION   ,
        CONNECTED           
  };

    class POP3Client    {
        public const int DEFAULT_PORT    = 110;
        public const int MAX_NBO_ATTEMPS = 3;
        
        private String                  name;
        private String                  hostname;
        private int                         port;
                         
        private POP3ClientState state;
        private TcpClient               server;
        private NetworkStream       serverWriter;
        private StreamReader        serverReader;
        
        public POP3Client():this(null,null,DEFAULT_PORT) {
        }

        public POP3Client(String name, String hostname):this(name,hostname,DEFAULT_PORT) {
        }

        public POP3Client(String name, String hostname, int port) {
            this.name           = name;
            this.hostname = hostname;
            this.port           = port;
            this.state      = POP3ClientState.DISCONNECTED;
        }

        #region Reading and Writing to Server
        private bool Write(String command) {
            return Write(command,true);
        }

        private String Read(){
            return Read(-1);
        }

        private String Read(int nboBytes){
            string data = null;
            System.Text.StringBuilder buffer = new System.Text.StringBuilder();
            if(nboBytes == -1){
                string line = "";
                line = ReadLine();
                while (line != "."){
                    buffer.Append(ReadLine()+"\r\n");
                }
                data = buffer.ToString();
            } else {
                char[] charBuffer = new char[nboBytes];
                serverReader.Read(charBuffer,0,nboBytes);
                buffer.Append(charBuffer);
                data = buffer.ToString();
                ReadLine();
            }
            return data;
        }

        private bool Write(String command, bool addCRLF){
            bool ok = false;
            if(state == POP3ClientState.DISCONNECTED)
                return ok;
            
            if(addCRLF)
                command += "\r\n";
            Console.Write(command);
            byte[] data = System.Text.Encoding.ASCII.GetBytes(command.ToCharArray());
            serverWriter.Write(data,0,data.Length);
            ok = true;
            return ok;
        }

        private String ReadLine(){
            String data = serverReader.ReadLine();
            Console.WriteLine(data);
            return data;
        }
        #endregion
        #region POP3 commands : USER,QUIT,PASS,RETR,STAT
        private bool USER(string user){
            bool ok = false;
            if(state != POP3ClientState.AUTHORIZATION){
                return ok;
            }
            if(Write("USER "+user) && !IsPOP3Error(ReadLine())){
                ok = true;  
            }
            return ok;
        }

        private bool QUIT(){
            bool ok = false;
            if(state != POP3ClientState.CONNECTED){
                return ok;
            }
            if(Write("QUIT") && !IsPOP3Error(ReadLine())){
                ok = true;  
            }
            return ok;
        }

        private bool PASS(string password){
            bool ok = false;
            if(state != POP3ClientState.AUTHORIZATION){
                return ok;
            }
            if(Write("PASS "+password) && !IsPOP3Error(ReadLine())){
                ok = true;  
            }
            return ok;
        }

        private String RETR(int number){
            String message = null;
            if(state != POP3ClientState.CONNECTED){
                return message;
            }
            if(Write("RETR "+number.ToString())){
                String line = ReadLine();
                if(!IsPOP3Error(line)){
                    message = "";
                    String[] parts = line.Split(new char[]{' '},3);
                    message = Read(Convert.ToInt32(parts[1]));
                }
            }
            return message;
        }

        private String STAT(){
            String data = null;
            if(state != POP3ClientState.CONNECTED){
                return data;
            }
            if(Write("STAT")){;
                data = ReadLine();
                if(IsPOP3Error(data)){
                    data = null;
                }
            }
            return data;
        }
        private bool DELE(int number){
            bool ok = false;
            if(state != POP3ClientState.CONNECTED){
                return ok;
            }
            if(Write("DELE "+number) && !IsPOP3Error(ReadLine())){
                ok = true;  
            }
            return ok;
        }
        private String LIST(int number){
            String data = null;
            if(state != POP3ClientState.CONNECTED){
                return data;
            }
            if(Write("LIST")){;
                data = ReadLine();
                if(IsPOP3Error(data)){
                    data = null;
                }
            }
            return data;
        }
        private String LIST(){
            String data = null;
            if(state != POP3ClientState.CONNECTED){
                return data;
            }
            if(Write("LIST ")){
                String line = ReadLine();
                if(!IsPOP3Error(line)){
                    data = Read();
                }
            }
            return data;
        }
        #endregion

        public String GetMessage(int number){
            return  RETR(number);
        }

        public int GetNBOMessages(){
            int nboMessages = -1;
            string line = STAT();
            if(line != null){
                String[] parts = line.Split(new char[]{' '},3);
                nboMessages = Convert.ToInt32(parts[1]);
            }
            return nboMessages;
        }
        

        private bool IsPOP3Error(String line){
            if(line.StartsWith("-"))
                return true;
            else
                return false;
        }

        public bool Disconnect(){
            bool disconnected = false;
            if(state != POP3ClientState.CONNECTED)
                return disconnected;
            if(QUIT()){
                try {
                    serverReader.Close();
                } catch {
                    ;
                }
                try {
                    serverWriter.Close();
                } catch {
                    ;
                }
                try {
                    server.Close();
                } catch {
                    ;
                }
                serverReader = null;
                serverWriter = null;
                server           = null;
                disconnected = true;
            }
            return disconnected;
        }

        public bool Connect(String user, String password){
            bool connected = false;
            if(state != POP3ClientState.DISCONNECTED){
                return connected;
            }
            for(int n=0 ; n < MAX_NBO_ATTEMPS; n++) {
                try {
                    server           = new TcpClient(this.hostname, this.port);
                    serverWriter = server.GetStream();
                    serverReader = new StreamReader(server.GetStream());
                    string line  = ReadLine();
                    state = POP3ClientState.AUTHORIZATION;
                    break;
                } catch (Exception e){
                    if (n == MAX_NBO_ATTEMPS -1)
                        throw e;
                }
            }

            if( USER(user) && PASS(password) ){
                state = POP3ClientState.CONNECTED;
                connected = true;
            }
            return connected;
        }
    
    }

[ Voor 3% gewijzigd door vinnux op 04-02-2004 19:33 ]


Verwijderd

vgouw schreef op 04 februari 2004 @ 14:27:
Ondertussen ben ik al begonnen met handmatig parsen, maar dat is echt super irritant. Niemand een ander idee?
Ik was ook bezig om zoiets handmatig te parsen, maar dit is bijna ondoenelijk, het is een takke werk om alle headers netje eruit te halen, de verschillende content-types zijn niet altijd op dezelfde manier gespecificeerd, de encoding van de meeste mailtjes is niet helemaal netjes, de mailclients spugen ook allemaal andere output uit, etc. etc.

Als iemand een oplossing heeft ben ik hem/haar eeuwig dankbaar, maar ik ben al een tijd op zoek geweest en nix kunnen vinden

  • vinnux
  • Registratie: Maart 2001
  • Niet online
Het valt wel te doen als je de RFC erbij houd. Na heel wat gepruts voldoet mijn POP3 client volledig aan de RFC1725 en ondersteund het de volgende commando's USER,QUIT,PASS,RETR,STAT,NOOP,RSET,UIDL,APOP.
Iemand interesse om messages te parsen in C# :?
Dan heb ik ook nog geen antwoord op de volgende vraag:
"Alles wat ik naar de server stuur haal ik door een System.Text.Encoding.ASCII, echter weet ik niet welke codering ik moet gebruiken voor hetgeen ik terug krijg. Iemand een idee? "

[ Voor 4% gewijzigd door vinnux op 04-02-2004 21:26 ]


Verwijderd

het hele POP pricipe heb ik niet nodig omdat mijn mailserver de mails direct in een database opslaat hierdoor hoef ik geen gebruik te maken van het POP protocol.

Maar ik heb dus een mail bestand in de originele smtp vorm dus met een clrlf.clrlf op het eind en de hele meuk aan headers etc.
Pagina: 1