`
fuyanqing03
  • 浏览: 61631 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

java socket 实现SMTP协议 发送邮件

阅读更多
package com.socket.test;

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;

/**
* 通过socket向smtp协议服务器发送邮件
* @author fuyanqing
*
*/
public class SocketMail {
String mailServer;
String from;
String to;
String content;
String lineFeet = "\r\n";
private int port = 25;

Socket client;
BufferedReader in;
DataOutputStream os;

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;
}
/**
* 初始化连接
* @return
*/
private boolean init(){
boolean boo = true;
if(mailServer==null || "".equals(mailServer)){
return false;
}
try {
client = new Socket(mailServer,port);
in = new BufferedReader(new InputStreamReader(client.getInputStream()));
os = new DataOutputStream(client.getOutputStream());
String isConnect = response();
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;
}
return boo;
}
/**
* 发送smtp指令
* 并返回服务器响应信息
*/
private String sendCommand(String msg){
String result = null;
try {
os.writeBytes(msg);
os.flush();
result = response();
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
/**
* 读取服务器端响应信息
* @return
*/
private String response(){
String result = null;
try {
result = in.readLine();
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
/**
* 关闭
*/
private void close(){
try {
os.close();
in.close();
client.close();
} catch (IOException e) {
e.printStackTrace();
}

}
/**
* 发送邮件
* @return
*/
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")){
}else{
System.out.println("握手失败:"+result);
return false;
}
//验证发信人信息
String auth = sendCommand("AUTH LOGIN"+lineFeet);
if(isStartWith(auth,"334")){
}else{
return false;
}
String user = sendCommand(new String(Base64.encode("*****".getBytes()))+lineFeet);
if(isStartWith(user,"334")){
}else{
return false;
}
String pass = sendCommand(new String(Base64.encode("*****".getBytes()))+lineFeet);
if(isStartWith(pass,"235")){
}else{
return false;
}


//发送指令
String f = sendCommand("Mail From:<"+from+">"+lineFeet);
if(isStartWith(f,"250")){
}else{
return false;
}
String toStr = sendCommand("RCPT TO:<"+to+">"+lineFeet);
if(isStartWith(toStr,"250")){
}else{
return false;
}

String data = sendCommand("DATA"+lineFeet);
if(isStartWith(data,"354")){
}else{
return false;
}

StringBuilder sb = new StringBuilder();
sb.append("From:<"+from+">"+lineFeet);
sb.append("To:<"+to+">"+lineFeet);
sb.append("Subject:test"+lineFeet);
sb.append("Date:2010/10/27 17:30"+lineFeet);
sb.append("Content-Type:text/plain;charset=\"GB2312\""+lineFeet);
sb.append(lineFeet);
sb.append(content);
sb.append(lineFeet+"."+lineFeet);

String conStr = sendCommand(sb.toString());
if(isStartWith(conStr,"250")){
}else{
return false;
}

//quit
String quit = sendCommand("QUIT"+lineFeet);
if(isStartWith(quit,"221")){
}else{
return false;
}
close();
return true;
}
private boolean isStartWith(String res,String with){
return res.startsWith(with);
}
public static void main(String[] args){
SocketMail mail = new SocketMail();
mail.setMailServer("smtp.163.com");
mail.setFrom("*****@163.com");
mail.setTo("*****@163.com");
mail.setContent("hello,this is a test mail!");
boolean boo = mail.sendMail();
if(boo)
System.out.println("邮件发送成功!");
else{
System.out.println("邮件发送失败!");
}
}
}
分享到:
评论
4 楼 sp42 2015-08-10  
yuyaangel 写道
已经解决了。。。

我也不想用javamail包,你是怎么解决的?
3 楼 sp42 2015-08-10  
非常不错
2 楼 yuyaangel 2012-03-28  
已经解决了。。。
1 楼 yuyaangel 2012-03-26  
你有没有试过hotmail?hotmail开放了25和587端口,两者均要通过STARTTLS,就是先建立一个普通的Socket发一个helo,然后要转换为SSLSocket进行登录等后续操作。
我就是想问一下如何将普通的Socket转换为SSLSocket,这个问题纠结了我几天了,在网上查到了的一些思路是用SocketEngine和Channels,看了java的官方文档,还是不会用。
最好是要有代码的,我要的是用Socket写的,不是javamail包的。。。

相关推荐

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

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

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

    2. **SMTP协议**:SMTP规定了邮件发送的格式和步骤,包括建立连接、身份验证、提交邮件等操作。在Java中,通常需要自定义SMTP通信的逻辑,例如使用`OutputStream`发送SMTP命令,处理服务器的响应。 3. **SMTP认证**...

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

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

    用Java Socket实现SMTP邮件发送

    总的来说,通过Java Socket实现SMTP邮件发送涉及到网络编程、SMTP协议理解、异常处理等多个知识点。这种技术在日常工作中非常实用,可以方便地集成到各种自动化任务或系统中,如定时发送报告、系统通知等。然而,...

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

    在本案例中,我们将讨论如何使用Java Socket来实现SMTP(Simple Mail Transfer Protocol)邮件发送,并支持SSL(Secure Sockets Layer)或TLS(Transport Layer Security)安全协议。 SMTP是一种互联网标准,用于在...

    java_socket_smtp.rar_SMTPFrame.java_java base64 smtp_java socket

    SMTP(Simple Mail Transfer Protocol)是互联网上用于发送...如果你想要学习如何用Java发送邮件,理解这个项目中的`SMTPFrame.java`代码将非常有帮助,同时掌握SMTP协议的基本流程和Java Socket编程也是必不可少的。

    笔者根据smtp协议使用Java Socket写了一个发送邮件的程序,将此与各位分享.doc

    总的来说,Java Socket结合SMTP协议可以实现基本的邮件发送功能,但实际应用中,使用专门的邮件库通常更为便捷和安全。然而,理解SMTP协议和Socket编程的基本原理对于开发者来说仍然非常重要,因为它有助于理解邮件...

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

    2. **SMTP协议**:遵循标准的SMTP协议规范,确保与不同的邮件服务器兼容。 3. **错误处理**:实现异常处理机制,如超时、断开连接等情况下的重连策略。 4. **多线程管理**:优化服务器端的线程池,避免资源浪费和...

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

    **SMTP协议**:SMTP是一种用于在互联网上发送邮件的协议。它定义了邮件服务器之间交换邮件的标准格式和过程。SMTP服务器通常用于将邮件从发件人的邮箱传递到收件人的邮箱。SMTP交互通常包括认证、连接、邮件传输和...

    用Java实现SMTP服务器

    在本文中,我们将探讨如何使用Java语言来实现一个基本的SMTP服务器,这将涵盖SMTP协议的基础概念、关键操作以及具体的Java代码实现。 #### SMTP协议概览 SMTP协议允许邮件从发件人传递到收件人的邮件服务器上,它...

    Java用Socket实现EMAIL的实例.rar_ javamail_java socket _java socket ema

    总的来说,通过Java的Socket实现EMAIL发送,虽然相对复杂,但有助于深入理解网络通信和SMTP协议的工作原理。如果你正在学习网络编程或者想要深入了解邮件发送的底层机制,这是一个非常有价值的实践项目。

    Java邮件服务器smtp协议&pop3协议

    自己用java socket编程,按照smtp协议及pop3协议进行编写的服务器程序,是在Outlook Express上面可以完全运作的两个服务器,里面详细的写出了代码的注释,以及Outlook Express运行发送接收下载删除邮件操作的步骤........

    计算机网络邮件收发 SMTP和POP3实现

    然后,使用SMTP协议发送邮件,这个过程涉及构建邮件头部(包括发件人、收件人信息)和邮件正文,并将它们发送到指定的邮件服务器。接收邮件则需要使用POP3协议,通过连接到邮件服务器,获取邮件列表,下载邮件内容到...

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

    虽然现代的邮件发送库如JavaMail提供了更高级的功能和错误处理,但对于学习网络编程原理和SMTP协议来说,基于Socket的实现是一个很好的起点。通过理解并实践这一过程,开发者可以更好地掌握网络通信的基础知识,为...

    java 纯Socket发送邮件

    - 虽然题目要求的是纯Socket方式,但通常推荐使用JavaMail API来发送邮件,因为它封装了SMTP协议的复杂性,提供更高级别的接口。 - JavaMail API包括`javax.mail`和`javax.mail.internet`包,可以方便地处理邮件头...

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

    本篇将详细讲解如何利用Java的Socket编程来实现邮件的发送和接收。 首先,我们来看标签中的"源码"和"工具",这暗示我们将探讨的是具体的编程实现和可能的实用工具。在这个场景下,`POP3Demo.java`和`sendSMTPMail....

    Java Socket Email 发送接收

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

    java socket 邮件客户端

    6. **Transport**: 负责将创建好的Message对象发送到指定的邮件服务器,使用SMTP协议。 在Java Socket邮件客户端的实现中,通常会遵循以下步骤: 1. **配置邮件服务器**:使用Properties对象设置SMTP服务器的相关...

Global site tag (gtag.js) - Google Analytics