Cet article présente le code d'implémentation Java d'un programme d'expéditeur de messagerie simple. Il est partagé avec vous pour votre référence. Le contenu spécifique est le suivant
Dans ce code, il y a plusieurs points d'attention à souligner :
1. Utilisez Socket pour obtenir une connexion avec le serveur de messagerie SMTP, faites attention au nom d'hôte du serveur SMTP;
2. Lorsque vous utilisez la commande de données, si le sujet est écrit, il doit y avoir une ligne vierge entre le corps de l'e-mail et le sujet, c'est-à-dire "Entrez + Break", qui est / r / n dans le code;
3. Il est également nécessaire de codager la base64 du nom d'utilisateur et du mot de passe de l'expéditeur avant de le passer au serveur SMTP;
4. Le programme a toujours un avertissement lors de la compilation. En effet Étant donné que le JDK sera mis à jour et mis à niveau, certaines classes du package peuvent changer et être indisponibles, de sorte que le compilateur émettra un avertissement.
De plus, après avoir écrit ces codes, certains problèmes ont été trouvés :
1. Les serveurs de courrier de SMTP.QQ.com et SMTP.Sina.com ne savent pas pourquoi ils ne peuvent pas être utilisés. C'est-à-dire que lorsque l'adresse e-mail de l'expéditeur est QQ ou SINA, ce programme n'est plus utile et que le code de réponse d'état ne peut pas être compris. Dans mes tests, seuls SMTP.163.com peut être utilisé. Il est évident que ces serveurs SMTP ont été trouvés sur le site officiel, alors pourquoi ne peuvent-ils pas être utilisés? C'est tellement étrange. Quiconque sait espère me le dire, merci!
2. Dans la méthode SendEmail () dans la classe SimpleMailSender ci-dessous, certains codes en double sont déroutants, mais il n'y a aucun moyen, je ne le comprends toujours pas ...
3. Découverte majeure: je suis surpris que l'e-mail QQ reçoive des courriers à une vitesse qui peut être des dizaines de fois plus rapidement que 163 e-mails et e-mails SINA. De plus, lorsque vous utilisez la commande nslookup pour interroger le nom d'hôte de smtp.qq.com, il a constaté qu'il possède de nombreux serveurs SMTP, au moins 5 plus de 163 3. Tencent est vraiment puissant;
4. Bien que je puisse envoyer des e-mails avec malveillance à une certaine adresse e-mail après avoir écrit ce programme, j'ai constaté que lorsque j'envoie des dizaines d'e-mails à une autre adresse e-mail fixe avec une adresse e-mail SINA, l'adresse e-mail SINA sera rejetée si je souhaite envoyer un e-mail. Sois prudent.
Le code est le suivant:
// Email class e_mail {String from; Chaîne à; Sujet de chaîne; String Content; Nom d'utilisateur de chaîne; Chaîne pwd; public e_mail (String From, String to, String Sujet, String Content, String Username, String pwd) {this.from = from; this.to = to; this.subject = sujet; this.Content = contenu; this.UserName = this.tobase64 (nom d'utilisateur); this.pwd = this.tobase64 (pwd); } / ** * Transcode Nom d'utilisateur et mot de passe dans E_Mail Class * / private String tobase64 (String Str) {return (new Sun.Misc.Base64Encoder (). Encode (str.getBytes ())); }} // Classe d'expéditeur de courrier simple pour implémenter la fonction publique de fonction d'envoi simplemailSender {private String smtpServer; port int privé = 25; prise à douille privée; BufferedReader BR; Printwriter PW; / ** * Déterminer le serveur de messagerie SMTP en fonction de l'adresse e-mail de l'expéditeur * / private void initserver (String from) {if (from.contains ("@ 163")) {this.smtpServer = "smtp.163.com"; } else if (from.contains ("@ 126")) {this.smtpServer = "smtp.126.com"; } else if (from.contains ("@ sina")) {this.smtpServer = "smtp.sina.com"; } else if (from.contains ("@ qq")) {this.smtpServer = "smtp.qq.com"; }} public void SendEmail (e_mail e-mail) {try {this.initServer (email.from); this.socket = new socket (smtpServer, port); this.br = this.getReader (socket); this.pw = this.getWriter (socket); // Commencez à assembler la séquence de commande pour l'envoi de courriels Send_receive (null); // reçoit le message que la connexion au serveur SMTP Send_Receive ("ehlo hao"); send_receive ("Auth Login"); send_receive (email.userName); send_receive (email.pwd); send_receive ("mail from: <" + email.from + ">"); send_receive ("rcpt à: <" + email.to + ">"); send_receive ("data"); // contenu par e-mail pw.println ("de:" + email.from); pw.println ("à:" + email.to); // Assurez-vous de vider une ligne entre le sujet et le texte, c'est-à-dire ajouter "/ r / n" pw.println ("Sujet:" + email.subject + "/ r / n"); // Imprime le contenu des e-mails sur la console System.out.println ("From:" + email.from); System.out.println ("à:" + e-mail.to); System.out.println ("Sujet:" + Email.Subject + "/ r / n"); System.out.println (email.content); // Email Body PW.println (email.content); // N'oubliez pas de terminer le texte avec "." send_receive ("."); send_receive ("quit"); } catch (ioException e) {e.printStackTrace (); } enfin {try {if (socket! = null) socket.close (); } catch (ioException e) {e.printStackTrace (); }}} / ** * Chaque fois qu'une commande est envoyée, "/ r / n" doit être ajoutée après la commande, * le code d'état correspondant du serveur de messagerie SMTP sera imprimé en même temps * @param commande * / private void Send_receive (String Commande) lance ioException {if (Commande! = NULL) {// Send Commandes à le serveur de messagerie SMTP, Souvenez-vous pour ajouter "! pw.print (commande + "/ r / n"); pw.flush (); System.out.println ("utilisateur >>" + commande); } char [] réponse = nouveau char [1024]; br.read (réponse); System.out.println (réponse); } / ** * Obtenez le flux de sortie de socket * / private printwriter getWriter (socket socket) lève ioException {OutputStream socketout = socket.getOutputStream (); return new PrintWriter (Socketout, true); } / ** * Obtenez le flux d'entrée de socket * / privé BuffereDader GetReader (socket socket) lève ioException {inputStream socketIn = socket.getInputStream (); Renvoie un nouveau bufferedReader (nouveau InputStreamReader (sockettin)); } // Tester public static void main (String [] args) {new MailSenderGui (); }} // Classe d'interface du programme de l'expéditeur Mail MailSenderGui étend JFrame implémente ActionListener {private jLabel userNameLabel; Private Jtexfield Usernamefield; JLabel privé PWDLABEL; JPASSWORDFIELD privé PWDFIELD; JLABEL privé de FromLabel; Jtexfield privé Fromfield; Jlabel Tolabel privé; Jtexfield privé Tofield; Private Jlabel SubjectLabel; JLABEL PRIVÉE ContentLabel; JEXTAREA PRIVÉE ContentArea; JBUTTON SENDBTN privé; JBUTTON PRIVÉ CANCELBTN; e-mail privé e_mail; SIMPLEMAILSENSEN PRIVÉ MAISSENDER; MailSenderGui public () {this.init (); this.mailSender = new SimpleMailSender (); } private void init () {this.fromLabel = new JLabel ("Adresse e-mail de l'expéditeur:"); this.fromField = new JTextfield (25); this.UserAmElabel = new JLabel ("nom d'utilisateur:"); this.UserNameField = new JTextfield (25); this.pwdLabel = new JLabel ("mot de passe:"); this.pwdfield = new JPasswordField (25); this.tolabel = new JLabel ("Adresse e-mail du destinataire:"); this.tofield = new JTextfield (25); this.subjectLabel = new JLabel ("Sujet e-mail:"); this.SubjectField = new JTextfield (20); this.ContentLabel = new JLabel ("Courrier:"); this.ContentArea = new JTextArea (15, 20); this.setTitle ("ant -> SIMPLE MAIL SENDER"); this.setbounds (200, 30, 500, 500); this.setLayout (new BorderLayout ()); this.setDefaultCloseOperation (jframe.exit_on_close); this.setVisible (true); this.sendbtn = new JBUTTON ("Send"); this.cancelbtn = new Jbutton ("réinitialiser"); this.sendbtn.addactionListener (this); this.cancelbtn.addactionListener (this); Jpanel uppanel = new JPanel (nouveau gridlayout (6, 2, 5, 5)); uppanel.add (FromLabel); uppanel.add (FromField); uppanel.add (userNameLabel); uppanel.add (pwdLabel); uppanel.add (pwdfield); uppanel.add (Tolabel); uppanel.add (tofield); uppanel.add (tofield); uppanel.add (SubjectLabel); uppanel.add (Subterfield); uppanel.add (contentLabel); this.add (uppanel, borderlayout.north); this.add (contentarea, borderlayout.center); Jpanel downpanel = new JPanel (new FlowLayout (FlowLayout.Center)); Downpanel.add (SendBtn, BorderLayout.South); Downpanel.add (Cancelbtn, BorderLayout.South); this.add (downpanel, borderlayout.south); } @Override public void ActionPerformed (ActionEvent e) {if (e.getsource () == this.sendbtn) {this.email = new e_mail (this.fromfield.getText (), this.tofield.gettex String (this.pwdfield.getpassword ())); this.mailSender.Sendemail (this.email); } else if (e.getSource () == this.cancelbtn) {this.fromField.setText (null); this.tofield.setText (null); this.SubjectField.seTText (null); this.ContentArea.setText (null); }}}Ce qui précède est tout le code pour écrire des programmes d'envoi de courriels simples en Java, en espérant que cela sera utile à l'apprentissage de tous.