Java Socket 发送邮件

前言:
在看java socket的时候,其中“使用socket发送邮件”发现很晦涩,网上发现了很多优秀的文章介绍这部分,发现自己是卡在了Telnet这一块,知道了Telnet发送邮件的过程,再来看socket发送邮件就简单多了。

TELNET概念:
Telnet协议是TCP/IP协议族中的一员,是Internet远程登陆服务的标准协议和主要方式。功能就是实现远程控制服务器。终端使用者可以在telnet程序中输入命令,这些命令会在服务器上运行,就像直接在服务器的控制台上输入一样。要开始一个telnet会话,必须输入用户名和密码来登录服务器。Telnet是常用的远程控制Web服务器的方法。(摘自百度百科)


Telnet发送邮件过程:

  1. 在CMD命令行键入 Telnet smtp.163.com 25 (使用的邮箱服务器+邮件服务器的默认端口25);
    1. 与服务器打招呼建立会话,键入命令 helo xxx (xxx表示任意字符);
    2. 发送邮件之前,肯定需要先登录,所以得有账号密码:
      1. 因为使用的是163服务器,所以账号需要时xxxxx@163.com,密码与之对应;
      2. Telnet命令行的账号密码是非明文的,所以将准备好的账号、密码编码成64位格式,编码工具可百度;
      3. 确定你的邮箱账号已经授权成功,如果有授权码,那么密码需要替换成授权码再编码加密;
      4. 准备工作完成,键入auth login(Telnet可能会失去对服务器的连接,重复上述步骤重连即可);
      5. 命令行显示334 dXNlcm5hbWU6后,粘贴你的加密后的账号(dXNlcm5hbWU6 是加密后的Username);
      6. 命令行显示334 UGFzc3dvcmQ6后,粘贴你的加密后的密码(UGFzc3dvcmQ6是加密后的Password);
      7. 窗口显示235 Authentication successful,则登录成功。
    3. 键入命令: mail from:xxxxx@163.com (邮件来自于谁?)
    4. 键入命令: rcpt to:xxxxx@xx.xx (邮件发给谁?)
    5. 键入命令: data (邮件内容是啥?)(End data with .:以回车 . 回车结束data),键入你要发送的邮件内容,格式如下:
      1. Subject:xxxxx (邮件的主题是啥?)
      2. From:xxxxx@163.com (邮件来自于谁? 此处要与步骤h保持一致)
      3. ===邮件内容部分===
      4. 回车 . 回车 :表示提交邮件内容
      5. 注:subject和from是为了避免服务器把你的邮件当成垃圾邮件过滤
    6. 窗口显示250 mail OK 表示邮件发送成功。可以继续发送,或键入quit退出。

注意事项:整个Telnet过程中的每一步都可能会被提示有错误,主要是命令格式和语法,如空格,是否有冒号等,也可能是误报,多试几次即可。


使用java socket发送邮件:

即使用socket套接字打开指定邮件服务器的连接,通过IO流模拟Telnet命令来发送邮件的过程,代码如下:

/**
 * Created by wangyuanye on 2017/4/10.
 */
public class sendEmail {
    //邮箱服务器地址
    private String mailServer="smtp.163.com";
    //要发送的邮箱地址
    private String recipient="1234566@qq.com";

    public static void main(String[] arges) {
        sendEmail t = new sendEmail();
        t.sendMail();
    }

    public void sendMail() {
        String name="xxxxxx@163.com";
        String pass="xxxx";
        try {
            Socket s = new Socket(mailServer, 25);
            //IO流
            BufferedReader in = new BufferedReader
                    (new InputStreamReader(s.getInputStream(),"UTF-8"));
            PrintWriter out = new PrintWriter
                    (new OutputStreamWriter(s.getOutputStream(),"gbk"),true);
            //connected mailServer or not
            read(in);
            //success or not
            send(in, out, "HELO theWorld");
            //validation
            send(in,out,"auth login");
            //handle data
            send(in,out,new BASE64Encoder().encode(name.getBytes()));
            send(in,out,new BASE64Encoder().encode(pass.getBytes()));
            //where from
            send(in, out, "MAIL FROM: <xxxxxx@163.com>");
            //send to
            send(in, out, "RCPT TO: <" + recipient+">");
            //mail content
            send(in, out, "DATA");
            send(out, "Subject: test !");
            send(out, "From:<15821145937@163.com>");
            send (out, "\n");
            send(out, "this is a program for sending e-mail,coding with java socket!");
            send(out, "\n.\n");
            //exit
            send(in, out, "QUIT");
            s.close();
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }
    //read info
    public void read(BufferedReader in){
        try {
            String msg=in.readLine();
            System.out.println(msg);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
    //read info and input order
    public void send(BufferedReader in, PrintWriter out, String s) {
        try {
            out.write(s + "\n");
            out.flush();
            System.out.println("read : "+s);
            s = in.readLine();
            System.out.println("write : "+s);
        }catch (Exception e) {
            e.printStackTrace();
        }
    }
    //input order
    public void send(PrintWriter out, String s) {
        try {
            out.write(s + "\n");
            out.flush();
            System.out.println("write: "+s);
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }
}

问题:
1.关于邮件内容的中文乱码问题;
描述:网上搜了相关的资料,大致是说在接收包的时候未能完整接收包数据,这个没太明白;
也有说是编码格式的问题,但试了几种编码(utf-8,8859_1,gbk,gb18030)
都没反应,希望知道问题所在的网友留言相告,先行谢过。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值