Este artigo apresenta o código de implementação do Java de um simples programa de remetente de e-mail. É compartilhado com você para sua referência. O conteúdo específico é o seguinte
Neste código, existem vários pontos de atenção para enfatizar :
1. Use o soquete para obter uma conexão com o servidor de email SMTP, preste atenção ao nome do host do servidor SMTP;
2. Ao usar o comando de dados, se o sujeito estiver escrito, deve haver uma linha em branco entre o corpo do email e o sujeito, ou seja, "ENTER + Break Line", que é /R /N no código;
3. Também é necessário a codificação Base64 do nome de usuário e senha de email do remetente antes de passá -lo para o servidor SMTP;
4. O programa ainda tem um aviso ao compilar. Isso ocorre porque a classe Sun.misc.Base64Encoder existe no pacote Rt.Jar. Como o JDK será atualizado e atualizado, algumas classes no pacote podem mudar e não estar disponíveis, para que o compilador emitirá um aviso.
Além disso, depois de escrever esses códigos, foram encontrados alguns problemas :
1. Os servidores de email do smtp.qq.com e smtp.sina.com não sabem por que eles não podem ser usados. Ou seja, quando o endereço de email do remetente é QQ ou Sina, este programa não é mais útil e o código de resposta de status não pode ser entendido. Nos meus testes, apenas SMTP.163.com pode ser usado. É óbvio que esses servidores SMTP foram encontrados no site oficial, então por que não podem ser usados? É tão estranho. Qualquer pessoa que saiba espera me dizer, obrigado!
2. No método sendEmail () na aula SimpleMailsender abaixo, alguns códigos duplicados são confusos, mas não há como, ainda não entendo ...
3. Descoberta Principal: Estou surpreso que o email QQ esteja recebendo e -mails a uma velocidade que pode ser dezenas de vezes mais rápida que 163 e -mails e e -mails do SINA. Além disso, ao usar o comando nslookup para consultar o nome do host de smtp.qq.com, descobriu que ele possui muitos servidores SMTP, pelo menos 5 a mais de 163 3. Tencent é realmente poderoso;
4. Embora eu possa enviar e -mails maliciosamente para um determinado endereço de e -mail depois de escrever este programa, descobri que, quando enviar dezenas de e -mails para outro endereço de e -mail fixo em sucessão com um endereço de email do Sina, o endereço de email do SINA será rejeitado se eu quiser enviar um email. Tome cuidado.
O código é o seguinte:
// classe de email e_mail {string de; String para; Sujeito da string; Conteúdo de string; Nome de usuário da string; String pwd; public e_mail (string de, string para, string Assunto, String Content, String UserName, string pwd) {this.from = de; this.to = para; this.subject = sujeito; this.content = content; this.Username = this.tobase64 (nome de usuário); this.pwd = this.tobase64 (PWD); } / *** Transcode o nome de usuário e a senha na classe e_mail* / private string tobase64 (string str) {return (new Sun.misc.Base64Encoder (). Encode (str.getBytes ())); }} // classe de remetente de correio simples para implementar a função de envio da classe pública SimpleMailsender {private string smtpServer; private int porta = 25; soquete privado soquete; BufferErader BR; PrintWriter PW; / *** Determine o servidor de correio SMTP com base no endereço de email do remetente*/ private void initServer (string de) {if (from.contains ("@163")) {this.smtpServer = "smtp.163.com"; } else if (de.Contains ("@126")) {this.smtpServer = "smtp.126.com"; } else if (from.contains ("@sina")) {this.smtpServer = "smtp.sina.com"; } else if (de.Contains ("@qq")) {this.smtpServer = "smtp.qq.com"; }} public void sendEmail (e_mail email) {try {this.initserver (email.from); this.socket = novo soquete (smtpServer, porta); this.br = this.getReader (soquete); this.pw = this.getWriter (soquete); // comece a montar a sequência de comando para enviar emails send_receive (nulo); // recebe a mensagem de que a conexão com o servidor SMTP send_receive com sucesso ("ehlo hao"); send_receive ("Auth Login"); send_receive (email.username); send_receive (email.pwd); send_receive ("Correio de: <" + email.from + ">"); send_receive ("RCPT para: <" + email.to + ">"); send_receive ("dados"); // email conteúdo pw.println ("de:" + email.from); pw.println ("para:" + email.to); // Certifique -se de esvaziar uma linha entre o assunto e o texto, ou seja, adicione "/r/n" pw.println ("sujeito:" + email.subject + "/r/n"); // imprima o conteúdo de email no console system.out.println ("de:" + email.from); System.out.println ("para:" + email.to); System.out.println ("sujeito:" + email.subject + "/r/n"); System.out.println (email.content); // Email Body PW.println (email.content); // Lembre -se de terminar o texto com "". send_receive ("."); send_receive ("pare"); } catch (ioexception e) {e.printStackTrace (); } finalmente {tente {if (soket! = null) soket.close (); } catch (ioexception e) {e.printStackTrace (); }}}/** * Sempre que um comando for enviado, "/r/n" deve ser adicionado após o comando, * o código de status correspondente do servidor de email SMTP será impresso ao mesmo tempo * @param comando */private void send_receive (comando string) lança ioexception {if (comando! pw.print (comando + "/r/n"); pw.flush (); System.out.println ("Usuário >>" + comando); } char [] resposta = novo char [1024]; Br.read (resposta); System.out.println (resposta); } / *** Obtenha o fluxo de saída do soquete* / Private PrintWriter getWriter (soquete) lança IoException {outputStream Socketout = Socket.getOutStutStream (); devolver o novo PrintWriter (Socketout, True); } / *** Obtenha o fluxo de entrada do soquete* / Private BufferReader getReader (soquete) lança IoException {inputStream soketin = soket.getInputStream (); return new buffarredreader (new inputStreamReader (Socketin)); } // Teste public static void main (string [] args) {new MailSendergui (); }} // Classe de interface do Programa de Programa de Correio MailSenderGui estende JFrame implementa ActionListener {private Jlabel UsernameLabel; Private JTextfield UserNamefield; Privado Jlabel Pwdlabel; Private JPasswordField Pwdfield; Privado Jlabel Fromlabel; Private JTextfield Fromfield; Jlabel Tolabel privado; Private Jtextfield Tofield; Private Jlabel SubjectLabel; Private Jlabel ContentLabel; Private JTexTarea Contentarea; private JButton Sendbtn; JButton privado canceltn; E_MAIL PRIVADO EMAIL; privado SimpleMailsender Mailsender; public MailSendergui () {this.init (); this.MailSender = new SimpleMailSender (); } private void init () {this.fromlabel = new jlabel ("endereço de email do remetente:"); this.Fromfield = new JTextfield (25); this.UsernameLabel = new Jlabel ("Nome de usuário:"); this.UserNamefield = new JTextfield (25); this.pwdlabel = new jlabel ("senha:"); this.pwdfield = new JPasswordField (25); this.tolabel = new jlabel ("Endereço de email do destinatário:"); this.tofield = new JTextfield (25); this.subjectLabel = new jlabel ("Assunto do email:"); this.subjectfield = new jtextfield (20); this.contentLabel = new jlabel ("corpo de email:"); this.Contentarea = New JTexTarea (15, 20); this.setTitle ("Ant-> remetente de correio simples"); 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 ("redefinir"); this.sendbtn.addactionListener (this); this.cancelbtn.addactionListener (this); Jpanel uppanel = new jpanel (novo gridlayout (6, 2, 5, 5)); uppanel.add (Fromlabel); uppanel.add (de campo); uppanel.add (Usernamelabel); uppanel.add (pwdlabel); uppanel.add (pwdfield); uppanel.add (Tolabel); uppanel.add (tofield); uppanel.add (tofield); uppanel.add (sujeito); uppanel.add (Subjectfield); 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. } @Override public void ActionPerformed (ActionEvent e) {if (e.getSource () == this.sendbtn) {this.mail = new e_mail (this.fromfield.getText (), this.tofield.getText () String (this.pwdfield.getpassword ())); this.mailsender.sendEmail (this.mail); } else if (e.getSource () == this.cancelbtn) {this.fromfield.settext (null); this.tofield.settext (null); this.subjectfield.settext (null); this.contentarea.settext (null); }}}O exposto acima é todo o código para escrever programas de envio de e-mail simples em Java, esperando que seja útil para o aprendizado de todos.