`
hehaibo
  • 浏览: 417517 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

java-socket发送邮件

 
阅读更多
package com.hhb.mail;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
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;

public class MailSever {
	private String smptSever = "smtp.126.com";
	private int port = 25;
	private static String username;
	private static String password;
	private static String to=null;
	public static void main(String[] args) throws Exception {
		if (args.length < 3) {
			throw new Exception("请输入你的用户名和密码和接收人! "+
					"java MailSever username password to");
		}
		username = args[0];
		password = args[1];
		to=args[2];
		Message msg=new Message(username, to, "Socket测试","用套接字发送邮件!");
		new MailSever().sendMail(msg);
	}

	public BufferedReader getReader(Socket socket) throws IOException {
		InputStream in = socket.getInputStream();
		return new BufferedReader(new InputStreamReader(in));
	}

	public PrintWriter getWriter(Socket socket) throws IOException {
		OutputStream outputStream = socket.getOutputStream();
		return new PrintWriter(new OutputStreamWriter(outputStream), true);
	}

	public void sendMail(Message msg) {
		Socket socket = null;
		try {
			// 连接到主机服务器
			socket = new Socket(smptSever, port);
			BufferedReader br = getReader(socket);
			PrintWriter pw = getWriter(socket);
			// 获得客户的主机名
			String localhost = InetAddress.getLocalHost().getHostName();
			// 对用户名和密码进行Base64编码
			String _username = new sun.misc.BASE64Encoder().encode(username
					.getBytes());
			String _password = new sun.misc.BASE64Encoder().encode(password
					.getBytes());
			//接收服务器的响应数据
			sendAndReceive(null, br, pw);
			sendAndReceive("HELO " + localhost, br, pw);
			sendAndReceive("AUTH LOGIN", br, pw);//服务器认证
			sendAndReceive(_username, br, pw);//用户名
			sendAndReceive(_password, br, pw);//口令
			sendAndReceive("MAIL FROM: <" + msg.from+">", br, pw);

			sendAndReceive("RCPT TO: <" + msg.to+">", br, pw);
			sendAndReceive("DATA", br, pw);
			pw.println("SUBJECT:"+msg.subject+"\r\n");//邮件主题
			//发送邮件内容

			pw.println(msg.data+":源代码:\r\n");
			BufferedReader reader =new BufferedReader(new 
					InputStreamReader(new FileInputStream(
							new File("F:/工作空间/base_workspace/lesson1/" +
									"src2/com/hhb/mail/MailSever.java"))));
			String line=null;
			while((line=reader.readLine())!=null)
			{
				pw.println(line);
			};
			System.out.println("Client>" + msg.data);
			sendAndReceive(".", br, pw);//邮件发送完毕
			sendAndReceive("QUIT", br, pw);//结束通信
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (socket != null) {
				try {
					socket.close();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
	}

	private void sendAndReceive(String str, BufferedReader br, PrintWriter pw)
			throws IOException {
		if (str != null) {
			System.out.println("Client>" + str);
			pw.println(str);
		}
		String response;
		if ((response = br.readLine()) != null) {
			System.out.println("Sever>" + response);
		}
	}
}

class Message {
	String from;
	String to;
	String subject;
	String data;
	public Message(String from, String to, String subject,
			String data) {
		this.from = from;
		this.to = to;
		this.subject = subject;
		this.data = data;

	}
}

 介绍smtp命令和ESMTP过程

什么是 SMTP
SMTP (Simple Mail Transfer Protocol) : 电子邮件从客户机传输到服务器或从某一个服务器传输到另一个服务器使用的传输协议。 SMTP 是请求/响应协议,命令和响应都是基于 ASCII 文本,并以 CR 和 LF 符结束。响应包括一个表示返回状态的三位数字代码。SMTP 在 TCP 协议 25 端口监听连接请求。

什么是 ESMTP
ESMTP (Extended SMTP),顾名思义,扩展 SMTP 就是对标准 SMTP 协议进行的扩展。它与 SMTP 服务的区别仅仅是,使用 SMTP 发信不需要验证用户帐户,而用 ESMTP 发信时, 服务器会要求用户提供用户名和密码以便验证身份。验证之后的邮件发送过程与 SMTP 方式没有两样。

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

连接 Winmail Server 使用 SMTP 命令发送邮件
例如:安装 Winmail 的邮件服务器IP是1Array2.168.0.1 (蓝色字体内容由客户端输入,红色字体内容是服务返回的)

telnet 1Array2.168.0.1 25 --------------------------------------- 使用 telnet 命令连接服务器 25 端口
Trying 1Array2.168.0.1... --------------------------------------- 正在连接服务器 25 端口
Connected to 1Array2.168.0.1. ----------------------------------- 连接服务器 25 端口成功
220 Winmail Mail Server ESMTP ready ------------------------- 显示服务器的标识名称 (Winmail 管理工具->高级设置->系统参数->基本参数中可更改)
helo cnu.com ------------------------------------------------ 向服务器标识用户身份,发信不要认证,跳过下面几步直接发送 mail from 命令
250 Winmail Mail Server
ehlo cnu.com ------------------------------------------------ ESMTP 命令,发信需要认证。
250-Winmail Mail Server
250-PIPELINING
250-AUTH=LOGIN PLAIN
250-AUTH LOGIN PLAIN
250-SIZE 20480000
250 8BITMIME
auth login ------------------------------------------------- 进行用户身份认证
334 VXNlcm5hbWU6 
Y2ArrayzdGFAYW1heGl0Lm5ldA== ----------------------------------- BASE64 加密后的用户名
334 UGFzc3dvcmQ6 
MTk4MjIxNA== ----------------------------------------------- BASE64 加密后的密码
235 auth successfully -------------------------------------- 身份认证成功
(535 auth failure ------------------------------------------ 身份认证失败)
发到本系统中域名下的账户可跳过身份认证。
mail from: <test1@domain.com> ------------------------------ mail from 地址 test1@domain.com
250 ok ----------------------------------------------------- 命令执行成功
rcpt to: <test2@domain.com> -------------------------------- 递送给地址 test2@domain.com
250 ok ----------------------------------------------------- 命令执行成功
data ------------------------------------------------------- 数据传输初始化
354 go ahead ----------------------------------------------- 开始传输数据
From: test1@domain.com
To: test2@domain.com
Date: Mon, 25 Oct 2004 14:24:27 +0800
Subject: test mail

Hi, test2
This is a test mail, you don’t reply it.

.
------------------------------------------------------------ 数据内容,包括BASE64加密后的邮件内容, 以 CRLF.CRLF 结束数据传输
250 ok message accepted for delivery ----------------------- 命令执行成功
quit ------------------------------------------------------- 结束会话
221  Winmail Mail Server
Connection closed by foreign host .------------------------- 断开连接

 

以上文字转载自 http://www.sudu.cn/info/index.php?op=article&id=279800

分享到:
评论

相关推荐

    Java Socket 实现SMTP邮件发送,支持SSL/TSL

    而Java Socket库则提供了实现SMTP客户端所需的基本功能,允许我们创建连接到SMTP服务器的套接字,并通过这个连接发送邮件。以下是一些关键知识点: 1. **Java Socket类**:Java的`java.net.Socket`类是网络通信的...

    java 纯Socket发送邮件

    Java纯Socket发送邮件的知识点涉及了Java网络编程和电子邮件协议,特别是SMTP(Simple Mail Transfer Protocol)。在Java中,我们可以使用Socket类直接与SMTP服务器通信,实现邮件的发送。以下是对这个主题的详细...

    Java通过Socket发送邮件

    通过Socket发送邮件的Java小程序

    java socket编程发送邮件

    本程序用socket编程实现发送邮件的功能,并测试成功

    用Java Socket实现SMTP邮件发送

    3. 发送邮件:使用MAIL FROM命令指定发件人地址,使用RCPT TO命令指定收件人,然后使用DATA命令发送邮件内容。 4. 关闭连接:发送QUIT命令结束会话并关闭连接。 在`TestSmtpMail.java`这个文件中,我们可以看到以下...

    java socket发送SMTP邮件,支持SSL,支持发附件,抄送且发送的邮件标题内容都无乱码!

    java socket发送SMTP邮件,支持SSL,支持发附件,抄送且发送的邮件标题内容都无乱码!

    Java socket 代理邮件发送程序

    Java socket 代理邮件发送程序,测试无问题,才敢上传!

    java socket实现smtp发送邮件,支持SSL

    Java Socket 实现 SMTP 发送邮件是一项常见的编程任务,尤其在自动化通知、系统间通信或用户交互中非常有用。SMTP(Simple Mail Transfer Protocol)是互联网上用于传输电子邮件的标准协议,而Java Socket则是Java...

    基于java的简单socket邮件发送

    在Java中,我们需要遵循SMTP命令的规范来与服务器交互,例如,发送"HELO"命令来初始化会话,"MAIL FROM:"指定发件人,"RCPT TO:"指定收件人,最后是"DATA"命令来发送邮件内容。 4. **关闭连接**:完成邮件发送后,...

    Java Socket Email 发送接收

    Java Socket电子邮件发送与接收是基于Java网络编程技术实现的一种通信方式,主要涉及到Java的Socket类以及Email相关的API。本项目是一个课程项目,开发者通过几天的努力完成了一个具备图形用户界面(GUI)的邮件系统...

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

    在IT行业中,网络通信是不可或缺...总的来说,利用Socket发送和接收邮件涉及到网络编程、邮件协议、Java的I/O和特定的Java邮件API。这不仅有助于开发自定义的邮件客户端,也有助于理解电子邮件在网络传输中的工作原理。

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

    Java Socket 实现 SMTP 协议发送邮件 Java Socket 是 Java 语言中用于实现网络编程的 API,通过 Socket,可以实现与远程服务器的通信。在这里,我们将使用 Java Socket 实现 SMTP 协议来发送邮件。 SMTP 协议简介 ...

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

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

    用java socket实现smtp邮件发送,支持SSL

    而Java Socket则可以作为客户端,连接到SMTP服务器,执行发送邮件的命令序列。首先,我们需要创建一个Socket实例,指定SMTP服务器的IP地址和端口号。SMTP服务器通常监听25号端口,但若启用SSL/TLS,可能会使用465或...

    java 发送邮件发送邮件发送邮件

    根据给定的文件标题、描述、标签以及部分内容,我们可以总结出以下关于使用...在实际开发中,使用JavaMail API更为推荐,它提供了更高级和更安全的功能,而直接通过Socket发送邮件的方式主要用于教学或理解底层原理。

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

    6. 发送邮件的实际内容,包括邮件头和邮件体。 7. 发送结束符`"."`,表示邮件内容结束。 8. 发送`QUIT`命令,断开与SMTP服务器的连接。 ### 结论 使用Java的Socket编程实现SMTP邮件发送是一种直接且有效的方法,...

    Java编程实现邮件发送(含身份验证)

    发送邮件涉及到SMTP(简单邮件传输协议),这是一个基于TCP/IP协议的服务器-客户端模型,而Socket正好可以用来建立这种连接。 邮件发送通常需要使用JavaMail API,一个开放源代码的Java库,它提供了一系列的类和...

    java实现发送邮件

    1. **Socket连接**:发送邮件的基础是通过Socket协议连接至邮件服务器。这种方式可以直接通过SMTP协议进行邮件的发送。 2. **邮件服务器地址**:发送邮件前必须知道邮件服务器的地址,这通常是SMTP服务器的地址,...

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

    - 鉴权通过后,发送邮件内容或文件数据到服务器。 3. **数据传输与处理**: - 在客户端和服务器之间建立稳定的连接后,使用输入流和输出流进行数据交换。 - 服务器端读取客户端发送的数据,根据协议解析邮件内容...

    Spring 3.x企业应用开发实战 附录 A - JavaMail 发送邮件

    ### Spring 3.x企业应用开发实战之JavaMail发送邮件知识点详解 #### 一、JavaMail基础知识的快速学习 ##### 1.1 JavaMail概述 JavaMail是Java领域中最为知名的邮件解决方案之一,由Sun Microsystems(现已被...

Global site tag (gtag.js) - Google Analytics