import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.UnknownHostException;

import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;

/**
 * @author zhaohongbing
 *
 */
@SuppressWarnings("unused")
public class SockerMail {
    String mailServer;
    String from;
    String to;
    String subject;
    String content;
    String lineFeet = "\r\n";
    private int port = 25;
    
    Socket client;
    BufferedReader bf;
    DataOutputStream dos;
    
    public String getContent(){
        return content;
    }
    
    public void setContent(String content){
        this.content = content;
    }
    
    public String getMailServer(){
        return mailServer;
    }
    
    public void setMailServer(String mailServer){
        this.mailServer = mailServer;
    }
    
    public String getFrom(){
        return from;
    }
    
    public void setFrom(String from){
        this.from = from;
    }
    
    public String getTo(){
        return to;
    }
    
    public void setTo(String to){
        this.to = to;
    }

public String getSubject(){
        return subject;
    }

public void setSubject(String sub){
        this.subject = sub;
    }
    
    /**
     * 初始化连接
     * @return
     */
    private boolean init(){
        System.out.println("init be invoke");
        boolean boo = true;
        if(mailServer == null || "".equals(mailServer)){
            return false;
        }
        try{
            client = new Socket(mailServer, port);
            bf = new BufferedReader(new InputStreamReader(client.getInputStream()));
            dos = new DataOutputStream(client.getOutputStream());
            String isConnect = getResponse();
            if(isConnect.startsWith("220")){
                
            }else{
                System.out.println("建立连接失败: "+isConnect);
                boo = false;
            }
            
        }catch(UnknownHostException e){
            System.out.println("建立连接失败!");
            e.printStackTrace();
            boo = false;
        }catch(IOException e){
            System.out.println("读取流数据失败!");
            e.printStackTrace();
            boo = false;
        }
        System.out.println("init result = " +boo);
        return boo;
    }
    
    /**
     * 发送smtp指令
     * 并返回服务器响应信息
     * @param msg
     * @return
     */
    private String sendCommand(String msg){
        String result = null;
        try{
            dos.writeBytes(msg);
            dos.flush();
            result = getResponse();
        }catch(IOException e){
            e.printStackTrace();
        }
        return result;
    }
    
    /**
     * 读取服务器端响应信息
     * @return
     */
    private String getResponse(){
        String result = null;
        try{
            result = bf.readLine();
        }catch(IOException e){
            e.printStackTrace();
        }
        return result;
    }
    
    
    /**
     * 关闭
     */
    private void close(){
        try{
            dos.close();
            bf.close();
            client.close();
        }catch(IOException e){
            e.printStackTrace();
        }
    }
    
    public boolean sendMail(){
        //初始化
        if(client == null){
            if(init()){
                
            }else{
                return false;
            }
        }
        //判断 from, to
        if(from == null || from.isEmpty() || to == null || to.isEmpty()){
            return false;
        }
        //进行握手
        String result = sendCommand("HELO "+mailServer +lineFeet);
        if(isStartWith(result, "250")){
            System.out.println("握手结果:"+true);
        }else{
            System.out.println("握手失败:"+result);
            return false;
        }
        //验证发信人信息
//        String auth = sendCommand("AUTH LOGIN"+lineFeet);
//        if(isStartWith(auth,"334")){
//            System.out.println("验证发信人信息结果:"+true);
//        }else{
//            return false;
//        }
//        String user = sendCommand(new String(Base64.encode("anszhao@163.com".getBytes()))+lineFeet);
//        System.out.println("user = " +user);
//        if(isStartWith(user, "334")){
//            System.out.println("验证user信息结果:"+true);
//        }else{
//            return false;
//        }
//        String pass = sendCommand(new String(Base64.encode("".getBytes()))+lineFeet);
//        System.out.println("pass = " +pass);
//        if(isStartWith(pass, "235")){
//            System.out.println("验证pass信息结果:"+true);
//        }else{
//            System.out.println("验证pass信息结果:"+false);
//            return false;
//        }
        
        //发送指令
        String f = sendCommand("Mail From:<"+from+">"+lineFeet);
        System.out.println("发送指令结果:"+f);
        if(isStartWith(f,"250")){
            System.out.println("发送指令结果:"+true);
        }else{
            System.out.println("发送指令结果:"+false);
            return false;
        }
        String toStr = sendCommand("RCPT TO:<"+to+">"+lineFeet);
        System.out.println("验证toStr结果:"+toStr);
        if(isStartWith(toStr,"250")){
            System.out.println("验证toStr结果:"+true);
        }else{
            return false;
        }
        
        String data = sendCommand("DATA"+lineFeet);
        if(isStartWith(data,"354")){
            System.out.println("验证data信息结果:"+true);
        }else{   
            return false;
        }
        
        StringBuilder sb = new StringBuilder();
        sb.append("From:<"+from+">"+lineFeet);
        sb.append("To:<"+to+">"+lineFeet);
        sb.append("Subject:" +subject+lineFeet);
        sb.append("Date:2014/06/27 17:30"+lineFeet);
        sb.append("Content-Type:text/plain;charset=\"GB2312\",\"UTF-8\""+lineFeet);
        sb.append(lineFeet);
        sb.append(content);
        sb.append(lineFeet+"."+lineFeet);
        
        String conStr = sendCommand(sb.toString());
        if(isStartWith(conStr,"250")){
            System.out.println("验证conStr信息结果:"+true);
        }else{
            return false;
        }
        
        //quit 
        String quit = sendCommand("QUIT"+lineFeet);
        if(isStartWith(quit,"221")){
            System.out.println("验证quit信息结果:"+true);
        }else{
            return false;
        }
        close();
        return true;
    }
    
