• 欢迎访问开心洋葱网站,在线教程,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站,欢迎加入开心洋葱 QQ群
  • 为方便开心洋葱网用户,开心洋葱官网已经开启复制功能!
  • 欢迎访问开心洋葱网站,手机也能访问哦~欢迎加入开心洋葱多维思维学习平台 QQ群
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏开心洋葱吧~~~~~~~~~~~~~!
  • 由于近期流量激增,小站的ECS没能经的起亲们的访问,本站依然没有盈利,如果各位看如果觉着文字不错,还请看官给小站打个赏~~~~~~~~~~~~~!

SMTP命令发送邮件及发送错误中文对应

其他 开心洋葱 2463次浏览 0个评论

应答码 说明
501 参数格式错误
502 命令不可实现
503 错误的命令序列
504 命令参数不可实现
211 系统状态或系统帮助响应
214 帮助信息
220 <domain>服务就绪
221 <domain>服务关闭
421 <domain>服务未就绪,关闭传输信道
250 要求的邮件操作完成
251 用户非本地,将转发向<forward-path>
450 要求的邮件操作未完成,邮箱不可用
550 要求的邮件操作未完成,邮箱不可用
451 放弃要求的操作;处理过程中出错
551 用户非本地,请尝试<forward-path>
452 系统存储不足,要求的操作未执行
552 过量的存储分配,要求的操作未执行
553 邮箱名不可用,要求的操作未执行
354 开始邮件输入,以"."结束
554 操作失败

例如:用Telnet(输入过程中注意不要输错,退格也无法删除已经输入的)

telnet stmp.sian.com.cn————————————— 使用 telnet 命令连接服务器 25 端口

220 stmp.sina.com.cn ESMTP SINAMAIL <Postfix Rules!>//相应信息
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
Y29zdGFAYW1heGl0Lm5ldA== ———————————– BASE64 加密后的用户名
334 UGFzc3dvcmQ6
MTk4MjIxNA== ———————————————– BASE64 加密后的密码
235 auth successfully ————————————– 身份认证成功
(535 auth failure —————————————— 身份认证失败)
发到本系统中域名下的账户可跳过身份认证。
mail from: ado2@sina.com.cn —————————— 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 .————————- 断开连接

 

1.SMTP (Simple Mail Transfer Protocol) :
    A.电子邮件从客户机传输到服务器(发送信件)或从某一个服务器传输到另一个服务器使用的传输协议。 SMTP 是请求/响应协议,命令和响应都是基于 ASCII 文本,并以 CR 和 LF 符结束。响应包括一个表示返回状态的三位数字代码(而pop是相应+OK和-ERR)。SMTP 在 TCP 协议 25 端口监听连接请求。  
    ESMTP (Extended SMTP),顾名思义,扩展 SMTP 就是对标准 SMTP 协议进行的扩展。它与 SMTP 服务的区别仅仅是,使用 SMTP 发信不需要验证用户帐户,而用 ESMTP 发信时, 服务器会要求用户提供用户名和密码以便验证身份。验证之后的邮件发送过程与 SMTP 方式没有两样。


   B.连接和发送过程:
a.建立TCP连接(例如telnet或者Socket)
b.客户端发送HELO(或者EHLO需要身份验证)命令以标识发件人自己的身份,然后客户端发送MAIL FROM命令服务器端正希望以OK作为响应,表明准备接收
c.客户端发送RCPT TO命令,以标识该电子邮件的计划接收人,可以有多个RCPT行服务器端则表示是否愿意为收件人接受邮件
d.协商结束,发送邮件,用命令DATA发送
e. 以.(单独一行)表示结束输入内容一起发送出去
f.结束此次发送,用QUIT命令退出。
   C.邮件路由过程:
SMTP服务器基于‘域名服务DNS中计划收件人的域名来路由电子邮件。SMTP服务器基于DNS中的MX记录来路由电子邮件,MX记录注册了域名和相关的SMTP中继主粲诟糜虻牡缱佑始加ο蚋弥骰⑺汀?/P>#p#分页标题#e#

若SMTP服务器mail.abc.com收到一封信要发到shuser@sh.abc.com:
a.Sendmail请求DNS给出主机sh.abc.com的CNAME记录,如有,假若CNAME到shmail.abc.com,则再次请求shmail.abc.com的CNAME记录,直到没有为止.
b.假定被CNAME到shmail.abc.com,然后sendmail请求@abc.com域的DNS给出shmail.abc.com的MX记录,
shmail MX 5 shmail.abc.com
10 shmail2.abc.com
c. Sendmail最后请求DNS给出shmail.abc.com的A记录,即IP地址,若返回值为1.2.3.4
d. Sendmail与1.2.3.4连接,传送这封给shuser@sh.abc.com的信到1.2.3.4这台服务器的SMTP后台程序

    D.基本命令集
命令 描述
——————————
HELO 向服务器标识用户身份
发送者能欺骗,说谎,但一般情况下服务器都能检测到。

EHLO 域名:需要身份验证

auth login 需要身份验证

