`

java实现SMTP邮件服务器

阅读更多

电子邮件传递可以由多种协议来实现。目前,在Internet 网上最流行的三种电子邮件协议是SMTP、POP3 和 IMAP,下面分别简单介绍。

  ◆ SMTP 协议

  简单邮件传输协议(Simple Mail Transfer Protocol,SMTP)是一个运行在TCP/IP之上的协议,用它发送和接收电子邮件。SMTP 服务器在默认端口25上监听。SMTP客户使用一组简单的、基于文本的命令与SMTP服务器进行通信。在建立了一个连接后,为了接收响应,SMTP客户首先发出一个命令来标识它们的电子邮件地址。如果SMTP服务器接受了发送者发出的文本命令,它就利用一个OK响应和整数代码确认每一个命令。客户发送的另一个命令意味着电子邮件消息体的开始,消息体以一个圆点“.”加上回车符终止。

  ◆ POP3 协议

  邮局协议(Post Office Protocol Version 3,POP3)提供了一种对邮件消息进行排队的标准机制,这样接收者以后才能检索邮件。POP3服务器也运行在TCP/IP之上,并且在默认端口110上监听。在客户和服务器之间进行了初始的会话之后,基于文本的命令序列可以被交换。POP3客户利用用户名和口令向POP3服务器认证。POP3中的认证是在一种未加密的会话基础之上进行的。POP3客户发出一系列命令发送给POP3服务器,如:请求客户邮箱队列的状态、请求列出的邮箱队列的内容和请求检索实际的消息。POP3代表一种存储转发类型的消息传递服务。现在,大部分邮件服务器都采用SMTP发送邮件,同时使用POP3接收电子邮件消息。

  ◆ IMAP 协议

  Internet 消息访问协议(Internet Message Access Protocol,IMAP)是一种电子邮件消息排队服务,它对POP3的存储转发限制提供了重要的改进。IMAP也使用基于文本命令的语法在TCP/IP上运行,IMAP服务器一般在默认端口143监听。IMAP服务器允许IMAP客户下载一个电子邮件的头信息,并且不要求将整个消息从服务器下载至客户,这一点与POP3是相同的。IMAP服务器提供了一种排队机制以接收消息,同时必须与SMTP相结合在一起才能发送消息。

  下面以SMTP发送电子邮件为例讲解怎样用Java 实现SMTP 服务器应用功能,从而完成邮件的发送的。

  SMTP 命令

  SMTP协议是目前网上流行的发送E-Mail的协议,SMTP协议共有14条命令。不过,发一封E-Mail只需用如下5条命令就足够了,分别为:

  ◆ HELO <SP> <domain> <CRLF> ,与SMTP服务器握手,传送本机域名;

  ◆ MAIL <SP> FROM:<reverse-path> <CRLF>,传送发信者的信箱名称;

  ◆ RCPT <SP> TO:<forward-path> <CRLF>,传送接收者的信箱名称;

  ◆ DATA <CRLF>,发送信件数据(包括信头和信体);

  ◆ QUIT <CRLF>,退出与SMTP服务器的连接。

编程思路

  首先我们设计一个邮件发送程序的交互界面,界面中包括用户输入邮件的收件人、发信人和主题组件的单行文本框,书写邮件内容的多行文本框等。然后为了能够实现E-mail的发送和设置,我们设计一个SmtpMail类,它封装了与邮件服务器之间的Socket 通信操作,以及SMTP 命令的发送和响应信息的接收。

  编程技巧说明

  1.设置窗体和组件

  我们设计了一个MailSendFrame()类继承Frame 对象,作为容纳组件的主窗体。Main()函数实现将窗体启动时置于屏幕的正中央,窗口定义代码如下:

public static void main(String[] args) {
mailSendFrame mailSendFrame = new mailSendFrame();
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
Dimension frameSize = mailSendFrame.getSize();
if (frameSize.height > screenSize.height) {
frameSize.height = screenSize.height;
}
if (frameSize.width > screenSize.width) {
frameSize.width = screenSize.width;
}
mailSendFrame.setLocation((screenSize.width - frameSize.width) / 2,
(screenSize.height - frameSize.height) / 2);
mailSendFrame.setVisible(true);
mailSendFrame.show();
}

  在Main()函数中,首先利用代表系统信息的Toolkit对象得到当前系统中设置的屏幕分辨率,并且用分辨率和窗体的大小作比较,然后,调用MailSendFrame的SetLocation()方法设置窗体的左上角坐标,使窗体的中心和屏幕的中心正好重合,从而将窗体居中。

//组件实例变量的定义
Panel panelMain = new Panel();
Panel panelUp = new Panel();
Panel panel3 = new Panel();
Panel panel4 = new Panel();
Panel panel6 = new Panel();
Panel panel7 = new Panel();
TextField txtServer = new TextField();
TextField txtTo = new TextField();
TextField txtFrom = new TextField();
TextField txtSubject = new TextField();
Panel panel8 = new Panel();
Label lblFile = new Label();
Button cmdBrowse = new Button();
Panel panelDown = new Panel();
TextArea txtMail = new TextArea();
Panel panel10 = new Panel();
Button cmdSend = new Button();
Button cmdExit = new Button();
.......
.......
panelMain.add(panelUp, null);
panelUp.add(panel3, null);
panel3.add(new Label("发信服务器:"), null);
panel3.add(txtServer, null);
panelUp.add(panel4, null);
panel4.add(new Label("收件人:"), null);
panel4.add(txtTo, null);
panelUp.add(panel6, null);
panelUp.add(panel7, null);
panel7.add(new Label("主题:"), null);
panel7.add(txtSubject, null);
panel6.add(new Label("发件人:"), null);
panel6.add(txtFrom, null);
panelUp.add(panel8, null);
panel8.add(new Label("附件: "), null);
panel8.add(lblFile, null);
panel8.add(cmdBrowse, null);
panelMain.add(panelDown, null);
panelDown.add(txtMail, BorderLayout.CENTER);
panelDown.add(panel10, BorderLayout.SOUTH);
panel10.add(cmdSend, null);
panel10.add(cmdExit, null);
panelDown.add(new Label(" "), BorderLayout.EAST);
panelDown.add(new Label(" "), BorderLayout.WEST);
........
........

  窗体组件的定义都是在Init()方法中完成,设置好收件人、发信人和主题组件的单行文本框,书写邮件内容的多行文本框,以及附件中的浏览按钮、发送和退出按钮。

2.窗体中的事件处理

  事件处理也是在Init()方法中完成。选取附件文件的“浏览”按钮的事件处理,在单击该按钮时,打开一个OpenFileDialog 文件对话框,读取用户所选取的文件名。打开文件对话框的“浏览”按钮的代码如下:

private FileDialog openFileDialog= new FileDialog(this,"打开文件",FileDialog.LOAD);
public mailSendFrame() {
try {
Init();
}
catch(Exception e) {
e.printStackTrace();
}
}
......
......

  单击“发送”按钮的事件处理,实现用户填写邮件信息的收集和邮件的发送操作。“发送”按钮的代码如下:

cmdSend.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
cmdSend_actionPerformed(e);
}
}

  实现cmdSend_actionPerformed()方法如下:

void cmdSend_actionPerformed(ActionEvent e) {
mailSender.setFrom(txtFrom.getText().trim());
mailSender.setTo(txtTo.getText().trim());
mailSender.addHeader("Subject",txtSubject.getText().trim()) ;
mailSender.addData(txtMail.getText()) ;
if(!lblFile.getText().trim().equals("") )
mailSender.addAttachment(lblFile.getText().trim());
mailSender.open(txtServer.getText().trim(),25);
mailSender.transmit();
mailSender.close();
}

  单击“退出”按钮的事件处理,实现程序的退出和窗体的关闭。“退出”按钮和侦听器的程序代码如下:

cmdExit.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
cmdExit_actionPerformed(e);
}
}
this.addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosing(WindowEvent e) {
this_windowClosing(e);
}
}

  上面程序分别为退出和窗体注册事件的侦听器或适配器,它们处理各自的交互动作。实现cmdExit_actionPerformed()和this_windowClosing()方法如下:

void cmdExit_actionPerformed(ActionEvent e) {
System.exit(0);
}
void this_windowClosing(WindowEvent e) {
System.exit(0);
}
3.SmtpMail 类的实现

  采用Open()方法,建立与邮件服务器之间的TCP/IP 连接,创建套接字,并且得到发送命令所用的输出流Send 和接收服务器相应所用的输入流Rev。Open()方法的代码如下:

public int open(String serverName, int port){
try{
mailSocket = new Socket(serverName, port);
send = new PrintWriter(mailSocket.getOutputStream(), true);
recv = new BufferedReader(new InputStreamReader(mailSocket.getInputStream()));
String s1 = recv.readLine();
char c = s1.charAt(0);
if((c == '4') | (c == '5'))
return 0;
}
catch(Exception e){
return 0;
}
return 1;
}

  在SmtpMail 类中,通过Transmit()方法完成发送任务。Transmit()方法的代码如下:

public int transmit(){
boolean flag = true;
//发送HELO 命令
if(domain.length() != 0){
int i = sendString("HELO " + domain);
if(i != 1)
return 0;
}
//发送MAIL FROM 命令(发件人)
if(from.length() != 0){
int j = sendString("MAIL FROM:" + from);
if(j != 1)
return 0;
}
//发送RCPT TO 命令(收件人)
if(to.length() != 0){
int k = sendString("RCPT TO:" + to);
if(k != 1)
return 0;
}
//发送邮件正文(DATA 命令)
if(sendString("DATA") != 1)
return 0;
//发送邮件头信息
for(int l = 0; l < x_set.size(); l += 2){
String s = (String)x_set.elementAt(l);
send.println(s + ": " + x_set.elementAt(l + 1));
}
//发送时间及相关内容格式说明
if(x_set.indexOf("Date") < 0)
send.println("Date: " + (new Date()).toString());
........
........

  使用SendString()方法来发送字符串命令,并且接收邮件服务器的响应信息,判断命令是否被接收。返回1表示命令被拒绝执行,返回0表示命令被接受。SendString()方法的代码如下:

private int sendString(String s){
String s1 = "";
try{
send.println(s);
s1 = recv.readLine();
}
catch(Exception e){
System.out.print(s1);
return 0;
}
if(s1.length() == 0)
return 0;
char c = s1.charAt(0);
return !((c == '4') | (c == '5')) ? 1 : 0;
}

  使用Close()方法来关闭与服务器之间的套接字连接。该方法发送“QUIT”命令,收到响应消息后,才真正关闭连接。Close()方法的代码如下:

public int close(){
int i = 0;
try{
i += sendString("QUIT");
mailSocket.close();
}
catch(Exception e){
return 0;
}
return i == 0 ? 1 : 0;
}

mailSendFrame.java源程序代码如下:

import java.awt.*;
import java.awt.event.*;
public class mailSendFrame extends Frame {
smtpMail mailSender=new smtpMail();
Panel panelMain = new Panel();
Panel panelUp = new Panel();
Panel panel3 = new Panel();
Panel panel4 = new Panel();
Panel panel6 = new Panel();
Panel panel7 = new Panel();
TextField txtServer = new TextField();
TextField txtTo = new TextField();
TextField txtFrom = new TextField();
TextField txtSubject = new TextField();
Panel panel8 = new Panel();
Label lblFile = new Label();
Button cmdBrowse = new Button();
Panel panelDown = new Panel();
TextArea txtMail = new TextArea();
Panel panel10 = new Panel();
Button cmdSend = new Button();
Button cmdExit = new Button();
private FileDialog openFileDialog
= new FileDialog(this,"打开文件",FileDialog.LOAD);
public mailSendFrame() {
try {
Init();
}
catch(Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
mailSendFrame mailSendFrame = new mailSendFrame();
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
Dimension frameSize = mailSendFrame.getSize();
if (frameSize.height > screenSize.height) {
frameSize.height = screenSize.height;
}
if (frameSize.width > screenSize.width) {
frameSize.width = screenSize.width;
}
mailSendFrame.setLocation((screenSize.width - frameSize.width) / 2,
(screenSize.height - frameSize.height) / 2);
mailSendFrame.setVisible(true);
mailSendFrame.show();
}
private void Init() throws Exception {
this.setLayout(new BorderLayout());
panelMain.setLayout(new GridLayout(2,1));
panelUp.setLayout(new GridLayout(6,1));
panel3.setLayout(new FlowLayout());
this.setVisible(true);
.......
.......
//smtpMail.java 的源代码
import java.io.*;
import java.net.Socket;
import java.util.*;
public class smtpMail{
private boolean sendConf=false;
public static final int OK = 1;
public static final int ERROR = 0;
private static final String TEXT = "1";
private static final String TFILE = "2";
private static final String BFILE = "3";
private static final String CPR = "Java 1.0";
private static final String MAILER = "X-Mailer";
private static final int BUFFER_SIZE = 48;
private String DELIMETER;
private String SEPARATOR;
private static final int HOW_LONG = 6;
private static final char SMTP_ERROR_CODE1 = 52;
private static final char SMTP_ERROR_CODE2 = 53;
private static final int fillchar = 61;
private static final String cvt =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
private Socket mailSocket;
private BufferedReader recv;
private PrintWriter send;
private String from;
private String to;
private String domain;
private Vector x_set;
private Vector body;
private Vector attach;
public smtpMail(){
DELIMETER = "";
SEPARATOR = "";
mailSocket = null;
recv = null;
send = null;
from = "";
to = "";
domain = "";
x_set = new Vector();
body = new Vector();
attach = new Vector();
DELIMETER = getId();
SEPARATOR = System.getProperty("file.separator");
}

分享到:
评论

相关推荐

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

    Java Socket编程是Java...通过阅读和理解这些代码,你可以深入学习如何在Java中使用Socket和SSL/TLS实现SMTP邮件发送。实践是掌握这些知识的最佳方式,建议动手尝试编写一个简单的SMTP邮件发送程序,以巩固理论知识。

    纯java开发邮件服务器(SMTP和POP3协议)

    在Java中,我们可以使用`javax.mail`和`com.sun.mail.smtp`这两个库来实现SMTP客户端,与邮件服务器进行通信。首先,我们需要创建一个`Session`对象来配置SMTP服务器的参数,如主机名、端口号和认证信息。然后,通过...

    用Java实现SMTP服务器

    SMTP协议允许邮件从发件人传递到收件人的邮件服务器上,它通过一系列的命令与响应来确保邮件的正确传输。当客户端连接到SMTP服务器时,它首先会发出`HELO`或`EHLO`命令,指定其域名。然后,客户端使用`MAIL FROM:`...

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

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

    使用java简单实现基于smtp协议的邮件收发

    SMTP(Simple Mail Transfer Protocol)是一种互联网标准,用于在邮件服务器之间发送电子邮件。以下将详细介绍如何使用 Java 实现这个功能,以及需要注意的一些关键点。 首先,我们需要导入 JavaMail API,这是一个...

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

    在提供的"SocketForSmtp"压缩包文件中,可能包含了一个简单的Java示例代码,演示了如何用Socket实现SMTP邮件发送并支持SSL/TLS。这个示例代码可能包括了以上提到的所有步骤,包括错误处理和异常捕获,以便在遇到问题...

    用Java Socket实现SMTP邮件发送

    SMTP(Simple Mail Transfer Protocol)是一种用于发送电子邮件的标准协议,而使用Java Socket来实现SMTP邮件发送,可以让我们在Java程序中直接进行邮件的传输。 首先,我们需要了解SMTP的工作流程。SMTP服务器负责...

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

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

    邮件服务器 Java写的源代码 SMTP+POP3

    本文将基于提供的标题“邮件服务器 Java写的源代码 SMTP+POP3”和描述,深入讲解邮件服务器的基本概念、SMTP和POP3协议,以及如何用Java语言来实现。 一、邮件服务器基础 邮件服务器是一种特殊的应用服务器,它的...

    用Java实现SMTP服务器.doc

    在Java中实现SMTP服务器功能,开发者还需要熟悉Java的网络编程API,如`java.net.Socket`和`java.io`包中的类,以及可能的第三方库,如Apache Commons Net或JavaMail API,来简化SMTP通信。同时,为确保程序的稳定性...

    用java实现pop3邮件服务器.rar_java pop3 server_java 邮件服务器_pop3 java_服务器 j

    同时,实现一个邮件服务器也可以作为构建更复杂分布式系统的基础,比如整合SMTP服务器实现完整的邮件系统。 在提供的"用java实现pop3邮件服务器.txt"文件中,可能包含了具体的代码实现和解释,而"www.pudn.com.txt"...

    java smtp发送邮件

    SMTP(Simple Mail Transfer Protocol)是一种互联网标准,用于从一个邮件服务器向另一个邮件服务器发送电子邮件。以下将详细介绍Java如何利用SMTP协议发送邮件,以及相关的关键知识点。 首先,我们需要引入...

    Java调用SMTP命令发邮件,实现抄送,附件--无需邮件搭建邮件服务器直接发送

    本教程将详细讲解如何使用Java通过SMTP(Simple Mail Transfer Protocol)协议来发送邮件,包括抄送和添加附件,而无需搭建自己的邮件服务器。 首先,我们需要引入JavaMail API,这是一个开源库,提供了在Java中...

    Java开源邮件服务器james源码

    Java开源邮件服务器Apache James是基于Java技术构建的一款强大的邮件服务器软件。它的源代码开放,允许开发者深入了解其工作原理,并可根据需求进行定制化开发。Apache James 2.3.2是该项目的某个稳定版本,提供了...

    smtp.rar_SMTP邮件_smtp_smtp 服务器_发送邮件

    在Python中,可以使用`smtplib`库来实现SMTP邮件发送。例如: ```python import smtplib from email.mime.text import MIMEText msg = MIMEText('这是一封测试邮件') msg['Subject'] = 'SMTP测试' msg['From'] = '...

    java开发的邮件服务器,对于发送文本邮件十分方便

    标签中的“JAVA”指Java编程语言,是实现邮件服务器功能的基础。“邮件服务”指的是邮件的发送和接收功能,“发送邮件”则特指通过编程方式发送邮件的能力。 综上所述,JavaMail为Java开发者提供了一套全面的邮件...

    java中利用smtp服务器发送邮件实例

    `Session`是与邮件服务器通信的主要组件。 ```java Session session = Session.getInstance(props, new Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new ...

    Java调用SMTP命令发邮件,实现抄送,附件--无需邮件搭建邮件服务器直接发送(2013-8-20修改版)

    Java调用SMTP命令发邮件,实现抄送,密送,附件等。 无需邮件搭建邮件服务器直接发送,改版加入了多线程,同时邮件日志采用文件和数据库同时记录,并写了定时器对于发送失败的邮件进行统计和重发(还在完善这个功能,该...

    纯JAVA开发邮件服务器

    本项目"纯JAVA开发邮件服务器"旨在提供一个完全基于Java语言实现的SMTP(Simple Mail Transfer Protocol)和POP3(Post Office Protocol version 3)服务器解决方案,不依赖任何外部插件,具有高度自定义性和可扩展...

    SMTP-java.rar_java mail_java smtp_java 邮件客户端_smtp_smtp java

    在这个名为"SMTP-java.rar"的压缩包中,我们可以期待找到用Java实现的SMTP邮件客户端源代码,这将有助于我们理解如何在Java应用中发送邮件。 SMTP协议主要负责将邮件从发件人的邮件服务器传递到收件人的邮件服务器...

Global site tag (gtag.js) - Google Analytics