Προγραμματισμός

Γρήγορη εκκίνηση JavaMail

Στο JavaMail θα βρείτε API και υλοποιήσεις παρόχων που σας επιτρέπουν να αναπτύξετε πλήρως λειτουργικές εφαρμογές πελάτη email. Οι "εφαρμογές πελατών ηλεκτρονικού ταχυδρομείου" προκαλούν σκέψεις για το Microsoft Outlook. και, ναι, θα μπορούσατε να γράψετε τη δική σας αντικατάσταση του Outlook. Αλλά ένας πελάτης email δεν χρειάζεται να βρίσκεται καθόλου σε έναν υπολογιστή-πελάτη. Πράγματι, θα μπορούσε να είναι ένα servlet ή ένα EJB που εκτελείται σε έναν απομακρυσμένο διακομιστή, παρέχοντας πρόσβαση στους τελικούς χρήστες σε email μέσω ενός προγράμματος περιήγησης στο Web. Σκεφτείτε το Hotmail (ναι, μπορείτε να γράψετε και τη δική σας έκδοση του Hotmail). Ή θα μπορούσατε να αποφύγετε εντελώς μια διεπαφή χρήστη. Τι γίνεται με έναν αυτόματο ανταποκριτή που διαβάζει εισερχόμενα μηνύματα και στέλνει απαντήσεις, προσαρμοσμένες σύμφωνα με τον αρχικό αποστολέα;

Στο δικό μου έργο κατοικίδιων ζώων, ένας πελάτης email που μιλάει διαβάζει - δηλαδή μιλάει - εισερχόμενα μηνύματα. Βασίζεται σε μια εκλεπτυσμένη ιδέα που εισήγαγα στο "Talking Java!" Θα σας πω περισσότερα για αυτό αργότερα.

Προς το παρόν, ξεκινήστε εγκαθιστώντας και διαμορφώνοντας το λογισμικό JavaMail.

Ρύθμιση

Εάν χρησιμοποιείτε Java 2 Platform, Enterprise Edition (J2EE) 1.3, είστε τυχεροί: περιλαμβάνει JavaMail, οπότε δεν απαιτείται πρόσθετη ρύθμιση. Εάν, ωστόσο, εκτελείτε Java 2 Platform, Standard Edition (J2SE) 1.1.7 και μεταγενέστερες εκδόσεις και θέλετε δυνατότητα email για τις εφαρμογές σας, πραγματοποιήστε λήψη και εγκατάσταση των εξής:

  • JavaMail
  • Πλαίσιο ενεργοποίησης JavaBeans

Για εγκατάσταση, απλώς αποσυμπιέστε τα ληφθέντα αρχεία και προσθέστε τα περιεχόμενα αρχεία βάζων στο classpath σας. Για παράδειγμα, εδώ είναι το classpath μου για αυτό το έργο:

.; C: \ Apps \ Java \ javamail-1.2 \ mail.jar; C: \ Apps \ Java \ javamail-1.2 \ mailapi.jar; C: \ Apps \ Java \ javamail-1.2 \ pop3.jar; C: \ Εφαρμογές \ Java \ javamail-1.2 \ smtp.jar; C: \ Apps \ Java \ jaf-1.0.1 \ activation.jar 

ο mailapi.jar Το αρχείο περιέχει τις βασικές κλάσεις API, ενώ το pop3.jar και smtp.jar Τα αρχεία περιέχουν τις εφαρμογές του παρόχου για τα αντίστοιχα πρωτόκολλα αλληλογραφίας. (Δεν θα χρησιμοποιήσουμε το imap.jar αρχείο σε αυτό το άρθρο.) Σκεφτείτε τις εφαρμογές του παρόχου ως παρόμοιες με τα προγράμματα οδήγησης JDBC (Java Database Connectivity), αλλά για συστήματα ανταλλαγής μηνυμάτων αντί για βάσεις δεδομένων. Οσον αφορα στο mail.jar αρχείο, περιέχει καθένα από τα παραπάνω αρχεία βάζων, ώστε να μπορείτε να περιορίσετε το classpath σας μόνο στο mail.jar και activation.jar αρχεία.

