`

Java SMTP协议电子邮件传送

    博客分类:
  • Java
阅读更多
import java.io.*;
import java.net.NoRouteToHostException;
import java.net.Socket;
import java.util.*;
import javax.naming.NamingException;
import sun.misc.BASE64Encoder;
public class WorkThread extends Thread
{
    String domain;
    String to;
    String subject;
    String body;
    String myEncode="gb2312";
    public String  hosts[]={
       "google.com","sun.com","borland.com","dell.com","163.com","263.com",
       "sina.com","etang.com","sohu.com" };
    String from="ddd@"+getRandomDomain();
    public void run(){
       
        String mxServers[]=null;  
        MxFinder finder = new MxFinder(domain,"202.204.208.2");
        try
        {
            mxServers = finder.getMxServers();
        }
        catch(NamingException e)
        {
            e.printStackTrace();
        };
        if(mxServers==null)
        { 
            System.out.println("address is wrong");
        }else{  
           try{
              L1:
              for(int i=0;i<mxServers.length;i++)
              {    
                  String mxServer=mxServers[i];
                  for(int j=0;j<3;j++)
                  {   
                       Socket socket=new Socket(mxServer,25);
                       DataInputStream dis = new DataInputStream(socket.getInputStream());
                       DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
                       String response = "";
                       response = readLastLine(dis);
                       if(!response.startsWith("220"))  
                       {    
                           dis.close(); 
                           dos.close();
                           socket.close(); 
                           dis = null; 
                           dos = null; 
                           socket = null;                  
                           continue;         
                       } else {     //连接成功,开始写入HELO,标识自己身份
                           
                           dos.writeBytes("HELO "+domain+"\r\n");
                            response = readLastLine(dis);
                           if(!response.startsWith("250"))
                            {    //无法识别此域名,可在此进行相应处理;                                                           dis.close(); 
                                dos.close();
                                socket.close(); 
                                dis = null; 
                                dos = null; 
                                socket = null;                  
                                continue;   
                           } else 
                           {     //SMTP可以识别此域名;写入:MAIL FROM告诉服务器想发一封邮件;
                                                      
                               dos.writeBytes("MAIL FROM: "+from+"\r\n");
                               response = readLastLine(dis);
                               System.out.println(response);
                               if(!response.startsWith("250"))
                               {     //SMTP服务器不打算接收邮件,可在此做相应处理;   
                                  System.out.println("failure");                                                                    dis.close(); 
                                  dos.close();
                                  socket.close(); 
                                  dis = null; 
                                  dos = null; 
                                  socket = null;                  
                                  continue;    
                               } else 
                               {  //SMTP服务器准备接收邮件,写入RCPT TO告诉服务器收件人地址;
                                   
                                    dos.writeBytes("RCPT TO: <"+to+">\r\n");
                                    response = readLastLine(dis);
                                    if(!response.startsWith("250"))
                                    {     //SMTP不愿意为接收人接收邮件,可在此进行相应处理;                                              dis.close(); 
                                        dos.close();
                                        socket.close(); 
                                        dis = null; 
                                        dos = null; 
                                        socket = null;                  
                                        continue;        
                                     }else 
                                     { //SMTP愿意为接收入接收邮件,写入DATA表明开始邮件传送;
                                          
                                         dos.writeBytes("DATA\r\n");
                                         response = readLastLine(dis);
                                         if(!response.startsWith("354"))
                                         {      dis.close(); 
                                               dos.close();
                                               socket.close(); 
                                               dis = null; 
                                               dos = null; 
                                               socket = null;                  
                                                continue;          
                                         } else 
                                         {  //SMTP服务器同意开始输入邮件,对邮件体的//From,To,Subject,Data等做相应设置,写入要传送的邮件体//正文:body;
                                            
                                             dos.writeBytes("From:< "+getStr(from,myEncode)+">\r\n"); 
                                             dos.writeBytes("To: <"+getStr(to,myEncode)+">\r\n");    
                                             dos.writeBytes("Subject: "+getStr(subject,myEncode)+"\r\n");    
                                             dos.writeBytes("Reply-To: <"+from+">\r\n");  
                                                                                                 dos.writeBytes("mime-version: 1.0\r\n");
                                        
                                                         
                                             dos.writeBytes("Content-Type: text/html;\r\n");                                                                                                                 dos.writeBytes("Content-Transfer-Encoding: Base64");
                                       	  dos.writeBytes("\r\n\r\n");
                                             dos.writeBytes(getBase64(body));       
                                             dos.writeBytes("\r\n\r\n");                                                          dos.writeBytes("\r\n.\r\n");
                                             response =readLastLine(dis);
                                             if(!response.startsWith("250"))
                                             { //发送失败,可在此做相应处理;                                                                       dis.close(); 
                                                  dos.close();
                                                  socket.close(); 
                                                  dis = null; 
                                                  dos = null; 
                                                  socket = null;                  
                                                  continue;                                        
                                             } else
                                             {  //发送成功,结束此次传送;
                                               
                                                  dos.writeBytes("quit\r\n");
                                                  dis.close();
                                                  dos.close();
                                                  socket.close();
                                                  dis = null;
                                                  dos = null;
                                                  socket = null;                                                                                    break L1;
                                           }//sixth else
                                        }//fifth else
                                     }//fourth else
                                 }//third else
                             } //second else
                          }//first else
                      }
                   }
              }catch(Exception e){  e.printStackTrace();}
          }
      }//run end

     private String readLastLine(DataInputStream in) throws IOException
     {
        String ret = "";
        do
        {
            BufferedReader d= new BufferedReader(new InputStreamReader(in));
            ret=d.readLine();
        } while(in.available() > 0);
        return ret;
     }

    private String getBase64(String str)
    {
        return (new BASE64Encoder().encode(str.getBytes()));
    }  

     public static String getStr(String str, String encode)
    {
        try
        {
            byte temp[] = str.getBytes(encode);
            String tmp = new String(temp, "8859_1");
            String s = tmp;
            return s;
        }
        catch(Exception exception)
        {
            return null;
        }
    }

     private String getRandomDomain()
    {
        String ret = "";
        Random r = new Random(System.currentTimeMillis());
        ret = hosts[r.nextInt(hosts.length)];
        return ret;
    }

     public static void main(String[] args)
     {  
          WorkThread wt=new WorkThread();
          int pos;
          if(args.length<3) System.out.println("请输入您要发送到的邮件地址(如:dddd@163.com)、主题、内容");
             else{
                wt.to=args[0];
                wt.subject=args[1];
                wt.body=args[2];
                pos=wt.to.indexOf("@");
                if(pos==-1) System.out.println("您输入的地址错误,请重新输入");                 
                 else {   wt.domain=wt.to.substring(pos+1);
                          wt.start();
                      }
             }
     }
}

分享到:
评论

相关推荐

    Java SMTP协议电子邮件传送剖析

    Java SMTP协议电子邮件传送剖析 在Java编程环境中,发送电子邮件是一个常见的任务,这通常涉及到使用SMTP(Simple Mail Transfer Protocol)协议。SMTP是互联网上用于传输邮件的标准协议,它定义了邮件服务器之间...

    SMTP协议电子邮件传送剖析.rar

    在Java编程语言中,我们可以使用JavaMail API来实现SMTP协议的功能,发送电子邮件。JavaMail API提供了一系列接口和类,如`Session`、`Message`、`Transport`等,帮助开发者轻松地构建邮件发送功能。 首先,你需要...

    《Java编程技巧典型案例解析》随书光盘

    实例45 Java SMTP协议电子邮件传送剖析 实例46 Java Applet与浏览器间的通信技术 实例47 Java实现邮件群发 实例48 应用Java和JSP设计完整的文件上传系统 实例49 Java编程序搜索网络服务器 实例52 使用Java...

    RFC821-简单邮件传输协议(SMTP)中文版

    SMTP,即Simple Mail Transfer Protocol,简单邮件传输协议,是互联网上用于发送电子邮件的标准协议。它定义了邮件服务器如何将邮件从一台计算机传送到另一台计算机。SMTP在1982年由RFC821文档标准化,并在后续的RFC...

    04_传智播客张孝祥java邮件开发_邮件协议总结与邮件服务器的工作原理

    首先,让我们从基础开始,了解电子邮件系统的核心协议。 1. SMTP(Simple Mail Transfer Protocol):SMTP是发送邮件的主要协议,用于在邮件服务器之间传递邮件。它定义了如何将邮件从一个主机传送到另一个主机的...

    电子邮件管理软件课程设计

    在电子邮件管理软件课程设计中,主要介绍了JavaMail API的应用,JavaMail 是Sun 公司为Java 开发人员提供的公共应用程序接口框架,提供了一个与平台无关、协议独立的框架,预置了一些最常用的邮件传送协议的实现方法...

    基于javaMail电子邮件系统设计说明.doc

    SMTP协议是Internet传送电子邮件的基本协议,也是TCP/IP协议组的成员。SMTP协议解决了系统如何通过一条链路,把电子邮件从一台机器传送到另一台机器上的问题。SMTP协议的特点是具有良好的可伸缩性,这也是它成功的...

    SMTP发送邮件.rar

    SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)是互联网上用于在邮件服务器之间发送电子邮件的标准协议。它定义了如何将邮件从一个系统传送到另一个系统的一系列步骤,是电子通信中不可或缺的一部分。在...

    SMTP及pop3客户端程序代码

    例如,当你在电子邮件客户端(如Outlook或Thunderbird)中撰写并发送邮件时,SMTP负责将邮件传送到对方的邮件服务器;当对方想要查看邮件时,他们的邮件客户端使用POP3从自己的邮件服务器下载新邮件。 **SMTP及POP3...

    java邮件系统设计毕业论文.doc

    SMTP 是互联网协议集中的邮件标准,能够接收电子邮件的服务器都有 SMTP。POP3 可以允许 E-mail 客户向某一 SMTP 服务器发送电子邮件,也可以接收来自 SMTP 服务器的电子邮件。 三、电子邮件地址的构成 电子邮件...

    java邮件系统设计.pdf

    SMTP 负责将电子邮件从一台计算机传送到另一台计算机,POP3 则允许电子邮件客户端从邮件服务器接收电子邮件。 二、电子邮件的发送和接收 电子邮件的发送和接收可以用我们日常生活中邮寄包裹来形容。当我们发送电子...

    电子邮件解析算法的研究与实现.pdf

    James(Java Apache Mail Enterprise Server)作为Apache软件基金会的一个开源项目,完全基于Java技术构建,支持SMTP、POP3与NNTP等多种邮件协议,成为了邮件应用平台中的佼佼者。 基于James的WebMail系统的开发,...

    电子邮件解析算法的研究与实现

    James(Java Apache Mail Enterprise Server)是Apache基金会旗下的一个开源项目,它是一款基于Java技术的邮件服务器平台,支持SMTP、POP3以及NNTP等多种邮件协议。基于James,可以通过结合JSP技术和MySQL数据库来...

    pop3接收邮件并可以收附件

    POP3(Post Office Protocol version 3)是一种电子邮件协议,用于从邮件服务器检索电子邮件。SMTP(Simple Mail Transfer Protocol)则是用于发送邮件的协议。在IT领域,理解这两种协议的工作原理是处理电子邮件...

    毕业设计:ASP.NET基于cs的电子邮件简单收发系统设计与实现(源代码+论文)

    一旦某个组织的电子邮件系统运行在支持TCP/IP协议的网络上或具有支持两个Internet邮件服务协议SMTP(简单邮件传输协议)和POP(邮局协议)之一的Internet网关,它的邮件用户就能够连接到任何具有相似连接的电子邮件地址...

    Java网络编程--NNTP:网络新闻传送协议

    尽管随着电子邮件和社交媒体的发展,NNTP的使用可能不像过去那样普遍,但它仍然是某些社区和信息交流的重要工具。Java开发者可以利用Java的IO和Socket库来实现NNTP客户端和服务器的编程,以便在应用程序中集成NNTP...

    计算机网络实验二.docx

    【SMTP协议详解与电子邮件系统构建】 SMTP(Simple Mail Transfer Protocol),简单邮件传输协议,是互联网上用于在邮件服务器之间发送电子邮件的标准。实验“Windows环境下用smtp实现Email客户端”旨在让学生深入...

    电子邮件发送程序的设计与实现.doc

    电子邮件发送程序的发送方式有两种:第一种是本地计算机与用户所指定的发送邮件 服务器连接,然后通过发送邮件服务器将邮件传送到接收邮件的服务器,邮件中包含有 信件主题和内容等一系列信息;第二种是本地计算机...

    java邮件系统设计毕业(设计)论文.doc

    邮件传输原理在 Internet 上将一段文本信息从一台计算机传送到另一台计算机上,可以通过两种协议来完成,即 SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)和 POP3(Post Office Protocol,邮局协议 3)...

Global site tag (gtag.js) - Google Analytics