java使用Socket实现SMTP协议发送邮件_java

本文实例为大家分享了java 利用Socket实现SMTP协议发送邮件的具体代码,供大家参考,具体内容如下

package mail;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.io.Reader;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.codec.binary.Base64;

public class Mail {

  public static void main(String[] args) throws IOException {
    Mail mail = new Mail();
    mail.setSmtpServer("smtp.qq.com");
    mail.setFromMail("1344364****@qq.com");
    mail.addToMail("105648****@qq.com");
    mail.addToMail("long*****@sina.com");
    mail.setUserName("134364****");
    mail.setPassword("*************");
    mail.setSubject("测试邮件");
    mail.setContent("<h1>你好</h1><br/><img src=\"yun_qi_img/baidu_jgylogo3.gif?v=39549282.gif\" />");
    mail.setShowLog(true);
    mail.send();
    System.out.println("程序结束");
  }

  /** 邮件主题 **/
  private String subject;
  /** 从此地址发出 **/
  private String fromMail;
  /** 用户名 **/
  private String userName;
  /** 登录密码 **/
  private String password;
  /** SMTP 服务器地址 **/
  private String smtpServer;
  /** SMTP 服务器端口(默认:25) **/
  private int smtpPort = 25;
  /** 发送到 toMail 中的所有地址 **/
  private List<String> toMail;
  /** 邮件内容 **/
  private String content;
  /** 是否显示日志 **/
  private boolean showLog;

  public void addToMail(String mail) {
    if (toMail == null)
      toMail = new ArrayList<String>();
    toMail.add(mail);
  }

  public void send() {
    if (smtpServer == null) {
      throw new RuntimeException("smtpServer 不能为空");
    }
    if (userName == null) {
      throw new RuntimeException("userName 不能为空");
    }
    if (password == null) {
      throw new RuntimeException("password 不能为空");
    }
    if (fromMail == null) {
      throw new RuntimeException("fromMail 不能为空");
    }
    if (toMail == null || toMail.isEmpty()) {
      throw new RuntimeException("toMail 不能为空");
    }
    if (content == null || toMail.isEmpty()) {
      throw new RuntimeException("content 不能为空");
    }

    Socket socket = null;
    InputStream in = null;
    OutputStream out = null;
    try {
      socket = new Socket(smtpServer, smtpPort);
      socket.setSoTimeout(3000);
      in = socket.getInputStream();
      out = socket.getOutputStream();
    } catch (IOException e) {
      throw new RuntimeException("连接到 " + smtpServer + ":" + smtpPort + " 失败", e);
    }

    BufferedReaderProxy reader = new BufferedReaderProxy(new InputStreamReader(in), showLog);
    PrintWriterProxy writer = new PrintWriterProxy(out, showLog);

    reader.showResponse();
    writer.println("HELO " + smtpServer);
    reader.showResponse();
    writer.println("AUTH LOGIN");
    reader.showResponse();
    writer.println(new String(Base64.encodeBase64(userName.getBytes())));
    reader.showResponse();
    writer.println(new String(Base64.encodeBase64(password.getBytes())));
    reader.showResponse();
    writer.println("MAIL FROM:" + fromMail);
    reader.showResponse();
    for (String mail : toMail) {
      writer.println("RCPT TO:" + mail);
      reader.showResponse();
    }
    writer.println("DATA");
    writer.println("Content-Type:text/html");
    if (subject != null) {
      writer.println("Subject:" + subject);
    }
    writer.println("From:" + fromMail);
    writer.print("To:");
    for (String mail : toMail) {
      writer.print(mail + "; ");
    }
    writer.println();
    writer.println();
    writer.println(content);
    writer.println(".");
    reader.showResponse();
    writer.println("QUIT");
    reader.showResponse();
    try {
      socket.close();
    } catch (IOException e) {
      System.err.println("发送邮件完成,关闭 Socket 出错:" + e.getMessage());
    }
  }

  public String getSubject() {
    return subject;
  }

  public void setSubject(String subject) {
    this.subject = subject;
  }

  public String getFromMail() {
    return fromMail;
  }

  public void setFromMail(String fromMail) {
    this.fromMail = fromMail;
  }

  public String getSmtpServer() {
    return smtpServer;
  }

  public void setSmtpServer(String smtpServer) {
    this.smtpServer = smtpServer;
  }

  public int getSmtpPort() {
    return smtpPort;
  }

  public void setSmtpPort(int smtpPort) {
    this.smtpPort = smtpPort;
  }

  public String getContent() {
    return content;
  }

  public void setContent(String content) {
    this.content = content;
  }

  public List<String> getToMail() {
    return toMail;
  }

  public void setToMail(List<String> toMail) {
    this.toMail = toMail;
  }

  public String getUserName() {
    return userName;
  }

  public void setUserName(String userName) {
    this.userName = userName;
  }

  public String getPassword() {
    return password;
  }

  public void setPassword(String password) {
    this.password = password;
  }

  public boolean getShowLog() {
    return showLog;
  }

  public void setShowLog(boolean showLog) {
    this.showLog = showLog;
  }

  static class PrintWriterProxy extends PrintWriter {
    private boolean showRequest;

    public PrintWriterProxy(OutputStream out, boolean showRequest) {
      super(out, true);
      this.showRequest = showRequest;
    }

    @Override
    public void println() {
      if (showRequest)
        System.out.println();
      super.println();
    }

