java编写SMTP邮件服务器
某企业的邮件服务系统设计与实现

某企业的邮件服务系统设计与实现摘要:电子邮件(E-mail)在如今社会有着举足轻重的地位。
随着人们使用次数的增多,通过发送邮件、收集客户资料的移动商务方式受到众多企业的青睐。
本文叙述了电子邮件的定义,分析了Java Mail API和相关协议,开发设计基于Java mail某企业的邮件服务系统。
关键词:SMTP; POP; Javamail; 邮件收发1引言电子信箱、电子邮政,它主要是指个人利用各种电子邮件方式将个人信息通过邮件进行交换的一种通信方式及其手段,在国际互联网中已经得到广泛的普及和应用。
在Internet网络资源中,电子邮箱系统并不是端对端的服务,其核心是存储和发送的服务。
利用收发存储的功能可以实现无连接通信,称作是一种异步通信[1]。
随着技术人员的能力逐渐提高,进一步开发了基于JavaMail邮件系统。
技术人员采用多线程的设计手段,基于JavaMail邮件系统的通信效率得到了提高,大大降低了电子邮件系统使用成本,邮件系统采用新的MVC设计模式的也大大降低了系统的维护难度。
2国内外研究现状从安全的角度考虑:过去传统的邮件系统保护措施不足,到今天为止,仍然有许多网络用户使用安全版本低的邮件系统,缺少安全保护能力。
全球的木马邮件和垃圾邮件问题逐渐恶化,也使得电子邮件系统发展过程中变得举步维艰。
许多用户和企业希望电子邮件系统能进一步加强加密、防木马、杜绝垃圾邮件的措施,解决电子邮件安全性问题。
针对电子邮件存在的漏洞,国内外的技术人员深入分析电子邮件系统,在系统每个层次面上作大量开发研究。
多进程/多线程的技术能大大提高邮件系统处理任务的效率,高速缓存使得电子邮件在服务器中高速数据交换,快速队列机制能够实现用户之间邮件快速收发。
3邮件协议和JavaMail API3.1邮件协议(1)SMTP:全称“Simple Mail Transfer Protocol”顾名思义叫简单邮件传输协协议。
一般人们统称SMTP。
JavaWeb(十三)使用javamail进行发送邮件,(使用QQ,163,新浪邮箱服务器)

JavaWeb(⼗三)使⽤javamail进⾏发送邮件,(使⽤QQ,163,新浪邮箱服务器) 加油加油。
--WZY⼀、发送邮件的原理 在了解其原理之前,先要知道两个协议,SMTP和POP3 SMTP:Simple Mail Transfer Protocol,即简单邮件传输协议,发送邮件的协议,默认端⼝,25 POP3:Post Office Protocol 3,即邮局协议,接收邮件的协议,默认端⼝,110 知道了这两个协议,下⾯来说说邮件发送和接收的原理图,分两种,相同邮件(QQ邮箱给QQ邮箱)和不同邮件(QQ邮箱给163邮箱)是不⼀样的。
解释: 为了⽅便起见,将新浪邮箱,list@称为⽤户A,将搜狐邮箱,wangwu@ 称为⽤户B ⽤户A(新浪邮箱,list@)给⽤户B(搜狐邮箱,wangwu@)发送⼀封邮件,那么整个过程就为图中的实线部分,⽤户A通过OutLook(浏览器或者客户端)登录⾃⼰的邮箱帐号,编写邮件,使⽤Smtp协议发送给Sina的邮件服务器中的Smtp服务器(专门⽤来发送的服务器),然后在通过SMTP协议,传输给Sohu的邮件服务器中的Smtp服务器,然后通过Sohu的Smtp服务器将邮件发送给⽤户B的存储设备进⾏存储(每个⽤户都会有⼀个存储空间⽤来存储邮件的),到这⾥,⽤户A就相当于发送成功了,因为已经到达了⽬的地,如果B⽤户需要查看邮件内容,必须通过POP3服务器将从⾃⼰的存储设备中拿到,然后返回到浏览器或者客户端中显⽰。
⽤户B给⽤户A发送⼀封邮件,那么整个过程就为图中的虚线部分,是和A给B发⼀样的步骤 ⽤户A给⼀个同样使⽤新浪邮箱的⽤户C发送⼀封邮件,那么其过程就简单的多了,先通过Smtp服务器,然后smtp服务器会将其发送到⽤户C的存储设备上,A发送邮件就成功了,⽤户C要显⽰⾃⼰邮箱中的邮件,那么就通过POP3服务器从⾃⼰存储设备中拿取所有邮件进⾏查看。
⼆、通过Java代码实现发送邮件 2.1、准备jar包 核⼼:mail.jar 依赖:activation.jar,邮件需要发送附件时使⽤ 2.2、使⽤163邮箱发送邮件 2.2.1、⾸先在163邮箱中注册⼀个帐号。
Java实现发送邮件,图片,附件

Java实现发送邮件,图⽚,附件1、JavaMail 介绍JavaMail 是sun公司(现以被甲⾻⽂收购)为⽅便Java开发⼈员在应⽤程序中实现邮件发送和接收功能⽽提供的⼀套标准开发包,它⽀持⼀些常⽤的邮件协议,如前⾯所讲的SMTP,POP3,IMAP,还有MIME等。
我们在使⽤JavaMail API 编写邮件时,⽆须考虑邮件的底层实现细节,只要调⽤JavaMail 开发包中相应的API类就可以了。
JavaMail 下载地址:2、JavaMail APIJavaMail API 按照功能可以划分为如下三⼤类:①、创建和解析邮件的API②、发送邮件的API③、接收邮件的API以上三种类型的API在JavaMail 中由多个类组成,但是主要有四个核⼼类,我们在编写程序时,记住这四个核⼼类,就很容易编写出Java邮件处理程序。
Message 类:javax.mail.Message 类是创建和解析邮件的核⼼ API,这是⼀个抽象类,通常使⽤它的⼦类javax.mail.internet.MimeMessage 类。
它的实例对象表⽰⼀份电⼦邮件。
客户端程序发送邮件时,⾸先使⽤创建邮件的 JavaMail API 创建出封装了邮件数据的 Message 对象,然后把这个对象传递给邮件发送API(Transport 类)发送。
客户端程序接收邮件时,邮件接收API把接收到的邮件数据封装在Message 类的实例中,客户端程序在使⽤邮件解析API从这个对象中解析收到的邮件数据。
Transport 类:javax.mail.Transport 类是发送邮件的核⼼API 类,它的实例对象代表实现了某个邮件发送协议的邮件发送对象,例如 SMTP 协议,客户端程序创建好Message 对象后,只需要使⽤邮件发送API 得到 Transport 对象,然后把 Message 对象传递给 Transport 对象,并调⽤它的发送⽅法,就可以把邮件发送给指定的 SMTP 服务器。
课程设计 java邮件系统设计

