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

首页 新闻 论坛 问答 博客 招聘 更多
专栏 <!--<a href="http://www.iteye.com/articles">文摘</a>//--> 圈子 搜索
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();
}
}
}
}
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
主要功能: 1、可以发送带附件的邮件,附件可以是多个,附件大小限制由发送服务器而定,暂未测试具体为多少MB 2、邮件内容和主题可以是空,但当有附件时,主题取第一个附件的文件名(不含扩展名) 3、密码验证均为base64加密 4、邮件正文和附件的数据传送方式,均为base64 5、自动解析发件箱的SMTP服务器 压缩包文件简介: base.c:包含一些基本的函数,其中有一些在此程序中并未用到,只要使用了其中的base64加密算法 mail.c:包含邮件发送、数据读取、编码转换、smtp服务器连接、ip解析等函数 mailsend.c:包含main的c源文件,mail.exe则是根据mailsend.c、mail.c、base.c编译成的,具体编译方 法可参考makefile libbase.a:make之后生成的静态库 moontalk.cfg:base.c用到的配置文件,可能没用,放在这里进攻阅读参考 mail.cfg:自定义用户的配置文件,可用可不用,用作读代码的参考 mail.exe:邮件发送的执行文件,仅有命令行模式完善了,逐步输入(直接双击)的方式还不完善 b64.exe:base64加密解密的小工具,仅供参考,mail.cfg中用到密码的地方,可以使这个工具得到。 makefile:工程编译链接文件 注意:在本地使用mingw环境开发,遵循ANSI C标准,本地有系统的工程库,但是上传的时候,把这些文件 都放在一起了,可以先参考makefile进行工程调整,如果有任何问题,请发送到邮箱[email protected], 技术交流,不胜感激。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值