ο activation.jar Το αρχείο σάς επιτρέπει να χειρίζεστε τύπους MIME (επεκτάσεις αλληλογραφίας πολλαπλών χρήσεων) που είναι προσβάσιμοι μέσω δυαδικών ροών δεδομένων. Ψάξτε για το DataHandler τάξη στο Όχι απλό κείμενο ενότητα αργότερα.

Προς καταγραφή, το υπόλοιπο αυτού του άρθρου δεν προσφέρει ολοκληρωμένη κάλυψη API. μάλλον, θα μάθετε κάνοντας. Αν είναι σε βάθος πληροφορίες API που ψάχνετε, τότε κοιτάξτε τα αρχεία PDF και τα Javadocs που περιλαμβάνονται στα αντίστοιχα πακέτα λήψης.

Μόλις εγκαταστήσετε το λογισμικό, θα πρέπει να λάβετε λεπτομέρειες λογαριασμού email για να εκτελέσετε τα παραδείγματα που ακολουθούν. Θα χρειαστείτε το όνομα διακομιστή SMTP (Simple Mail Transfer Protocol) και το όνομα διακομιστή POP (Post Office Protocol), το όνομα σύνδεσης του λογαριασμού email σας και τον κωδικό πρόσβασης του γραμματοκιβωτίου σας. Το σχήμα 1 δείχνει τις λεπτομέρειες μου - όχι τις πραγματικές, καταλαβαίνετε - όπως χρησιμοποιείται από το Microsoft Outlook.

Αποστολή email μέσω SMTP

Το πρώτο παράδειγμα δείχνει πώς μπορείτε να στείλετε ένα βασικό μήνυμα email μέσω SMTP. Παρακάτω, θα βρείτε το SimpleSender τάξη, η οποία παίρνει τα στοιχεία του μηνύματός σας από τη γραμμή εντολών και καλεί μια ξεχωριστή μέθοδο - στείλετε(...) - για να το στείλετε:

