Este artículo presenta el código de implementación de Java de un programa simple de remitente de correo electrónico. Se comparte con usted para su referencia. El contenido específico es el siguiente
En este código, hay varios puntos de atención para enfatizar :
1. Use el socket para obtener una conexión con el servidor de correo SMTP, preste atención al nombre de host del servidor SMTP;
2. Al usar el comando de datos, si se escribe el sujeto, debe haber una línea en blanco entre el cuerpo del correo electrónico y el sujeto, es decir, "Enter + Line Break", que es /r /n en el código;
3. También es necesario codificar el nombre de usuario y contraseña de correo electrónico del remitente antes de pasarlo al servidor SMTP;
4. El programa todavía tiene una advertencia al compilar. Esto se debe a que la clase Sun.Misc.Base64Coder existe en el paquete RT.JAR. Dado que el JDK se actualizará y actualizará, algunas clases en el paquete pueden cambiar y no estar disponibles, por lo que el compilador emitirá una advertencia.
Además, después de escribir estos códigos, se encontraron algunos problemas :
1. Los servidores de correo de smtp.qq.com y smtp.sina.com no saben por qué no se pueden usar. Es decir, cuando la dirección de correo electrónico del remitente es QQ o SINA, este programa ya no es útil y el código de respuesta de estado no puede entenderse. En mis pruebas, solo se puede usar SMTP.163.com. Es obvio que estos servidores SMTP se encontraron en el sitio web oficial, entonces, ¿por qué no se pueden usar? Es tan extraño. Cualquiera que sepa espera decirme, ¡gracias!
2. En el método sendEmail () en la clase SimpleMailSender a continuación, algunos códigos duplicados son confusos, pero no hay forma, todavía no lo entiendo ...
3. Descubrimiento importante: Me sorprende que el correo electrónico de QQ reciba correos a una velocidad que puede ser docenas de veces más rápido que 163 correos electrónicos y correos electrónicos de Sina. Además, al usar el comando nslookup para consultar el nombre de host de smtp.qq.com, descubrió que tiene muchos servidores SMTP, al menos 5 más de 163 3. Tencent es realmente poderoso;
4. Aunque puedo enviar maliciosamente los correos electrónicos a una determinada dirección de correo electrónico después de escribir este programa, descubrí que cuando envíe docenas de correos electrónicos a otra dirección de correo electrónico fija en sucesión con una dirección de correo electrónico de SINA, la dirección de correo electrónico de SINA será rechazada si quiero enviar un correo electrónico. Ten cuidado.
El código es el siguiente:
// Clase de correo electrónico E_mail {cadena desde; Cadena a; Sujeto de cadena; Contenido de cadena; Nombre de usuario de cadena; Cadena pwd; public e_mail (string from, string to, string stem, string content, string username, string pwd) {this.from = desde; this.to = a; this.subject = sujeto; this.content = content; this.Username = this.tobase64 (nombre de usuario); this.pwd = this.tobase64 (pwd); } / *** Transcode el nombre de usuario y la contraseña en la clase E_MAIL* / String private Tobase64 (String Str) {return (new Sun.Misc.Base64Encoder (). ENCODE (STR.GETBYTES ())); }} // Clase de remitente de correo simple para implementar la función de envío de la clase pública simplemailsender {string private smtPserver; Private Int Port = 25; enchufe privado; BufferedReader BR; PrintWriter PW; / *** Determine el servidor de correo SMTP basado en la dirección de correo electrónico del remitente*/ 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 correo electrónico) {try {this.initserver (correo electrónico.from); this.socket = nuevo socket (Smtpserver, puerto); this.br = this.getReader (socket); this.pw = this.getWriter (socket); // Comience a ensamblar la secuencia de comando para enviar correos electrónicos send_RECEive (nulo); // Recibe el mensaje de que la conexión al servidor SMTP send_RECEive ("ehlo hao"); send_Receive ("Authic Login"); send_RECEive (CORRAGE.USERNAME); send_RECEive (CORRAGE.PWD); send_RECEive ("Correo de: <" + email.from + ">"); send_RECEive ("rcpt a: <" + correo electrónico.to + ">"); send_Receive ("datos"); // Envíe contenido por correo electrónico pw.println ("De:" + correo electrónico.from); pw.println ("a:" + email.to); // Asegúrese de vaciar una línea entre el sujeto y el texto, es decir, agregar "/r/n" pw.println ("sujeto:" + correo electrónico.subject + "/r/n"); // Imprima el contenido de correo electrónico en la consola System.out.println ("De:" + email.from); System.out.println ("To:" + email.to); System.out.println ("Sujeto:" + Correo electrónico.subject + "/r/n"); System.out.println (Correo electrónico.content); // Envíe un correo electrónico al cuerpo pw.println (correo electrónico.content); // Recuerda terminar el texto con "." send_Receive ("."); send_RECEive ("salir"); } catch (ioException e) {E.PrintStackTrace (); } finalmente {try {if (socket! = null) socket.close (); } catch (ioException e) {E.PrintStackTrace (); }}}/** * Cada vez que se envía un comando, "/r/n" debe agregarse después del comando, * El código de estado correspondiente del servidor de correo SMTP se imprimirá al mismo tiempo * @param comando */private void send_RECEive (string command) lanza ioexception {if (command! = Null) {// Enviar comandos a los comandos de correo smtp, recordar el servidor de correo smtp, acudir "/n n". pw.print (comando + "/r/n"); pw.flush (); System.out.println ("Usuario >>" + comando); } char [] respuesta = nuevo char [1024]; br.Read (respuesta); System.out.println (respuesta); } / *** Obtenga la secuencia de salida de Socket* / Private PrintWriter GetWriter (Socket Socket) lanza IOException {outputStream Socketout = Socket.getOutputStream (); devolver nuevo PrintWriter (Socketout, True); } / *** Obtenga la secuencia de entrada de Socket* / Private BufferedReader GetReader (Socket Socket) lanza IOException {InputStream Socketin = Socket.GetInputStream (); devolver nuevo BufferedReader (nuevo InputStreamReader (SocketIn)); } // prueba public static void main (string [] args) {new MailSenderGui (); }} // Interfaz del programa del remitente de correo La clase MailsenderGui extiende JFrame implementos ActionListener {private JLabel UserNamElabel; Privado JTextfield UserNamefield; Privado Jlabel Pwdlabel; Private JPasswordfield Pwdfield; Privado Jlabel FromLabel; privado jtextfield fromfield; Privado Jlabel Tolabel; privado jtextfield tofield; Jlabel privado Jlabel Custandlabel; Jlabel ContentLabel privado; JTEXTAREA PRIVADA ContentArea; JBUTTON PRIVADO SENTBTN; JBUTTON PRIVADO CancelBTN; correo electrónico privado e_mail; PRIVADO SimpleMailsender Mailsender; public mailsenderGui () {this.init (); this.mailsender = new SimpleMailSender (); } private void init () {this.fromLabel = new JLabel ("Dirección de correo electrónico del remitente:"); this.fromfield = new JTextfield (25); this.Usernamelabel = new JLabel ("Nombre de usuario:"); this.usernamefield = new JTextfield (25); this.pwdlabel = new JLabel ("Password:"); this.pwdfield = new JPasswordfield (25); this.tolabel = new JLabel ("Dirección de correo electrónico del destinatario:"); this.tofield = new JTextfield (25); this.subjectLabel = new JLabel ("Asunto de correo electrónico:"); this.subjectfield = new JTextfield (20); this.contentLabel = new JLabel ("Correo de correo electrónico:"); this.contenerea = new JTexTarea (15, 20); this.settitle ("Ant-> remitente de correo simple"); this.setBounds (200, 30, 500, 500); this.setLayout (new BorderLayout ()); this.setDefaultCloseOperation (jframe.exit_on_close); this.setVisible (verdadero); this.sendBtn = new JButton ("Enviar"); this.cancelbtn = new JButton ("RESET"); this.sendbtn.addactionListener (this); this.cancelbtn.addactionListener (this); Jpanel uppanel = new JPanel (nuevo 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 (Sujetfield); uppanel.add (contentLabel); this.add (Uppanel, borderLayout.north); this.Add (ContentArea, BorderLayout.Center); Jpanel downpanel = new JPanel (nuevo 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.gettext (), this.subjectfield.gettext (), this.contenerea.gettext (), this.usExttExt (), (). String (this.pwdfield.getPassword ())); this.mailsender.sendemail (this.email); } else if (e.getSource () == this.cancelbtn) {this.fromfield.setText (nulo); this.tofield.settext (nulo); this.subjectfield.settext (nulo); this.contentarea.settext (nulo); }}}Lo anterior es todo el código para escribir programas de envío de correo electrónico simples en Java, con la esperanza de que sea útil para el aprendizaje de todos.