    /**
     *
     * 检查字符串开头
     */
    private boolean isStartWith(String res, String with){
        return res.startsWith(with);
    }

/**
     * @param args
     */
    public static void main(String[] args) {
        SockerMail mail = new SockerMail();
        mail.setMailServer("stmp.mail.163.com");
        mail.setFrom("anson@163.com");
        mail.setTo("anson@163.com");
        mail.setSubject("[Test Email]");
        mail.setContent("Hello,this is a test mail, please replay me if you have receviced it");
        boolean boo = mail.sendMail();
        if(boo){
            System.out.println("邮件发送成功");
        }else{
            System.out.println("邮件发送失败");
        }

}

}

Java通过socket实现smtp协议发送邮件的更多相关文章

  1. 使用java mail的网易smtp协议 发送邮件

    package com.enation.newtest; import java.security.GeneralSecurityException; import java.util.Propert ...

  2. PHP用socket连接SMTP服务器发送邮件

    PHP用socket连接SMTP服务器发送邮件 PHP用socket连接SMTP服务器发送邮件学习实验记录: 分析与SMTP会话的一般流程 1. HELO XXX \r\n //XXX就是自己起个名字 ...

  3. SMTP 协议发送邮件的整体过程

    使用 SMTP 发送邮件_使用 SMTP 发送邮件_发送邮件_用户指南_邮件推送-阿里云 https://help.aliyun.com/knowledge_detail/51622.html 通过 ...

  4. java实现发送邮件服务器,SMTP协议发送邮件

    1.采用SMTP的邮件发送协议.准备:在网易注册一个邮箱,进入设置开启SMTP/pop3协议 2.接下来就是java代码实现了,下面都有注释,就不多做解释了. public class mail { ...

  5. 通过telnet使用smtp协议发送邮件

    smtp协议是一个简单的邮件传输协议,利用它我们可以将邮件发送给别人,这里将通过telnet这个程序利用smtp协议从网易向gmail发送一封邮件 网上不少有说使用telnet发送邮件的文章,我也看过 ...

  6. 使用SMTP协议发送邮件

    class Program { static void Main(string[] args) { ) { try { inputmodel obj = new inputmodel(args); S ...

  7. C语言利用SMTP协议发送邮件

    #ifdef WIN32 #include <windows.h> #include <stdio.h> #else #include <stdio.h> #inc ...

  8. Java的socket服务UDP协议

    练习1 接收类 package com.socket.demo; import java.io.IOException; import java.net.DatagramPacket; import ...

  9. QTP使用Smtp协议发送邮件

    NameSpace = "http://schemas.microsoft.com/cdo/configuration/" Set Email = CreateObject(&qu ...

随机推荐

  1. 12天学好C语言——记录我的C语言学习之路(Day 1)

    12天学好C语言--记录我的C语言学习之路 Day 1: 刚刚入门C语言,那么肯定要先把什么是C语言和大家讲清楚,那么大家看下面一段程序(program  1.1): /*//program 1.1 ...

  2. SQL日期操作及只获取日期的方法

    datepart()函数的使用                          * datepart()函数可以方便的取到时期中的各个部分*如日期:2006-07--02 18:15:36.513* ...

  3. 关于Ionic的安装

    Ionic是一个前端的框架,帮助开发者使用HTML5, CSS3和JavaScript做出原生应用. http://ionicframework.com/getting-started/ 这里介绍了如 ...

  4. C++ 中的“ !” 运算

    在介绍“ !”运算之前,我们要知道一个变量n,如果n>0,那么我们可以在逻辑上叫它“真”,如果n<=0 ,那么我们可以在逻辑上叫它“假”. n为真时,!n就为假(false),转换为整型值 ...

  5. 九度OJ 1511 从尾到头打印链表

    题目地址:http://ac.jobdu.com/problem.php?pid=1511 题目描述: 输入一个链表,从尾到头打印链表每个节点的值. 输入: 每个输入文件仅包含一组测试样例. 每一组测 ...

  6. 空对象模式(Null Object Pattern)

    空对象模式:用一个空对象来取代null实例的检查,空对象实现一个不做任何动作的关系.(消除如if(Object == null) 这样的检查null实例代码) 例子: public abstract ...

  7. BootstrapDialog.show函数底层简化

    平台用的全部都是BootStrapDialog的弹窗,然后美工设计了一个统一的样式,每次写的时候,都要对其进行样式重写:写吐了快,所以对BootStrap.底层做了修改: 也就是说,只要你要写的界面包 ...

  8. javascripct流程语句

    1.条件选择       if 语句:只有当指定条件为true时,使用该语句来执行代码 if...else语句:当条件为true时执行代码,当条件为 false 时执行其他代码 if...else i ...

  9. Chrome 浏览器各版本下载大全

    随着最近64位版本的 Chrome 浏览器正式版的推出,Chrome 浏览器再次受到广大浏览迷的重点关注,今天我们就整理一下各版本的 Chrome 浏览器 32位及64位的下载地址,方便各位浏览迷选择 ...

  10. MFC应用程序的开发流程

    (1)根据应用程序特性在"MFC AppWizard[exe]"应用程序向导各步骤对话框进行选择,创建一个应用程序的框架. (2)利用资源编辑器为程序编辑或添加资源,如编辑菜单.添 ...