πακέτο com.lotontech.mail; εισαγωγή javax.mail. *; εισαγωγή javax.mail.internet. *; εισαγωγή java.util. *; / ** * Μια απλή τάξη αποστολέα email. * / Public class SimpleSender {/ ** * Κύρια μέθοδος για την αποστολή μηνύματος που δίνεται στη γραμμή εντολών. * / public static void main (String args []) {δοκιμάστε {String smtpServer = args [0]; Συμβολοσειρά στο = args [1]; Συμβολοσειρά από = args [2]; Θέμα συμβολοσειράς = args [3]; String body = args [4]; αποστολή (smtpServer, προς, από, θέμα, σώμα); } catch (Εξαίρεση ex) {System.out.println ("Usage: java com.lotontech.mail.SimpleSender" + "smtpServer toAddress fromAddress subjectText bodyText"); } System.exit (0); } 

Στη συνέχεια, τρέξτε SimpleSender ως κατωτέρω. Αντικαθιστώ smtp.myISP.net με τον δικό σας διακομιστή SMTP, όπως προκύπτει από τις ρυθμίσεις αλληλογραφίας σας:

> java com.lotontech.mail.SimpleSender smtp.myISP.net [email protected] [email protected] "Γεια" "Απλώς για να πω Γεια." 

Και, εάν λειτουργεί, στο τέλος λήψης θα δείτε κάτι σαν αυτό που φαίνεται στο Σχήμα 2.

ο στείλετε(...) η μέθοδος ολοκληρώνει το SimpleSender τάξη. Θα δείξω πρώτα τον κώδικα και μετά θα αναλύσω λεπτομερώς τη θεωρία:

 / ** * μέθοδος "αποστολή" για αποστολή του μηνύματος. * / public static void send (String smtpServer, String to, String from, String subject, String body) {δοκιμάστε {Properties props = System.getProperties (); // - Σύνδεση στην προεπιλεγμένη περίοδο σύνδεσης, ή θα μπορούσαμε να ξεκινήσουμε μια νέα - props.put ("mail.smtp.host", smtpServer); Session session = Session.getDefaultInstance (props, null); // - Δημιουργία νέου μηνύματος - Μήνυμα msg = νέο MimeMessage (συνεδρία); // - Ορίστε τα πεδία FROM και TO - msg.setFrom (νέο InternetAddress (από)); msg.setRecipients (Message.RecipientType.TO, InternetAddress.parse (σε, false)); // - Θα μπορούσαμε επίσης να συμπεριλάβουμε παραλήπτες CC - // if (cc! = Null) // msg.setRecipients (Message.RecipientType.CC //, InternetAddress.parse (cc, false)); // - Ορίστε το θέμα και το κύριο κείμενο - msg.setSubject (θέμα); msg.setText (σώμα); // - Ορίστε μερικές άλλες πληροφορίες κεφαλίδας - msg.setHeader ("X-Mailer", "LOTONtechEmail"); msg.setSentDate (νέα ημερομηνία ()); // - Στείλτε το μήνυμα - Transport.send (msg); System.out.println ("Το μήνυμα εστάλη ΟΚ."); } catch (Exception ex) {ex.printStackTrace (); }}} 

Αρχικά, παρατηρήστε ότι λαμβάνετε μια συνεδρία αλληλογραφίας (java.mail.Session), χωρίς την οποία δεν μπορείτε να κάνετε τίποτα. Σε αυτήν την περίπτωση καλείτε Session.getDefaultInstance (...) για να λάβετε μια κοινόχρηστη συνεδρία, την οποία άλλες εφαρμογές επιτραπέζιου υπολογιστή μπορεί να επαναχρησιμοποιήσουν Μπορείτε επίσης να δημιουργήσετε μια εντελώς νέα συνεδρία - μέσω του Session.getInstance (...) μέθοδος - αυτό θα ήταν μοναδικό για την εφαρμογή σας. Το τελευταίο θα μπορούσε να αποδειχθεί σημαντικό για τους πελάτες email που δεν είναι απομονωμένοι σε βάση ανά χρήστη, όπως ένα σύστημα email που βασίζεται στο Web που εφαρμόζεται με servlets.

Η δημιουργία μιας περιόδου λειτουργίας απαιτεί να ορίσετε συγκεκριμένες ιδιότητες. τουλάχιστον, χρειάζεστε το mail.smtp.host ιδιοκτησία εάν στέλνετε μηνύματα μέσω SMTP. Θα βρείτε άλλες ιδιότητες που περιγράφονται στην τεκμηρίωση API.

Μόλις πραγματοποιήσετε μια συνεδρία, δημιουργήστε ένα μήνυμα. Σε αυτό το παράδειγμα, ρυθμίζετε τα μηνύματα από και προς την διευθύνσεις email, το θέμα, και το σώμα κείμενο, όλα λαμβάνονται αρχικά από τη γραμμή εντολών. Ρυθμίζετε επίσης ορισμένες πληροφορίες κεφαλίδας, συμπεριλαμβανομένης της ημερομηνίας και μπορείτε να καθορίσετε cc παραλήπτες αν θέλετε.

Τέλος, στέλνετε το μήνυμα μέσω του javax.mail.Transport τάξη. Εάν αναρωτιέστε πώς ξέρει για τη συνεδρία αλληλογραφίας μας, ρίξτε μια ματιά στον κατασκευαστή του μηνύματος.

Όχι απλό κείμενο

ο setText (...) μέθοδο ευκολίας στην τάξη javax.mail.Message (κληρονομήθηκε από το javax.mail. Μέρος διεπαφή) ορίζει το περιεχόμενο του μηνύματος στην παρεχόμενη συμβολοσειρά και ορίζει τον τύπο MIME σε κείμενο / απλό.

Ωστόσο, δεν περιορίζεστε σε απλό κείμενο: μπορείτε να στείλετε άλλους τύπους περιεχομένου μέσω του setDataHandler (...) μέθοδος. Στις περισσότερες περιπτώσεις, μπορείτε να χρησιμοποιήσετε "άλλους τύπους περιεχομένου" ως συνημμένα αρχεία, όπως έγγραφα του Word, αλλά για κάτι πιο ενδιαφέρον, δείτε αυτόν τον κωδικό για την αποστολή ενός σειριακού αντικειμένου Java:

ByteArrayOutputStream byteStream = νέο ByteArrayOutputStream (); ObjectOutputStream objectStream = νέο ObjectOutputStream (byteStream); objectStream.writeObject (theObject); msg.setDataHandler (νέο DataHandler (νέο ByteArrayDataSource (byteStream.toByteArray (), "lotontech / javaobject"))); 

Δεν θα βρείτε το DataHandler τάξη εντός του javax.mail. * δομή πακέτου επειδή ανήκει στο πακέτο JavaBeans Activation Framework (JAF) javax.activation. Θυμηθείτε, κατεβάσατε τη διανομή JAF καθώς και το JavaMail. Η JAF παρέχει έναν μηχανισμό χειρισμού δακτυλογραφημένος περιεχόμενο δεδομένων, το οποίο για περιεχόμενο Διαδικτύου σημαίνει τύπους MIME.

Και αν δοκιμάσετε πραγματικά τον παραπάνω κωδικό για να στείλετε ένα αντικείμενο Java μέσω email, θα έχετε πρόβλημα να εντοπίσετε το ByteArrayDataSource τάξη, καθώς ούτε και τα δύο mail.jar ούτε activation.jar συμπεριλάβετε το. Δοκιμάστε να αναζητήσετε στον κατάλογο JavaMail demo!

Όσο για τα συνημμένα αρχεία που πιθανότατα θα σας ενδιαφέρουν αρχικά, θα δημιουργήσετε ένα javax.activation.FileDataSource παράδειγμα στο DataHandlerΚατασκευαστής. Φυσικά, δεν είναι πιθανό να στείλετε ένα αρχείο μόνο. μάλλον, θα είναι πιθανώς ένα συνημμένο σε ένα μήνυμα κειμένου. Για αυτό πρέπει να κατανοήσετε την έννοια των πολλαπλών μηνυμάτων, οπότε θα εισαγάγω αυτήν την ιδέα τώρα, στο πλαίσιο της λήψης email.

Λάβετε email μέσω POP3

Νωρίτερα, εισήγαγα το javax.mail. Μέρος διεπαφή που υλοποιήθηκε από javax.mail.Message. Θα εξηγήσω τώρα τα μέρη του μηνύματός του, τα οποία είναι σημαντικά σε αυτό το παράδειγμα. Για να ξεκινήσετε, ρίξτε μια ματιά στο Σχήμα 3.

Το σχήμα 3 δείχνει α Μήνυμα όπως δημιουργήθηκε στο προηγούμενο παράδειγμα που είναι ένα μήνυμα και ένα τμήμα μηνύματος, επειδή εφαρμόζει το Μέρος διεπαφή. Για οποιοδήποτε μέρος, μπορείτε να λάβετε το περιεχόμενό του (οποιοδήποτε αντικείμενο Java) και, στην περίπτωση ενός απλού μηνύματος κειμένου, το αντικείμενο περιεχομένου μπορεί να είναι Σειρά. Για ένα μήνυμα πολλαπλών τμημάτων, το περιεχόμενο θα είναι τύπου Πολλαπλό, από τα οποία μπορούμε να πιάσουμε τα μεμονωμένα μέρη του σώματος, τα οποία τα ίδια εφαρμόζουν Μέρος διεπαφή.

Στην πράξη, όλα θα γίνουν εμφανή καθώς περνάτε τον κώδικα για ένα SimpleReceiver τάξη, την οποία θα παρουσιάσω σε τρεις ενότητες: πρώτον, τον ορισμό της κατηγορίας και το κύριος(...) μέθοδος που λαμβάνει λεπτομέρειες σύνδεσης από τη γραμμή εντολών. δεύτερο, το λαμβάνω(...) μέθοδος που καταγράφει και μεταβαίνει στα εισερχόμενα μηνύματα. και τέλος, το printMessage (...) μέθοδος που εκτυπώνει τις πληροφορίες κεφαλίδας και το περιεχόμενο κάθε μηνύματος.

Εδώ είναι η πρώτη ενότητα:

πακέτο com.lotontech.mail; εισαγωγή javax.mail. *; εισαγωγή javax.mail.internet. *; εισαγωγή java.util. *; εισαγωγή java.io. *; / ** * Μια απλή τάξη δέκτη email. * / Δημόσια τάξη SimpleReceiver {/ ** * Κύρια μέθοδος λήψης μηνυμάτων από τον διακομιστή αλληλογραφίας που ορίζεται * ως ορίσματα γραμμής εντολών. * / public static void main (String args []) {δοκιμάστε {String popServer = args [0]; String popUser = args [1]; String popPassword = args [2]; λήψη (popServer, popUser, popPassword); } catch (Exception ex) {System.out.println ("Χρήση: java com.lotontech.mail.SimpleReceiver" + "popServer popUser popPassword"); } System.exit (0); } 

Θα σας οδηγήσω αργότερα σε μια σωστή δοκιμαστική μονάδα, αλλά προς το παρόν είναι η γραμμή εντολών για να την εκτελέσετε (θυμηθείτε να αντικαταστήσετε τα ορίσματα εντολών με τις ρυθμίσεις αλληλογραφίας σας):

> java com.lotontech.mail.SimpleReceiver pop.myIsp.net myUserName myPassword 

ο λαμβάνω(...) μέθοδος - καλείται από κύριος(...) - ανοίγει το POP3 INBOX και ακολουθεί τα μηνύματα με τη σειρά, κάθε φορά που καλείτε printMessage (...). Εδώ είναι ο κωδικός:

 / ** * μέθοδος "λήψης" για λήψη μηνυμάτων και επεξεργασία τους. * / δημόσια λήψη στατικού κενού (String popServer, String popUser, String popPassword) {Store store = null; Φάκελος φακέλων = null; δοκιμάστε {// - Κρατήστε την προεπιλεγμένη περίοδο λειτουργίας - Properties props = System.getProperties (); Session session = Session.getDefaultInstance (props, null); // - Κρατήστε ένα κατάστημα μηνυμάτων POP3 και συνδεθείτε σε αυτό - store = session.getStore ("pop3"); store.connect (popServer, popUser, popPassword); // - Προσπαθήστε να κρατήσετε τον προεπιλεγμένο φάκελο - folder = store.getDefaultFolder (); εάν (φάκελος == null) ρίξτε νέα εξαίρεση ("Χωρίς προεπιλεγμένο φάκελο"); // - ... και το INBOX - folder = folder.getFolder ("INBOX"); εάν (φάκελος == null) ρίξτε νέα εξαίρεση ("No POP3 INBOX"); // - Ανοίξτε το φάκελο μόνο για ανάγνωση - folder.open (Folder.READ_ONLY); // - Λάβετε τα περιτυλίγματα μηνυμάτων και επεξεργαστείτε τα - Μήνυμα [] msgs = folder.getMessages (); για (int msgNum = 0; msgNum <msgs.length; msgNum ++) {printMessage (msgs [msgNum]); }} catch (Exception ex) {ex.printStackTrace (); } τέλος {// - Κλείσιμο ωραία - δοκιμάστε το {if (folder! = null) folder.close (false); if (store! = null) store.close (); } catch (Εξαίρεση ex2) {ex2.printStackTrace ();}}} 

Παρατηρήστε ότι λαμβάνετε ένα περιτύλιγμα αποθήκευσης μηνυμάτων POP3 από τη συνεδρία και, στη συνέχεια, συνδέεστε σε αυτό χρησιμοποιώντας τις ρυθμίσεις αλληλογραφίας που αρχικά παρέχονται στη γραμμή εντολών.

Μόλις συνδεθείτε, λαμβάνετε μια λαβή στον προεπιλεγμένο φάκελο - ουσιαστικά τη ρίζα του δέντρου φακέλων - και, από εκεί, τον φάκελο INBOX που κρατά τα εισερχόμενα μηνύματα. Ανοίγετε το INBOX για πρόσβαση μόνο για ανάγνωση. παίρνετε τα μηνύματα και περνάτε ένα προς ένα.

Εκτός αυτού, ίσως αναρωτιέστε εάν θα θέλατε ποτέ να ανοίξετε το INBOX για γράφω πρόσβαση. Εάν θέλετε να επισημάνετε τα μηνύματα ως ληφθέντα ή / και να τα αφαιρέσετε από το διακομιστή. Στο παράδειγμά μας, τα κοιτάζετε μόνο.

Τέλος, στον παραπάνω κώδικα φροντίζετε να κλείσετε το φάκελο και το κατάστημα μηνυμάτων όταν τελειώσετε, το οποίο αφήνει μόνο το printMessage (...) μέθοδος για την ολοκλήρωση αυτής της τάξης.

Εκτυπώστε τα μηνύματα

Σε αυτήν την ενότητα, το νωρίτερο javax.mail. Μέρος η συζήτηση διεπαφής γίνεται σχετική.