网络邮件系统电子邮件作为Internet 最为广泛的应用之一,在人们的工作和生活中扮演着重要的角色,应用的普及使电子邮件技术有了飞速的发展。
网络电子邮件系统在当今的互联网上比比皆是,不管是windows 上的普及,还linux 上的稳定可靠和低廉;不管是分布式系统,还是基于P2P ,都离不开邮件系统的基本原理。
邮件传输原理在Internet 上将一段文本信息从一台计算机传送到另一台计算机上,可通过两种协议来完成,即 SMTP(Simple Mail Transfer Protocol ,简单邮件传输协议)和POP3(Post Office Protocol ,邮局协议3)。
SMTP 是Internet 协议集中的邮件标准。
在Internet 上能够接收电子邮件的服务器都有SMTP 。
电子邮件在发送前,发件方的SMTP 服务器与接收方的SMTP 服务器联系,确认接收方准备好了,则开始邮件传递;若没有准备好,发送服务器便会等待,并在一段时间后继续与接收方邮件服务器联系。
这种方式在Internet 上称为“存储——转发”方式。
POP3可允许E-mail 客户向某一SMTP 服务器发送电子邮件,另外,也可以接收来自SMTP 服务器的电子邮件。
换句话说,电子邮件在客户PC 机与服务提供商之间的传递是通过P0P3来完成的,而电子邮件在 Internet 上的传递则是通过SMTP 来实现。
如图所示:注:服务器A 是发送邮件服务器(SMTP ),服务器B 是接收邮件服务器(POP3/IMAP )1. 电子邮件的发送和接收电子邮件在Internet 上发送和接收的原理可以很形象地用我们日常生活中邮寄包裹来形容:当我们要寄一个包裹的时候,我们首先要找到任何一个有这项业务的邮局,在填写完收件人姓名、地址等等之后包裹就寄出而到了收件人所在地的邮局,那么对方取包裹的时候就必须去这个邮局才能取出。
同样的,当我们发送电子邮件的时候,这封邮件是由邮件发送服务器(任何一个都可以)发出,并根据收信人的地址判断对方的邮件接收服务器而将这封信发送到该服务器上,收信人要收取邮件也只能访问这个服务器才能够完成。
javamaven项目实现发送邮件