MAIL 初始化邮件传输
mail from:
RCPT 标识单个的邮件接收人;常在MAIL命令后面
可有多个rcpt to:
DATA 在单个或多个RCPT命令后,表示所有的邮件接收人已标识,并初始化数据传输,以.结束。
VRFY 用于验证指定的用户/邮箱是否存在;由于安全方面的原因,服务器常禁止此命令
EXPN 验证给定的邮箱列表是否存在,扩充邮箱列表,也常被禁用
HELP 查询服务器支持什么命令
NOOP 无操作,服务器应响应OK
QUIT 结束会话
RSET 重置会话,当前传输被取消
——————————–
注释:
a.MAIL FROM命令中指定的地址是称作 envelope from地址,不需要和发送者自己的地址是一致的。
RCPT TO 与之等同,指明的接收者地址称为envelope to地址,而与实际的to:行是什么无关。
b.为什么没有RCPT CC和RCPT BCC:?
所有的接收者协商都通过RCPT TO命令来实现,如果是BCC,则协商发送后在对方接收时被删掉信封接收者
c.邮件被分为信封部分,信头部分和信体部分
envelope from, envelope to 与message from:, message to:完全不相干。 evnelope是由服务器主机间SMTP后台提供的,而message from/to是由用户提供的。有无冒号也是区别。

d. 怎样由信封部分检查是否一封信是否是伪造的?
received行的关联性。
现在的SMTP邮件传输系统,在信封部分除了两端的内部主机处理的之个,考虑两个公司防火墙之间的部分,若两台防火墙机器分别为A和B,但接收者检查信封received:行时发现经过了C.则是伪造的。
received:行中的主机和IP地址对是否对应如:
Receibed: from galangal.org (turmeric.com [104.128.23.115] by mail .bieberdorf.edu….
被人手动添加在最后面的received行:
Received: from galangal.org ([104.128.23.115]) by mail .bieberdorf.edu (8.8.5)
Received: from lemongrass.org by galangal.org (8.7.3)
Received: from graprao.com by lemongrass.org (8.6.4)

 

 

 

 

也可以用Socket建立连接然后再发送命令:

import java.io.*;
import java.net.*;
public class SMTPTest {

public static void main(String[] args) throws Exception{
   Socket smtpSocket=new Socket("smtp.sina.com.cn",25);
   DataOutputStream dos=new DataOutputStream(smtpSocket.getOutputStream());
   DataInputStream dis=new DataInputStream(smtpSocket.getInputStream());
   dos.writeBytes("ehlo smtp.sina.com.cn \n");
   //dos.writeBytes("helo\n");
 
   dos.writeBytes("auth login\n");
   dos.writeBytes("YWRvMg==\n");
   dos.writeBytes("YWRv\n");
  
   dos.writeBytes("mail from:<ado2@sina.com.cn> \n");
   dos.writeBytes("rcpt to:<adodcl@yahoo.com.cn> \n");
   dos.writeBytes("data \n");
   dos.writeBytes("from:ado2@yahoo.com.cn\n");
   dos.writeBytes("to:adodcl@yahoo.com.cn\n");
   dos.writeBytes("subject:hello world\n");
   dos.writeBytes("hello\n");
 
 
   dos.writeBytes("\n.\n");
 
 
   dos.writeBytes("quit");
   System.out.println(dis.readLine());
   //dos.flush();

}

}
java的JDK中也提供了相关的类:

Session:建立会话 MimiMessage(MimeBodyPart MimeMultipart):要发送的消息 Transport:用来传送消息。#p#分页标题#e#

import javax.mail.*;
import javax.mail.internet.*;
import java.util.*;
import javax.activation.*;


public class sendMail
{
    public static void main(String args[]) throws Exception
    {
    String host="smtp.sina.com.cn";
    String from="ado2@sina.com.cn";
    String to="adodcl@yahoo.com.cn";
    String user="ado2";
    String password="adoado";
  
    //建立会话
    Properties props=new Properties();
    props.put("mail.smtp.host",host);
    props.put("mail.smtp.auth","true");
  
    Session session=Session.getDefaultInstance(props);
        session.setDebug(true);
      
        //设置消息
        MimeMessage message=new MimeMessage(session);
        message.setFrom(new InternetAddress(from));
        message.addRecipient(Message.RecipientType.TO , new InternetAddress(to));
        //message.setRecipient(Message.RecipientType.TO,new InternetAddress(to));
        message.setSubject("JavaMail Test");
        //message.setText("Sorrry ,this is a javamail test");
        //message.setSentDate(new Date());
      
        //带附件的邮件发送
        MimeBodyPart bp1=new MimeBodyPart();
        bp1.setText("Sorry ,this is a javaMail test");
      
        //发送HTML附件
        MimeBodyPart bp3=new MimeBodyPart();
        String mailbody = "<meta http-equiv=Content-Type content=text/html; charset=gb2312>"+
        "<div align=center><a href=http://www.csdn.net> www.csdn.net </a></div>";
        bp3.setContent(mailbody,"text/html;charset=GB2312");
      


      
        FileDataSource fds=new FileDataSource("D:\\parseheader.log");
        MimeBodyPart bp2=new MimeBodyPart();
        bp2.setDataHandler(new DataHandler(fds));
        bp2.setFileName(fds.getName());
      
        MimeMultipart mp=new MimeMultipart();
        mp.addBodyPart(bp1);
        mp.addBodyPart(bp3);
        mp.addBodyPart(bp2);
        message.setContent(mp);
      
      
        
        message.saveChanges();
        Transport transport=session.getTransport("smtp");
        transport.connect(host,25,user,password);
        transport.sendMessage(message,message.getAllRecipients());
        //Transport.send(message);
        transport.close();
    }
}

 


开心洋葱 , 版权所有丨如未注明 , 均为原创丨未经授权请勿修改 , 转载请注明SMTP命令发送邮件及发送错误中文对应
喜欢 (0)

您必须 登录 才能发表评论!

加载中……