    public void print(String s) {
      if (showRequest)
        System.out.print(s);
      super.print(s);
    }
  }

  static class BufferedReaderProxy extends BufferedReader {
    private boolean showResponse = true;

    public BufferedReaderProxy(Reader in, boolean showResponse) {
      super(in);
      this.showResponse = showResponse;
    }

    public void showResponse() {
      try {
        String line = readLine();
        String number = line.substring(0, 3);
        int num = -1;
        try {
          num = Integer.parseInt(number);
        } catch (Exception e) {
        }
        if (num == -1) {
          throw new RuntimeException("响应信息错误 : " + line);
        } else if (num >= 400) {
          throw new RuntimeException("发送邮件失败 : " + line);
        }
        if (showResponse) {
          System.out.println(line);
        }
      } catch (IOException e) {
        System.out.println("获取响应失败");
      }
    }

  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索java
, socket
, 邮件
smtp
socket 实现http协议、php socket发送邮件、socket发送邮件、用socket发送邮件、用socket实现邮件收发,以便于您获取更多的相关知识。

时间: 2024-12-21 02:57:07

java使用Socket实现SMTP协议发送邮件_java的相关文章

[JAVA100例]045、使用SMTP协议发送邮件

import java.net.*; import java.io.*; /** * <p>Title: 使用SMTP发送邮件</p> * <p>Description: 本实例通过使用socket方式,根据SMTP协议发送邮件</p> * <p>Copyright: Copyright (c) 2003</p> * <p>Filename: sendSMTPMail.java</p> * @version 1

php socket 使用smtp服务器发送邮件

/*邮件发送类 *功能:php教程 socket 使用smtp服务器发送邮件 *作者:longlong *时间:2007-11-26 *转帖请加本贴引用地址:showpost.asp教程?threadid=1345  */ class smtp { /* 全局变量 */ var $smtp_port; var $time_out; var $host_name; var $log_file; var $relay_host; var $debug; var $auth; var $user; v

关于SMTP协议发送邮件的总结

  最近在看一本书,是VC++网络编程,可以说那本书写的乱七八糟,我也晕头转向...  . 我写的大家可能有些看着抽象,捡着能看懂的看就行,我讲述的是SMTP的原理,而不是如何编程来实现,我纠结一天的感悟,希望对学习网络编程的朋友能有些帮助...   书上的SMTP小例子是写一个可以向  smtp.163.com邮件服务器邮件,于是我就跟着探索!!    SMTP是简单邮件传送协议,标准端口是25 ,SMTP也是TCP/IP族的成员,     其实一直不大理解 SMTP协议 FTP协议等等协议,

Java实现Socket的TCP传输实例_java

本文实例讲述了Java实现Socket的TCP传输.分享给大家供大家参考.具体分析如下: 客户端发数据到服务端 * Tcp传输,客户端建立的过程. * 1,创建tcp客户端socket服务.使用的是Socket对象. * 建议该对象一创建就明确目的地.要连接的主机. * 2,如果连接建立成功,说明数据传输通道已建立. * 该通道就是socket流 ,是底层建立好的. 既然是流,说明这里既有输入,又有输出. * 想要输入或者输出流对象,可以找Socket来获取. * 可以通过getOutputSt

java实现socket客户端连接服务端_java

本例只做简单功能演示,代码并不严谨,只是说明客户端如何实现连接服务端简单代码. 代码在集成Eclipse工具下测试编译运行环境如下图所示: 客户端echoClient.java代码: package com.zhengzz.echo; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java

浅析Java基于Socket的文件传输案例_java

本文实例介绍了Java基于Socket的文件传输案例,分享给大家供大家参考,具体内容如下 1.Java代码 package com.wf.demo.socket.socketfile; import java.net.*; import java.io.*; /** * 2.socket的Util辅助类 * * @author willson * */ public class ClientSocket { private String ip; private int port; private

基于smtp协议的邮件系统(自己写的)

最近几天做好了应用[贱泰迪],其中有个意见反馈,发送邮件, 我知道可以调用系统发送邮件,但这种方法有个弊端,就是您的手机必须安装Mail的客户端, 因此我想不用系统发送邮件这种方式,能不能向任意邮箱发送邮件呢?给我自己丢下了一个命题. 于是我调查,发现SMTP发送email 无需系统支持,无需配置, 经过多次尝试,多次失败,终于完成了此项功能. 先来看应用[贱泰迪]的效果, 填写您的邮箱.密码等,我就能收到您的反馈意见,是不是很方便呢, 更多的效果,您可以下载贱泰迪(http://down.mu

[JAVA100例]046、使用SMTP协议接收邮件

import java.io.*; import java.net.*; /** * <p>Title: SMTP协议接收邮件</p> * <p>Description: 通过Socket连接POP3服务器,使用SMTP协议接收邮件服务器中的邮件</p> * <p>Copyright: Copyright (c) 2003</p> * <p>Filename: </p> * @version 1.0 */ cl

Java实现邮件发送遇到的问题_java

发送邮件的代码是我从以前的一个应用上直接拷贝过来的.以前使用的腾讯的邮件服务,程序执行起来没有任何问题.后来修改为微软office365邮件服务后,却遇到了两个问题. 问题一,tls加密设置 异常信息如下: 复制代码 代码如下: Exception in thread "main" com.sun.mail.smtp.SMTPSendFailedException: 530 5.7.57 SMTP; Client was not authenticated to send anonym