javamaven项⽬实现发送邮件1,先导⼊⼀个jar包在pom.xml 中写⼊<!-- 邮件start --><dependency><groupId>javax.mail</groupId><artifactId>mail</artifactId><version>1.4.7</version></dependency><!-- 邮件end -->2,写⼀个邮件的类包括,发送内容,端⼝等public class MailSenderInfo {// 发送邮件的服务器的IP和端⼝private String mailServerHost;private String mailServerPort = "25";// 邮件发送者的地址private String fromAddress;// 邮件接收者的地址private String toAddress;// 登陆邮件发送服务器的⽤户名和密码private String userName;private String password;// 是否需要⾝份验证private boolean validate = false;// 邮件主题private String subject;// 邮件的⽂本内容private String content;// 邮件附件的⽂件名private String[] attachFileNames;private String iwallHost ;/*** 获得邮件会话属性*/public Properties getProperties(){Properties p = new Properties();p.put("mail.smtp.host", this.mailServerHost);p.put("mail.smtp.port", this.mailServerPort);p.put("mail.smtp.auth", validate ? "true" : "false");return p;}public String getMailServerHost() {return mailServerHost;}public void setMailServerHost(String mailServerHost) {this.mailServerHost = mailServerHost;}public String getMailServerPort() {return mailServerPort;}public void setMailServerPort(String mailServerPort) {this.mailServerPort = mailServerPort;}public boolean isValidate() {return validate;}public void setValidate(boolean validate) {this.validate = validate;}public String[] getAttachFileNames() {return attachFileNames;}public void setAttachFileNames(String[] fileNames) {this.attachFileNames = fileNames;}public String getFromAddress() {return fromAddress;}public void setFromAddress(String fromAddress) {this.fromAddress = fromAddress;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getToAddress() {return toAddress;}public void setToAddress(String toAddress) {this.toAddress = toAddress;}public String getUserName() {return userName;}public void setUserName(String userName) {erName = userName;}public String getSubject() {return subject;}public void setSubject(String subject) {this.subject = subject;}public String getContent() {return content;}public void setContent(String textContent) {this.content = textContent;}public String getIwallHost() {return iwallHost;}public void setIwallHost(String iwallHost) {this.iwallHost = iwallHost;}}3,为了可配置性,可将上⾯的类的所需信息写⼊配置⽂件⾥<bean id = "mailInfo" class = "xxxxxxx.MailSenderInfo" ><property name="mailServerHost" value = ""></property> <property name="mailServerPort" value = "25"></property><property name="fromAddress" value = "xxxxxxx@xx.xxx"></property><property name="userName" value = "xxxxxxxx"></property><property name="password" value = "xxxxx"></property><property name="iwallHost" value = "http://localhost:8080/xxxxx"></property> </bean>4,写⼀个简单的发送邮件的类,包含发送text或者 html的⽅法public class SimpleMailSender {/*** 以⽂本格式发送邮件* @param mailInfo 待发送的邮件的信息*/public boolean sendTextMail(MailSenderInfo mailInfo) {// 判断是否需要⾝份认证MyMailAuthenticator authenticator = null;Properties pro = mailInfo.getProperties();if (mailInfo.isValidate()) {// 如果需要⾝份认证,则创建⼀个密码验证器authenticator = new MyMailAuthenticator(mailInfo.getUserName(), mailInfo.getPassword()); }// 根据邮件会话属性和密码验证器构造⼀个发送邮件的sessionSession sendMailSession = Session.getDefaultInstance(pro,authenticator);try {// 根据session创建⼀个邮件消息Message mailMessage = new MimeMessage(sendMailSession);// 创建邮件发送者地址Address from = new InternetAddress(mailInfo.getFromAddress());// 设置邮件消息的发送者mailMessage.setFrom(from);// 创建邮件的接收者地址,并设置到邮件消息中Address to = new InternetAddress(mailInfo.getToAddress());mailMessage.setRecipient(Message.RecipientType.TO,to);// 设置邮件消息的主题mailMessage.setSubject(mailInfo.getSubject());// 设置邮件消息发送的时间mailMessage.setSentDate(new Date());// 设置邮件消息的主要内容String mailContent = mailInfo.getContent();mailMessage.setText(mailContent);// 发送邮件Transport.send(mailMessage);return true;} catch (MessagingException ex) {ex.printStackTrace();}return false;}/*** 以HTML格式发送邮件* @param mailInfo 待发送的邮件信息*/public static boolean sendHtmlMail(MailSenderInfo mailInfo){// 判断是否需要⾝份认证MyMailAuthenticator authenticator = null;Properties pro = mailInfo.getProperties();//如果需要⾝份认证,则创建⼀个密码验证器if (mailInfo.isValidate()) {authenticator = new MyMailAuthenticator(mailInfo.getUserName(), mailInfo.getPassword()); }// 根据邮件会话属性和密码验证器构造⼀个发送邮件的sessionSession sendMailSession = Session.getDefaultInstance(pro,authenticator);try {// 根据session创建⼀个邮件消息Message mailMessage = new MimeMessage(sendMailSession);// 创建邮件发送者地址Address from = new InternetAddress(mailInfo.getFromAddress());// 设置邮件消息的发送者mailMessage.setFrom(from);// 创建邮件的接收者地址,并设置到邮件消息中Address to = new InternetAddress(mailInfo.getToAddress());// Message.RecipientType.TO属性表⽰接收者的类型为TOmailMessage.setRecipient(Message.RecipientType.TO,to);// 设置邮件消息的主题mailMessage.setSubject(mailInfo.getSubject());// 设置邮件消息发送的时间mailMessage.setSentDate(new Date());// MiniMultipart类是⼀个容器类,包含MimeBodyPart类型的对象Multipart mainPart = new MimeMultipart();// 创建⼀个包含HTML内容的MimeBodyPartBodyPart html = new MimeBodyPart();// 设置HTML内容html.setContent(mailInfo.getContent(), "text/html; charset=utf-8");mainPart.addBodyPart(html);// 将MiniMultipart对象设置为邮件内容mailMessage.setContent(mainPart);// 发送邮件Transport.send(mailMessage);return true;} catch (MessagingException ex) {ex.printStackTrace();}return false;}}5,在类中,实现发送邮件,建议另起线程发送邮件/*** 发送邮件内部类**/class SendEmailThread implements Runnable {private MailSenderInfo mailInfo;public SendEmailThread(MailSenderInfo mailInfo) {this.mailInfo = mailInfo;}@Overridepublic void run() {try {if (this.mailInfo != null) {SimpleMailSender.sendHtmlMail(mailInfo);}} catch (Exception e) {e.printStackTrace();}}}/*** 发送邮件⽅法** @param account* @param code*/public void sendEmail(String account, String code) {WebApplicationContext ac = ContextLoader.getCurrentWebApplicationContext();// 获取当前服务IPMailSenderInfo mailInfo = (MailSenderInfo) ac.getBean("mailInfo");mailInfo.setValidate(Boolean.TRUE);mailInfo.setToAddress(account);mailInfo.setSubject("验证码邮件");mailInfo.setContent("<p>您好!</p><p>感谢您注册成为xxxxxx⽤户!</p><p>您的验证码是:" + code + "。
如何实现局域网内的邮件服务器搭建

如何实现局域网内的邮件服务器搭建在现代社会中,电子邮件已经成为人们日常生活和工作中不可或缺的一部分。
为了在局域网内实现高效的邮件交流和管理,搭建一个局域网内的邮件服务器是非常重要的。
本文将介绍如何实现局域网内的邮件服务器搭建,帮助读者了解相关的基本概念和步骤。
一、选择合适的邮件服务器软件要搭建一个局域网内的邮件服务器,首先需要选择合适的邮件服务器软件。
市面上有许多不同的邮件服务器软件可供选择,如Microsoft Exchange Server、Postfix、Sendmail等。
根据实际需要和个人偏好,选择最适合自己的邮件服务器软件。
二、配置域名和DNS解析在搭建邮件服务器之前,需要为局域网内的邮件服务器配置域名和DNS解析。
域名是邮件服务器所在局域网的唯一标识,可以通过向域名注册商购买一个合适的域名。
DNS解析则是将域名解析为IP地址,使得邮件服务器可以被其他设备访问到。
三、安装和配置邮件服务器软件选择合适的邮件服务器软件后,需要按照软件提供的安装指南进行安装和配置。
不同的邮件服务器软件安装和配置的步骤会有所不同,因此读者需要仔细阅读邮件服务器软件的官方文档或者使用指南,按照指引完成安装和配置。
四、设置邮件服务器的基本参数在安装和配置完成后,需要设置邮件服务器的基本参数。
这些参数包括邮件服务器的名称、IP地址、端口号等。
需要根据实际情况进行设置,确保邮件服务器能够顺利地在局域网内运行。
五、配置用户账户和权限一个完善的邮件服务器需要具备用户账户和权限管理的功能。
在搭建局域网内的邮件服务器时,需要配置合适的用户账户和权限,控制用户对邮件服务器的访问和操作权限。
这有助于提高邮件服务器的安全性和管理效率。
六、设置邮件规则和过滤器邮件服务器还可以设置各种邮件规则和过滤器,以提供更加便捷和个性化的邮件服务。
通过设置邮件规则和过滤器,可以实现自动转发、自动回复、垃圾邮件过滤等功能。
可以根据实际需求,配置适合自己的邮件规则和过滤器。
JAVAMAILAPI文档

4、MIME协议
多用途的国际邮件扩充协议定义传输的内容。
二、Java Mail开发包
Java Mail API的核心类包括会话、消息、地址、身份验证、传输、存储和文件夹。
1、会话类(Session)
Session类定义了一个基本的邮件会话。Session对象利用
java.util.Properties对象获取邮件服务器、用户名和密码等信息,以及其他可在整个应用程序rties props = new Properties();
...//填充Properties对象
Session session = Session.getDefaultInstance(props,null); 创建独特会话
Properties props = new Properties();
机制。在Java Mail API环境中,基于JavaMail的应用程序将于与Internet服务提供商的SMTP服务器通信,SMTP服务器把消息转发给用做接收消息的SMTP服务
器。
2、POP协议
邮局协议是Internet上大多数人用来接收邮件的机制。
3、IMAP协议
Internet消息访问协议是用于接收消息的更加高级的协议。
...//填充Properties对象
Session session = Session.getInstance(props,null);
Null参数是一种Authenticator(认证)对象
2、消息类(MimeMessage)
一个MimeMessage对象是一种MIME类型和报头的消息。
如果消息是纯文本
message.setText(&uot;hello&uot;);
Java基于JavaMail实现向QQ邮箱发送邮件

Java基于JavaMail实现向QQ邮箱发送邮件最近项⽬在做新闻爬⾍,想实现这个功能:爬⾍某个页⾯失败后,把这个页⾯的 url 发到邮箱。
最终实现的效果图如下,后期可以加上过滤标签、失败状态码等,⽅便分类搜索异常。
开发⼈员可以根据邮件⾥的 url 和堆栈信息,分析爬⾍失败的原因。
是不是服务器 down 了?还是爬⾍的 Dom 解析没有解析到内容?还是正则表达式对于这个页⾯不适⽤?开启SMTP服务在 QQ 邮箱⾥的设置->账户⾥开启 SMTP 服务注意开启完之后,QQ 邮箱会⽣成⼀个授权码,在代码⾥连接邮箱使⽤这个授权码⽽不是原始的邮箱密码,这样可以避免使⽤明⽂密码。
⽹上查了⼀下例⼦,根据这篇⽂章 Java Mail(⼆):JavaMail介绍及发送⼀封简单邮件的⽰例代码。
Properties props = new Properties();// 开启debug调试props.setProperty("mail.debug", "true");// 发送服务器需要⾝份验证props.setProperty("mail.smtp.auth", "true");// 设置邮件服务器主机名props.setProperty("mail.host", "");// 发送邮件协议名称props.setProperty("mail.transport.protocol", "smtp");Session session = Session.getInstance(props);//邮件内容部分Message msg = new MimeMessage(session);msg.setSubject("seenews 错误");StringBuilder builder = new StringBuilder();builder.append("url = " + "/never_cxb/article/details/50524571");builder.append("页⾯爬⾍错误");builder.append("\n data " + TimeTool.getCurrentTime());msg.setText(builder.toString());//邮件发送者msg.setFrom(new InternetAddress("**发送⼈的邮箱地址**"));//发送邮件Transport transport = session.getTransport();transport.connect("", "**发送⼈的邮箱地址**", "**你的邮箱密码或者授权码**");transport.sendMessage(msg, new Address[] { new InternetAddress("**接收⼈的邮箱地址**") });transport.close();但是报错了DEBUG SMTP: AUTH LOGIN command trace suppressedDEBUG SMTP: AUTH LOGIN failedException in thread "main" javax.mail.AuthenticationFailedException: 530Error: A secure connection is requiered(such as ssl). More information at /cgi-bin/help?id=28因为⽰例代码是⽤的163邮箱,⽽笔者是 QQ 邮箱,看 Log 分析是 QQ 邮箱需要 SSL 加密。
oracle数据库发送邮件功能Oracle数据库如何来执行java代码实现发邮件功能

oracle数据库发送邮件功能Oracle数据库如何来执行java代码实现发邮件功能Oracle数据库可以通过使用Java代码来实现发送邮件功能。
以下是实现此功能的步骤:1. 配置SMTP服务器:首先,在Oracle数据库中配置SMTP服务器的信息。
可以使用以下命令进行配置:````EXECUTE DBMS_NETWORK_ACL_ADMIN.CREATE_ACL('smtp_acl.xml','ACL for SMTP', 'your_email_address', TRUE, 'connect');EXECUTE DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE('smtp_acl.xml', 'your_email_address', 'connect', TRUE);EXECUTE DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL('smtp_acl.xml','your_database_user');COMMIT;```这些命令将创建一个ACL(访问控制列表)并将其分配给数据库用户,以允许其连接到SMTP服务器。
2. 创建Java存储过程:接下来,创建一个Java存储过程,用于发送电子邮件。
可以使用以下代码作为示例:````javaCREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED "EmailSender" ASimport java.util.*;import javax.mail.*;import javax.mail.internet.*;public class EmailSenderpublic static void sendEmail(String recipient, String subject, String body)final String senderEmail = "your_sender_email_address";final String senderPassword = "your_sender_email_password";Properties props = new Properties(;props.put("mail.smtp.auth", "true");props.put("mail.smtp.starttls.enable", "true");props.put("mail.smtp.host", "your_smtp_host");props.put("mail.smtp.port", "your_smtp_port");Session session = Session.getInstance(props, newjavax.mail.Authenticatoprotected PasswordAuthentication getPasswordAuthenticatio return new PasswordAuthentication(senderEmail, senderPassword);}});tryMessage message = new MimeMessage(session);message.setFrom(new InternetAddress(senderEmail));message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(recipient));message.setSubject(subject);message.setText(body);Transport.send(message);System.out.println("Email sent successfully.");} catch (MessagingException e)}}}/```在上述代码中,需要将`your_sender_email_address`、`your_sender_email_password`、`your_smtp_host`和`your_smtp_port`替换为实际的SMTP服务器和发件人的信息。
javamail,tomcat配合ccproxy实现邮件自动发送

Javamail代码+tomcat配合ccproxy实现邮件自动发送1.利用javamail可以实现邮件发送功能,若局域网中web服务器不能访问外网(如不能访问 :25 ),需要一台能上外网的服务器做代理服务器,安装ccproxy软件,设置如下:端口映射目标地址端口为需要访问的外网服务地址,本地端口可以随意设置,不要提示有冲突即可。
账号建立:IP地址对应web服务器IP地址2.部署代码的服务器设置如下:(1)public class MyTimerTask extends TimerTask {public void run() {---等等网上提供很多邮件发送的代码props.setProperty("mail.smtp.port", "119");transport.connect("172.20.109.xx", "xxxxx", "xxxxxxx");以上两句是修改后的,指向ccproxy代理服务器IP和端口映射规则的端口。
(2)public class TestAutoRun extends HttpServlet{private static final long serialVersionUID = 1L;//当servlet类被加载时,执行本函数public void init(ServletConfig config) throws ServletException{super.init(config);System.out.println("** ServletConfig 初始化 ...") ;//此处放置需要自动执行的代码Timer timer = new Timer();SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Date date;try {String sql="select date_sub(curdate(),interval -1 day) a;";ResultSet rs = new JDBConnection().executeQuery(sql);rs.absolute(1);String dd=rs.getString("a");date = sdf.parse(dd+" 09:10:10");timer.schedule( new MyTimerTask(),date, 86400000 );rs.close();new JDBConnection().close(rs);} catch (Exception e) {e.printStackTrace();}}public void destroy(){}(3) web.xml配置<servlet><servlet-name>TestAutoRun</servlet-name><servlet-class>com.wy.TestAutoRun</servlet-class><load-on-startup>1</load-on-startup></servlet>-<servlet-mapping><servlet-name>TestAutoRun</servlet-name><url-pattern>/servlet/TestAutoRun</url-pattern></servlet-mapping>关于tomcat自动任务执行两次的情况,可以修改tomcat6011\conf\server.xml <Host name="localhost" appBase="" unpackWARs="true" autoDeploy="true"xmlValidation="false" xmlNamespaceAware="false">。
基于Javamail的邮件收发系统论文

基于JavaMail的邮件收发系统摘要电子邮件在当今社会中扮演了一个很重要的角色。
越来越多的人在使用它。
而且用它的人数势必会继续增加。
本文介绍了Javamail邮件收发系统的开发背景,对国内外现有的多种成熟的电子邮件系统进行分析和比较,总结出它们的优缺点,对Javamail技术进行深入研究,提出并设计实现了基于Javamail的邮件收发系统。
本系统利用SMTP协议和POP协议从底层进行开发,利用JavaMail API为收发邮件提供与协议无关的访问。
SMTP(简单邮件传输协议)是专门用来发送邮件的。
POP (邮局协议)是专门用于接收邮件的。
JavaMail API是一种可选的、能用于读取、编写和发送电子消息的标准扩展包。
本文主要可分为四个部分。
第一部分介绍了Javamail邮件系统的意义和现状。
第二部分具体介绍了几种相关协议和Javamail API。
第三部分主要介绍了系统的开发工具JA V A语言、Eclipse及其安装过程与配置方法。
第四部分详细阐述了Javamail邮件收发系统的实现过程。
关键词:SMTP,POP,JA V AMAIL,邮件收发MAIL SYSTEM BASED ON JAVAMAILABSTRACTE-Mail play a very important role in modern times. More and more people are using it, and the number of it will larger and larger. This paper introduced the javamail system's development background, analyzed and compared some existing maturity Email system at home and abroad , summarized their advantages and disadvantages, studied deeply with the javamail technology , proposed and designed out the mail system based on javamail. This system used POP protocol and SMTP protocol to develop from the bottom, used JavaMail API to provide the visit which has nothing to do with the agreement for send and receive email. SMTP (Simple Mail Transfer Protocol) is designed to send a message. POP (Post Office Protocol) is designed to receive mail. JavaMail API is an standard expansion package which is optional, can be used to read, write and send electronic messages.This paper can be divided into four parts. The first part introduced javamail email system's significance and status. The second part introduced several related agreements and JavaMail API. The third part mainly introduced system's development tools JA V A language , Eclipse and their installation process and configuration method. The fourth part detailed javamail email system's realization process.Keywords:SMTP, POP, JA V AMAIL, Email to send and receive目录第一章绪论 (1)1.1电子邮件介绍 (1)1.2研究意义 (1)1.3研究现状 (3)第二章相关邮件协议和JavaMail API (5)2.1相关邮件协议 (5)2.2JavaMail API (6)2.2.1 JavaMail API简介 (6)2.2.2 JavaMail API核心类 (6)2.3.3 JavaMail API的应用 (8)第三章应用系统开发工具 (10)3.1Java开发语言简介 (11)3.2开发工具Eclipse (12)3.3开发软件的安装 (12)3.3.1 JA V A环境的安装与配置 (12)3.3.2 Eclipse的安装 (14)3.3.3 javamail的安装 (15)第四章JavaMail系统的实现 (16)4.1环境配置与界面搭建 (16)4.2设置邮件服务器参数的实现 (16)4.3创建与发送邮件功能的实现 (17)4.3.1 装载邮件服务器属性, 并与其建立连接 (17)4.3.2 构建邮件 (18)4.3.3 创建Transport对象发送邮件 (19)4.4接收邮件功能的实现 (19)4.4.1 获取服务器信息 (20)4.4.2 建立通信连接 (20)4.4.3显示邮件 (20)4.5删除邮件功能的实现 (22)第五章结语 (23)参考文献 (24)致谢 (25)第一章绪论本文是一项基于JavaMail的邮件系统的综合性研究,使用Sun公司提供的JavaMail API实现电子邮件的发送、电子邮件的接收等等功能。
Java实现Email发送邮件(可发送html内容,样式可编辑)

Java实现Email发送邮件(可发送html内容,样式可编辑)⼀.电⼦邮件协议:SMTP 简单邮件传输SMTP是Simple Mail Transfer Protocol的简称,即简单邮件传输协议。
该协议定义了邮件客户端软件和SMTP服务器之间,以及两台SMTP服务器之间的通信规则。
在Java Mail API中,基于Java Mail的程序将与本公司或Internet服务提供商(ISP)的SMTP服务器通信,该SMTP服务器将会把消息转发给⽤于接收消息的SMTP服务器,最后⽤户可通过POP或IMAP协议获取该消息。
由于⽀持⾝份验证,所以不需要SMTP服务器是⼀种开放的转发器,但需要确保SMTP服务器配置正确。
Java Mail API中没有集成⽤于处理配置服务器以转发消息或添加/删除电⼦邮件账户等功能。
POP3邮局协议POP3是Post Office Protocol 3的简称,即邮局协议第3版,该协议是在RFC 1939中定义的。
它是Internet电⼦邮件的第⼀个离线协议标准,也就是说,POP3是⼀个简单⽽实⽤的邮件信息传输协议。
⽬前在Internet上,⼤多数⼈都采⽤POP3来接收邮件。
POP3为每个⽤户的每个邮箱提供⽀持,但是POP3并不⽀持查看邮件信息及统计新邮件的功能,因此,在使⽤Java Mail API时,如果想获取这些信息,需要⾃⼰进⾏计算。
IMAP 接收邮件协议IMA P的含义是Internet消息访问协议,当前版本是第4版,也称作IMAP4,该协议是在RFC 2060中定义的。
IMAP是接收消息的更加⾼级协议。
使⽤IMAP时,所⽤邮件服务器必须⽀持该协议,但是如果所有邮件服务器只⽀持该协议,并不能使⽤全部IMAP协议,为了能够⽀持全部IMAP协议,所⽤邮件服务器还应该⽀持POP协议。
在Java Mail程序通过IMAP协议可以在服务器上拥有包括多个⽂件夹的⽤户,并且这些⽂件夹可以被多个⽤户共享。
发送邮件及邮件附件java代码实例(支持多附件-群发送)

以下为Mail。
java的全部代码:package com.zlz3907。
mail;import java。
io。
BufferedReader;import java。
io。
File;import java。
io.FileInputStream;import java.io。
FileNotFoundException;import java.io。
IOException;import java.io.InputStream;import java.io。
InputStreamReader;import java.io。
PrintWriter;import java。
io.UnsupportedEncodingException;import .Socket;import java。
nio。
charset。
Charset;import java。
text.SimpleDateFormat;import java。
util。
ArrayList;import java.util.Date;import java。
util。
HashMap;import java.util.List;import java。
util。
Map;import sun。
misc。
BASE64Encoder;/*** 该类使用Socket连接到邮件服务器,* 并实现了向指定邮箱发送邮件及附件的功能。
**@author Zhong Lizhi*/public class Mail {/*** 换行符*/private static final String LINE_END = "\r\n”;/*** 值为“true”输出高度信息(包括服务器响应信息),值为“*false”则不输出调试信息.*/private boolean isDebug = true;/*** 值为“true”则在发送邮件{@link Mail#send()}* 过程中会读取服务器端返回的消息,* 并在邮件发送完毕后将这些消息返回给用户。
邮件系统的设计与实现

In the past few decades, people mainlyexchange ideaswith each other byletters.Buttoday people arecommunicating with each otherviae-mail, compared with theletter,e-mail correspondence with easy to use, fast delivery, low-cost, easy to store, the world's smooth and so on.
Struts2框架的处理流程如图2-1所示。
图2-1Struts2框架处理流程
通过上面对Struts2体系结构的了解,我们发现Struts2对Struts1进行了巨大的改进。主要表现在如下几个方面[4]:
(1)Interceptor做一些拦截或初始的工作
当外部的httpservletrequest到来时初始到了servlet容器,传递给一个标准的过滤器链Other filters。
基于JavaMail的电子邮件系统的设计与实现
邮件系统的设计与实现
摘 要
在过去的几十年里,人们主要通过书信与相隔较远的人相ቤተ መጻሕፍቲ ባይዱ交流情感与思想。而当今世界人们更多的是使用电子邮件,与传统的书信相比,电子邮件具有使用简易、投递迅速、收费低廉,易于保存、全球畅通无阻等优点。
本文设计并实现了一套邮件系统。首先研究了与系统相关的技术,其次分析了系统功能、性能和数据的需求,设计了系统构架、系统功能和数据库,并实现了系统的主要功能。本文的系统构架是基于浏览器/服务器的三层架构,使用Java和S2SH框架开发而成。在数据存储上使用了免费、开源、跨平台的MySQL数据库,邮件服务器使用了免费、开源的支持SMAP协议发送电子邮件和IMAP协议接收电子邮件的Apache James邮件服务器。通过系统设计的用户注册和登陆、用户信息管理、邮件管理等模块,对邮件系统进行实现。
java mail send方法

一、Java M本人l简介Java M本人l是用于在Java应用程序中发送、接收和管理电流新箱的API。
它提供了一种方便的方式来处理电流新箱,包括创建和发送电流新箱、接收邮件、检查邮件和删除邮件等功能。
二、Java M本人l发送邮件的方法发送邮件是Java M本人l API中最常用的功能之一。
下面是使用Java M本人l API发送邮件的步骤和方法:1. 导入相关的包在使用Java M本人l发送邮件之前,首先需要导入相关的包。
通常情况下,你需要导入javax.m本人l和javax.m本人l.internet这两个包。
2. 创建M本人l Session使用javax.m本人l.Session类创建一个用于连接到邮件服务器的会话对象。
会话对象包含了发送邮件所需的所有配置信息,比如邮件服务器的位置区域、端口号、账号和密码等。
你可以使用Session.getDefaultInstance()方法获取默认的会话对象,也可以使用Session.getInstance()方法根据自定义的配置获取会话对象。
3. 创建MimeMessage对象使用javax.m本人l.internet.MimeMessage类来创建一封邮件。
MimeMessage对象表示一封MIME格式的邮件,包括邮件的发件人、收件人、主题、正文和附件等信息。
4. 设置邮件内容在创建MimeMessage对象之后,可以使用其提供的方法来设置邮件的内容,比如设置发件人、收件人、主题、正文和附件等信息。
5. 发送邮件使用Transport类的send()方法来发送邮件。
在调用send()方法之前,需要先连接到邮件服务器,并使用账号和密码进行身份验证。
发送邮件成功后,需要关闭邮件连接。
三、示例代码下面是一个使用Java M本人l API发送邮件的示例代码:```javaimport javax.m本人l.*;import javax.m本人l.internet.*;import java.util.Properties;public class SendM本人l {public static void m本人n(String[] args) {// 设置邮件服务器Properties properties = new Properties();properties.setProperty("m本人l.smtp.host","smtp.example");properties.setProperty("m本人l.smtp.port", "25");// 创建会话对象Session session = Session.getDefaultInstance(properties);try {// 创建MimeMessage对象MimeMessage message = new MimeMessage(session);// 设置发件人message.setFrom(new InternetAddress("xxx"));// 设置收件人message.addRecipient(Message.RecipientType.TO, new InternetAddress("xxx"));// 设置主题message.setSubject("Test Em本人l");// 设置正文message.setText("This is a test em本人l.");// 发送邮件Transport.send(message);System.out.println("Em本人l sent successfully!");} catch (MessagingException e) {e.printStackTrace();}}}```四、注意事项在使用Java M本人l发送邮件时,需要注意以下几点:1. 邮件服务器的配置在发送邮件之前,需要确保邮件服务器的配置信息是正确的,包括服务器位置区域、端口号、账号和密码等。
基于java的邮件收发系统设计与实现

摘要基于Java的邮件收发系统设计与实现在当今信息交流社会中,电子邮件在人们日常工作中扮演了举足轻重的角色,因为,太多的人们使用其发送不同的多媒体附件数据,且这种趋势势必会继续增加。
虽然,目前已经有不少的邮件收发系统,但是,大多数的邮件收发系统不能满足用户需求。
因此,论文详细地阐述关于Java 语言实现的邮件收发应用系统。
本文使用Java的面向图形用户界面编程方式,并且利用了网络协议中SMTP和POP作为底层开发的基础,实现了从协议底层开发与设计邮件收发系统软件。
SMTP协议的作用是发送邮件。
POP3协议全称是邮局协议第三版,作用是接收邮件。
本文中研发出完整的邮件收发系统,这个邮件收发应用程序可以发送纯文本邮件,也可发送带附件的邮件。
当然,登陆系统时可以选择使用不同的SMTP服务器。
经过开发测试,证明邮件收发系统软件满足用户需求。
邮件收发应用程序开发涉及到整体的系统界面设计与实现、网络协议分析与设计、系统功能实现编码工作等多个方面的内容。
本文的邮件收发系统主要包括邮件收发系统的登陆管理界面、邮件发送界面、接收邮件界面邮件定时发送界面和邮件提醒界面等基本功能,文中将会涉及到邮件系统的架构设计方法。
在该系统设计过程中要充分分析系统的逻辑结构图,其中主要包括:系统功能结构流程设计、系统的数据库表结构以及字段设计,业务功能的函数参数处理情况等等。
在整个的论文设计过程中,本文详细规划了邮件系统的全部功能模块及其功能描述,系统导航条菜单项的设置等等。
在本文的邮件系统的编码过程中,开发人员将会实现主要业务功能,系统的前段控件的事件处理过程以及页面美工实现。
最后,根据论文的设计需求对邮件收发管理系统整体测试,并在此给出部分功能的界面截图效果。
关键词:Java,SMTP协议,POP3协议,电子邮件AbstractDesign and Implementation of Mail System Transmit-Receive Based On Java In today's information society,e-mail in the people's life and work has played an important role,because too many people use it to send multimedia data of different accessories,and this trend will continue to increase.Although,there are a lot of mail receiving and sending system,but most of the e-mail system can not meet the needs of users.Therefore,the paper describes in detail the implementation of the Java language mail application system.In this paper,we use the Java oriented graphical user interface programming,and use the SMTP and POP in the network protocol as the basis for the development of the bottom. SMTP protocol is to send mail.The full name of the POP3protocol is the third version of the post office protocol,the role is to receive mail.In this paper,the development of a complete mail transceiver system,the mail application can send text messages,e-mail can also be sent with attachments.Of course,the landing system can choose to use different SMTP server.After the development of testing,to prove that the mail system software to meet user needs.The development and application of the mail sending and receiving application involves the design and implementation of the whole system interface,the analysis and design of the network protocol,the realization of the system function and so on.The mail system of this paper includes mail system login management interface,mail interface, receiving mail interface regularly send mail and mail reminder interface basic function interface,this paper will involve mail system architecture design method.In the system design process to fully analyze the logical structure of the system,which mainly includes: the structure and field of database design system function structure design process,system, business function parameters etc..In the whole design process of the paper,this text has designed all the function modules and the function description of the mail system in detail. In this paper,the coding process of the mail system,the developer will be able to achieve the main business functions,the system controls the event handling process and the realization of the page.Finally,according to the design requirements of the paper, the overall test of the mail management system is given.Keywords:Java,SMTP protocol,POP3protocol,E-mail目录摘要 (I)ABSTRACT (III)目录 (I)第1章绪论 (3)1.1课题来源 (2)1.2国内外相关研究综述 (2)1.3研究此课题的意义 (3)1.4论文的结构与组织 (4)第2章电子邮件的传输原理研究 (5)2.1关于电子邮件 (6)2.1.1电子邮件的接受与发送 (6)2.1.2电子邮件地址的构成 (6)2.2电子邮件的工作原理 (6)2.3SMTP的工作原理 (9)2.3.1POP3协议介绍 (10)2.3.2POP3协议指令 (10)2.3.3POP3工作原理 (11)2.4电子信件格式的标准 (12)2.4.1RFC822介绍 (12)2.4.2信件的头部 (13)2.4.3标准的信头字段 (13)2.5本章小结 (16)第3章电子邮件系统设计 (16)3.1开发步骤 (17)3.1.1开发准备 (17)3.1.2环境搭建 (17)3.2系统实体分析 (18)3.2.1实体分析 (18)3.2.2实体类图分析 (18)3.3邮件收发系统的模块与功能设计 (19)3.3.1系统模块 (19)3.3.2模块功能 (20)3.4功能模块的流程图 (21)3.4.1系统功能的总体框架图 (21)3.4.2发送邮件流程图 (21)3.4.3阅读邮件流程图 (22)3.4.4邮件收发系统的详细功能图 (22)3.5数据库设计 (22)3.5.1数据库概念设计 (22)3.5.2部分数据表结构设计 (23)3.6本章小结 (24)第4章邮件收发系统的功能界面 (25)4.1邮件收发系统登录界面 (25)4.2系统的主界面 (26)4.3发送邮件界面 (26)4.4收件箱、回收站界面 (29)4.5联系人界面 (30)4.7新邮件提醒通知 (31)4.8邮件收发系统的部分代码 (31)4.8.1发送代码 (31)4.8.2接收代码 (32)4.8.3检查邮件 (34)4.8.4联系人列表表格模型 (34)4.8.5邮件操作代码 (35)4.9本章小结 (37)第五章总结与展望 (38)参考文献 (38)作者简介及在学期间所取得的科研成果 (41)致谢 (42)第1章绪论第1章绪论1.1课题来源电子邮件作为互联网上传输多媒体文件的重要工具,从电子邮件的诞生以来,都是基于通信网络协议为对方提供数据交换的全部过程。
Java发送邮件的基本配置与步骤

Java 发送邮件的基本配置与步骤Java发送邮件的基本配置与步骤jav a这⾥简单介绍⼀种利⽤Java 来发送邮件的⽅法。
Maven的POM.xml⽂件加载jar包编写邮件发送的⼯具类这⾥需要编写⼀个邮件发送的⼯具类,以后在其他的代码中只需要调⽤这个⼯具类,传⼊⼏个参数就可以直接发送邮件了。
⼯具类代码<dependency><groupId>com.sun.mail</groupId><artifactId>javax.mail</artifactId><version>1.5.6</version></dependency><dependency><groupId>com.sun.activation</groupId><artifactId>javax.activation</artifactId><version>1.2.0</version></dependency>import java.util.Properties;import javax.mail.Message;import javax.mail.Session;import javax.mail.Transport;import javax.mail.internet.InternetAddress;import javax.mail.internet.MimeMessage;public class EmailUtils {public static void SendEmailInfoUser (String sendAddress, String title, String content,String copysendAddress) throws Exception { Properties properties = new Properties();//设置服务器名称properties.setProperty("mail.host", "");//设置邮件传输协议properties.setProperty("mail.transport.protocol", "smtp");//设置是否要验证服务器⽤户名和密码properties.setProperty("mail.smtp.auth", "true");// 1.创建客户端与邮箱服务器的Session 对象Session session = Session.getInstance(properties);// 2.开启session 的debug 模式,⽅便查看发送email 的运⾏状态session.setDebug(true );// 3.通过session 得到transport 传输对象Transport transport = session.getTransport();// 4.使⽤⽤户名密码连接上邮箱服务器,此处的密码需要到邮箱开启服务设置transport.connect("", "abc@", "password");// 5.创建邮件Message message = createSimpleMail(session, sendAddress, title, content,copysendAddress);// 6.发送邮件transport.sendMessage(message, message.getAllRecipients());transport.close();}private static Message createSimpleMail (Session session, String sendAddress, String title, String content,String copysendAddress) throws Exception{// 创建邮件对象MimeMessage message = new MimeMessage(session);// 指明邮件的发件⼈message.setFrom(new InternetAddress("alltoforever@"));// 指明邮件的收件⼈message.setRecipient(Message.RecipientType.TO, new InternetAddress(sendAddress));// 邮件的标题message.setSubject(title);// 邮件的内容message.setContent(content, "text/html;charset=UTF-8")// 设置抄送⼈message.setRecipients(, InternetAddress.parse(copysendAddress));return message;}}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
11.1 电子邮件系统工作原理电子邮件是因特网上最为流行的应用之一,它主要包括如下组成部分:用户代理、邮件服务器、简单邮件传输协议(simple Mail Transfer Protocol,简称SMTP)、邮件消息格式、邮件访问协议。
图11.1展示了因特网电子邮件系统的概貌。
在下文对电子邮件系统各组成部分的说明中,以发信人A1ice给收信人Bob发送电子邮件消息作为例子。
图11.1 因特网电子邮件系统概貌1.用户代理用户代理提供用户阅读、保存、回复、转发、编写、发送和删除邮件消息等功能。
Alice写完电子邮件消息后,其用户代理把这个消息发送给Alice邮箱所在的邮件服务器,再由该邮件服务器把这个消息放入外出消息队列中并负责发送到Bob邮箱所在的邮件服务器。
当Bob想阅读电子邮件消息时,其用户代理将从其邮件服务器上的邮箱中取得邮件。
20世纪90年代后期,图形用户界面(GUI)的电子邮件用户代理变得流行起来,允许用户阅读和编写多媒体消息。
当前流行的用户代理包括Outlook、Foxmail等。
2.邮件服务器邮件服务器构成了电子邮件系统的核心。
每个收信人都有一个位于某个邮件服务器上的邮箱(mailbox)。
Bob的邮箱用于管理和维护已经发送给他的邮件消息。
一个邮件消息的典型流程是从发信人的用户代理开始,经发信人邮箱所在的邮件服务器,中转到收信人邮箱所在的邮件服务器,然后投递到收信人的邮箱中。
当Bob想查看自己的邮箱中的邮件消息时,其邮箱所在的邮件服务器将以他提供的用户名和口令认证他。
Alice邮箱所在邮件服务器还必须处理Bob邮箱所在邮件服务器出故障的情况。
如果Alice方的邮件服务器无法把邮件消息立即递送到Bob方的邮件服务器,则A1ice方的服务器就把它们存放在消息队列(message queue)中,以后再尝试递送。
这种尝试通常每30分钟左右执行一次:要是过了若干天仍未尝试成功,该服务器就把这个消息从消息队列中删除,同时以另一个邮件消息通知发信人(即Alice)。
3.简单邮件传输协议SMTPSMTP是因特网电子邮件系统重要的应用层协议。
它使用由TCP提供的可靠的数据传输服务把邮件消息从发信人邮箱所在邮件服务器传送到收信人邮箱所在邮件服务器。
SMTP是客户-服务器应用模式,由发信人的邮件服务器执行的客户端和收信人的邮件服务器执行的服务器端组成。
SMTP的客户端和服务器端同时运行在每个邮件服务器上。
当一个邮件服务器向其它邮件服务器发送邮件消息时,它是作为SMTP客户端。
当一个邮件服务器从其它邮件服务器接收邮件消息时,它是作为SMTP服务器端。
SMTP规范定义在RFC 821中,它的作用是把邮件消息从发信人的邮件服务器传送到收信人的邮件服务器。
SMTP限制所有邮件消息的信体必须是简单的7位ASCII字符格式。
这个限制使得二进制多媒体数据在由SMTP传送之前必须编码成7位ASCII文本;SMTP传送完毕之后,再把相应的7位ASCII文本邮件消息解码成二进制数据。
下面通过假设Alice给Bob发送一个简单的ASCII文本邮件消息的情形来说明SMTP的基本操作:(1) Alice调用自己的电子邮件用户代理,给出Bob的电子邮件地址(例如bob@),写好邮件内容,然后让用户代理发送本邮件消息。
(2) Alice的用户代理把该邮件消息发送到其邮件服务器中,由邮件服务器把该消息放入某个消息队列中。
(3) 运行在A1ice的邮件服务器上的SMTP客户端看到消息队列中的这个邮件消息后,打开一个到运行在Bob的邮件服务器主机上的SMTP服务器端的TCP连接。
(4) 经过最初的一些SMTP握手之后,SMTP客户把A1ice的邮件消息发送到TCP连接上。
(5) 在Bob的邮件服务器主机上,SMTP服务器收到这个邮件消息后,把这个消息投递到Bob 的邮箱中。
(6) Bob在方便的时候调用自己的电子邮件用户代理阅读该邮件消息。
图11.2展示了上述情形。
图11.2 A1ice的邮件服务器把邮件消息传送到Bob的邮件服务器SMTP通常不使用中间的邮件服务器主机中转邮件。
如果Bob的邮件服务器不工作了,那么A1ice发给Bob的邮件消息将存留在Alice的邮件服务器中等待新的尝试,而不会存放到某个中间的邮件服务器中。
SMTP协议与现实社会人们面对面交互的礼仪之间有许多相似之处。
首先,运行在发送端邮件服务器主机上的SMTP客户,发起建立一个到运行在接收端邮件服务器主机上的SMTP服务器端口号25之间的TCP连接。
如果接收邮件服务器当前不工作,SMTP客户就等待一段时间后再尝试建立该连接。
这个连接建立之后,SMTP客户和服务器先执行一些应用层握手操作。
就像人们在转手东西之前往往先自我介绍那样,SMTP客户和服务器也在传送信息之前先自我介绍一下。
在这个SMTP握手阶段,SMTP客户向服务器分别指出发信人和收信人的电子邮件地址。
彼此自我介绍完毕之后,客户发出邮件消息。
SMTP使用传输层提供的可靠数据传输服务(TCP服务)把该消息无差错地传送到服务器。
如果客户还有其它邮件消息需发送到同一个服务器,它就在同一个TCP连接上重复上述过程;否则,它就指示TCP关闭该连接。
假设客户所在主机名为,服务器所在主机名为。
前面标以“C:”的ASCII文本行是客户发送到它的TCP套接字中的完整文本行,前面标以“S:”的ASCII文本行是服务器发送到它的TCP套接字中的完整文本行。
一个客户和服务器交互的例子如下(以下传输脚本在TCP连接建立之后发生):S: 220 C: HELO S: 250 Hello , pleased to meet youC: MAIL FROM: <alice@>S: 250 Sender OKC: RCPT TO: bob@S: 250 Recipient OKC: DATAS: 354 Enter mail, end with "." on a line by its selfC: Do you like ketchup?C: How about pickles?C: .S: 250 Message accepted for deliveryC: QUITS: 221 closing connection在这个例子中,客户发送了一个从邮件服务器主机到的邮件消息,信体内容为:“Do you like ketchup? How about pickles?”。
客户总共发出了5个命令。
其中HELO命令标识发信人自己的身份;MAIL FROM命令表示请求发送邮件,初始化邮件传输;RCPT TO命令标识某电子邮件的计划接收人;DATA命令表示所有的邮件接收人已标识,并初始化数据传输,以.结束;QUIT命令表示退出邮件发送过程,结束会话。
服务器给每个命令发回应答,其中每个应答都由应答码和一些英语解释(可选)构成。
SMTP使用持久连接,如果发送邮件服务器有多个邮件消息需发送到同一个接收邮件服务器,那么所有这些消息可以在同一个TCP连接中发送。
对于其中的每一个消息,客户以一个新的“HELO ”命令开始整个消息发送过程,但是QUIT命令要等到所有消息都发送完之后才发出。
一旦SMTP 把Alice发给Bob的邮件消息从Alice的邮件服务器传送到Bob的邮件服务器,该邮件消息就存放在Bob的邮箱中。
4.邮件消息格式当Alice给Bob发一封普通的邮政信件时,她把这封信装入一个信封里,在信封上写明Bob 的地址和自己的回信地址,然后投入邮箱;邮政业务在递送这封信的过程中,也会把表明时间和地点的邮戳盖在信封上。
类似地,当电子邮件消息从一个人传送到另一个人时,在信体之前会有一个含有这些外围信息的信头。
这些信息由一系列在RFC 822中定义的邮件消息头部及其值构成。
邮件消息中构成信头的各个头部和信体之间以一个空行(即CRLF)分割。
RFC 822详细说明了各个邮件消息头部的格式和含义。
邮件消息的每个头部都是直观可读的文本,由一个后跟冒号的关键字和相应的值构成。
这些头部有些是必须的,有些则是可选的。
每个信头必须有一个From:头部和一个To:头部。
还可以有一个Subject:头部和其他头部。
这些头部和前面讨论的SMTP命令不是一回事:SMTP命令是SMTP握手协议的一部分,邮件消息头部则属于邮件消息的一部分。
下面是一个典型的电子邮件信头:From: alice@To: bob@Subject: this is a letter信头之后空一行就是信体。
SMTP RFC822要求每个邮件消息的信体以单个点号构成的一行做结束标记,换用ASCII字符形式,就是每个邮件消息的信体必须以“CRLF.CRLF”结尾,其中CR和LF分别代表回车符和换行符。
这种方式下,当从同一个SMTP客户接收一系列邮件消息时,SMTP服务器可以通过在字节流中搜索“CRLF.CRLF”来分割每个消息。
RFC 822中说明的邮件消息头部尽管足以满足发送普通ASCII文本邮件的要求,但是在多媒体消息(例如,包含图像、音频或视频数据的消息)的描述和非ASCII文本格式(例如,非英语国家使用的文字)的承载上,却显然不够,例如,若信体是JPEG图像的二进制数据,那么这些二进制数据字节流中可能出现“CRLF.CRLF”模式。
这将导致SMTP服务器误认为当前邮件消息已结束。
为避免这样的问题,二进制数据应以某种方式编码成ASCII文本,保证其中不存在特定的ASCII 字符(包括点号)。
要发送非ASCII文本的邮件消息,必须由发送者的用户代理在其中增添额外的头部。
RFC 2045和RFC 2046定义了这些额外的头部,它们是针对RFC 822的多用途因特网邮件扩展(Multipurpose Internet Mail Extensions, 简称MIME)。
支持多媒体的两个关键MIME头部是Content-Type:和Content-Tansfer-Encoding:。
Content-Type:头部允许接收用户代理对邮件消息采取合适的行动。
例如,通过指出信体内容为一个JPEG图像,接收用户代理可以把信件定向到某个JPEG解压缩例程。
为确保SMTP正常工作,非ASCII文本消息必须预先编码成ASCII文本格式。
Content-Tansfer-Encoding:头部用于告知接收用户代理信体已被编码成ASCII格式,并指出具体编码方式。
这样,当某个用户代理收到一个包含这两个头部的邮件消息时,它首先使用Content-Tansfer-Encoding:头部的值把信体转换成原始的非ASCII文本形式,再使用Content-Type:头部的值确定自己应该对信体采取什么行动。