`

用socket连接服务器直接发送接收邮件

    博客分类:
  • java
阅读更多
首页 新闻 论坛 问答 博客 招聘 更多
SMTP 命令
SMTP 命令包括:
HELO 向服务器标识用户身份。发送者能欺骗,说谎,但一般情况下服务器都能检测到。
EHLO 向服务器标识用户身份。发送者能欺骗,说谎,但一般情况下服务器都能检测到。
MAIL FROM 命令中指定的地址是发件人地址
RCPT TO 标识单个的邮件接收人;可有多个 RCPT TO;常在 MAIL 命令后面。
DATA 在单个或多个 RCPT 命令后,表示所有的邮件接收人已标识,并初始化数据传输,以 CRLF.CRLF 结束
VRFY 用于验证指定的用户/邮箱是否存在;由于安全方面的原因,服务器常禁止此命令
EXPN 验证给定的邮箱列表是否存在,扩充邮箱列表,也常被禁用
HELP 查询服务器支持什么命令
NOOP 无操作,服务器应响应 OK
RSET 重置会话,当前传输被取消
QUIT 结束会话

POP3 命令包括:
USER username 认证用户名
PASS password 认证密码认证,认证通过则状态转换
APOP name,digest 认可一种安全传输口令的办法,执行成功导致状态转换,请参见 RFC 1321 。
STAT 处理请求 server 回送邮箱统计资料,如邮件数、 邮件总字节数
UIDL n 处理 server 返回用于该指定邮件的唯一标识, 如果没有指定,返回所有的。
LIST n 处理 server 返回指定邮件的大小等
RETR n 处理 server 返回邮件的全部文本
DELE n 处理 server 标记删除,QUIT 命令执行时才真正删除
RSET 处理撤消所有的 DELE 命令
TOP n,m 处理 返回 n 号邮件的前 m 行内容,m 必须是自然数
NOOP 处理 server 返回一个肯定的响应
QUIT 希望结束会话。如果 server 处于"处理" 状态,则现在进入"更新"状态,删除那些标记成删除的邮件。如果 server 处于"认可"状态,则结束会话时 server 不进入"更新"状态 。



import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;

import sun.misc.BASE64Encoder;

public class SmtpClinent {
public static void main(String[] args) throws Exception {
socketReceiveMail();
// socketSendMail();
}

// socket接收邮件
public static void socketReceiveMail() {
String POP3Server = "";
String USERNAME = "";// 实际应用中改成真实的用户名
String PASSWORD = "";// 实际应用中改成真实的密码

int POP3Port = 110;
Socket client = null;

String filePath = "D:\\mailtest\\";//将正文保存的路径
try {
// 向POP3服务程序建立一个套接字连接。
client = new Socket(POP3Server, POP3Port);
// 创建一个BufferedReader对象,以便从套接字读取输出。
InputStream is = client.getInputStream();
BufferedReader sockin = new BufferedReader(new InputStreamReader(is));
// 创建一个PrintWriter对象,以便向套接字写入内容。
OutputStream os = client.getOutputStream();
PrintWriter sockout = new PrintWriter(os, true);
// 显示同SMTP服务程序的握手过程。
System.out.println("S:" + sockin.readLine());
sockout.println("USER " + USERNAME);
System.out.println("S:" + sockin.readLine());
sockout.println("PASS " + PASSWORD);
System.out.println("S:" + sockin.readLine());
sockout.println("UIDL " + "1");
System.out.println("S:" + sockin.readLine());

sockout.println("STAT");
String statStr = sockin.readLine();
System.out.println("statStr:" + statStr);

String temp[] = statStr.split(" ");
int count = Integer.parseInt(temp[1]);// 得到信箱中共有多少封邮件
for (int i = 1; i < count + 1; i++) {// 依次打印出邮件的内容
sockout.println("RETR " + i);
System.out.println("以下为第" + i + "封邮件的内容");

File file = new File(filePath + i + ".eml");
streamToFile(sockin, file);
}
} catch (IOException e) {
System.out.println(e.toString());
} finally {
try {
if (client != null) {
client.close();
}
} catch (IOException e) {
}
}
}

private static void streamToFile(BufferedReader sockin, File file) throws IOException {
BufferedWriter buff = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file)));

while (true) {
String reply = sockin.readLine();
buff.write(reply);
buff.write("\r\n");
buff.flush();
// System.out.println(reply);
if (reply.toLowerCase().equals(".")) {
break;
}
}
buff.close();
}

static String From = "test@jinoal.com";

static String To = "test@sina.com";

// socket发送邮件
public static void socketSendMail() throws IOException {
String SMTPServer = "";
String USERNAME = "";// 实际应用中改成真实的用户名
String PASSWORD = "";// 实际应用中改成真实的密码

InetAddress mailServer = InetAddress.getByName(SMTPServer);
Socket mailTo = new Socket(mailServer, 25);
BufferedReader in = new BufferedReader(new InputStreamReader(mailTo.getInputStream()));
PrintWriter out = new PrintWriter(new OutputStreamWriter(mailTo.getOutputStream()));
// 首先和服务器25端口建立连接,服务器返回220表示连接成功
String initialID = in.readLine();
System.out.println(initialID);
// 向服务器发送HELO name,用来表示发件人,服务器返回250
out.println("HELO mali");
out.flush();
out.println("AUTH LOGIN");
out.flush();
BASE64Encoder encoder = new BASE64Encoder();
out.println(encoder.encode(USERNAME.getBytes()));
out.flush();
out.println(encoder.encode(PASSWORD.getBytes()));
out.flush();
System.out.println(in.readLine());
// 用MAIL FROM me@server.com告诉服务器你要发邮件
out.println("Mail FROM: " + From);
out.flush();
System.out.println(in.readLine());
// 用RCPT TO:somebody@ain.com
out.println("RCPT TO: " + To);
out.flush();
System.out.println(in.readLine());
// 用DATA发送邮件正文
out.println("Data");
out.flush();
System.out.println(in.readLine());

// test3(out);
// test1(out);
test2(out);

out.flush();
System.out.println(in.readLine());
// 发送QUIT断开连接
out.println("QUIT");
out.flush();
System.out.println(in.readLine());

out.close();
in.close();
}

public static void test3(PrintWriter out) {
out.println("Date: Thu, 13 Aug 2009 16:30:34 +0800 (CST)");
out.println("From: " + From);
out.println("To: " + To);
out.println("Message-ID: <14452073.1.1250152234828.JavaMail.new@mali>");
out.println("Subject: my mail");
out.println("MIME-Version: 1.0");
out.println("Content-Type: multipart/mixed; ");
out.println(" boundary=\"----=_Part_0_23065739.1250152234750\"");
out.println("Disposition-Notification-To: mali@jingoal.com");
out.println("------=_Part_0_23065739.1250152234750");
out.println("Content-Type: text/plain;charset=\"utf-8\"");
out.println("Content-Transfer-Encoding: 7bit \r\n");
out.println("content0");
out.println("------=_Part_0_23065739.1250152234750--");
out.println(".");
}

public static void test1(PrintWriter out) {
out.println("Date: Thu, 6 Aug 2009 16:37:13 +0800");
out.println("From: " + From);
out.println("To: " + To);
out.println("Subject: 777777777777777777777");
out.println("X-mailer: Foxmail 5.0 [cn]");
out.println("Mime-Version: 1.0");
out.println("Content-Type: text/plain;charset=\"gb2312\"");
out.println("Content-Transfer-Encoding: 7bit");
out.println("66666666666666666");
out.println(".");
}

public static void test2(PrintWriter out) {
BufferedReader reader = null;
try {
reader = new BufferedReader(new InputStreamReader(new FileInputStream("D:\\mailtest\\sendmail2.eml"), "utf-8"), 1024);
String temp = reader.readLine();
while (temp != null) {
out.println(temp);
temp = reader.readLine();

}
out.println(".");
} catch (Exception e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
分享到:
评论

相关推荐

    PHP用socket连接SMTP服务器发送邮件参照.pdf

    【PHP通过Socket连接SMTP服务器发送邮件】 在PHP中,通过Socket连接SMTP服务器发送邮件是一种常见的邮件发送方式。SMTP(Simple Mail Transfer Protocol)是用于在互联网上传输电子邮件的标准协议。以下是一个详细...

    用Socket编程实现电子邮件的发送

    ### 使用Socket编程实现电子邮件发送的关键知识点 #### 一、Socket编程基础 Socket编程是一种网络通信方式,它允许不同计算机上的程序进行数据交换。在互联网上,每个设备都有一个唯一的IP地址,而Socket则是通过...

    使用Socket结合SMTP/POP3邮件协议发送和接收邮件

    4. **POP3接收邮件**:在POP3中,客户端首先会发送一个CAPA命令来查询服务器支持的特性,然后使用USER和PASS命令进行身份验证。接着,可以使用LIST命令查看邮件数量和大小, RETR命令下载邮件,或者DELE命令标记邮件...

    用Java Socket实现SMTP邮件发送

    2. 使用Socket的`getOutputStream`获取输出流,通过输出流向服务器发送命令。 3. 编写命令发送逻辑,例如使用PrintWriter发送EHLO、AUTH、MAIL FROM、RCPT TO、DATA等命令。 4. 对于输入流(通常是Socket的`...

    利用socket发送接收邮件(转)

    在Java中,可以使用`java.net.Socket`创建到SMTP服务器的连接,并使用`PrintWriter`向服务器发送命令。`javax.mail`和`javax.mail.internet`包提供了`Session`、`Transport`、`MimeMessage`等类,用于构建和发送符合...

    java基于socket 利用1邮件服务器发送邮件

    Java基于Socket利用163邮件服务器发送邮件是一个常见的编程任务,尤其在自动化通知、系统报警或者用户服务中广泛应用。在这个项目中,我们将深入探讨如何使用Java的JavaMail API和Socket通信来实现这一功能。 首先...

    socket实现简单邮件发送

    2. 连接服务器:使用connect函数连接到SMTP服务器的IP地址和端口号。 3. 发送SMTP命令:例如,"HELO"或"EHLO"命令来初始化会话,"AUTH LOGIN"进行身份验证,"MAIL FROM:"指定发件人,"RCPT TO:"指定收件人,"DATA...

    java socket 实现SMTP协议 发送邮件.docx

    在这里,我们将使用 Java Socket 实现 SMTP 协议来发送邮件。 SMTP 协议简介 SMTP(Simple Mail Transfer Protocol)是一种用于发送电子邮件的协议。SMTP 协议工作在应用层,使用 TCP 协议作为传输层协议。SMTP ...

    基于java的简单socket邮件发送

    在邮件发送系统中,客户端通常扮演的是邮件用户代理(MUA)的角色,负责创建Socket连接到邮件服务器(MDS),并将邮件数据通过这个连接发送出去。服务器端则接收这些连接并处理邮件数据。 1. **创建Socket连接**:...

    基于socket的邮件发送程序(java编写)

    在邮件发送完成后,应调用`close()`方法来关闭所有打开的流和Socket连接,释放资源,避免内存泄漏。 ### 邮件发送流程 邮件发送的具体流程包括: 1. 连接到SMTP服务器。 2. 发送`HELO`命令,告知服务器发件人的...

    Java Socket Email 发送接收

    在电子邮件系统中,Socket可以用于客户端与服务器之间的连接,以便发送或接收邮件。 首先,理解SMTP(Simple Mail Transfer Protocol)和POP3(Post Office Protocol version 3)协议是必要的。SMTP用于发送邮件,...

    php中Socket发送邮件验证邮箱的类.zip

    在这种情况下,使用SMTP协议通过Socket连接服务器进行邮件验证是一种可靠的方法。本压缩包提供的"php中Socket发送邮件验证邮箱的类"正是这样一个工具,它能够帮助开发者实现这一功能。 该类的工作原理是模拟SMTP...

    socket邮件客户端

    通过Socket连接,客户端与邮件服务器建立交互,获取邮件列表、下载邮件内容,甚至处理带有附件的邮件。 关于“支持附件”,Socket邮件客户端能处理多种类型的文件附件,如文档、图片、音频和视频等。在发送邮件时,...

    socket服务器

    当有客户端发起连接时,服务器端的Socket会接受这个连接,建立一个全新的Socket连接用于处理客户端的请求。每个客户端连接都会生成一个新的Socket实例,这样服务器就能同时处理多个客户端的并发请求。 在实现Socket...

    socket:发送邮件的php类库

    了解如何使用socket发送邮件也能帮助开发者更好地理解和调试邮件发送问题,尤其是在遇到常规邮件函数(如`mail()`)无法解决的情况时。 总的来说,这个PHP类库利用socket功能实现了SMTP邮件发送,为开发者提供了一种...

    例10.04 Socket服务器端程序.rar_socket 服务器_socket服务_socket服务器_服务器_服务器程

    Socket在计算机网络中是一种进程间通信(IPC)机制,它提供了进程在网络中发送和接收数据的能力。在Internet上,Socket接口被广泛用于实现TCP/IP协议栈,使得不同计算机上的应用程序能够相互通信。 在服务器端,...

    socket 一个服务器对应多个客户端使用多线程

    在标题"socket 一个服务器对应多个客户端使用多线程"中,提到的是使用Socket编程来设计一个服务器,该服务器能够同时处理来自多个客户端的连接请求,这通常被称为“一对一”或“一对多”模型。在Linux环境下,这种...

Global site tag (gtag.js) - Google Analytics