android java socket实现邮件发送(smtp)

来源:互联网 发布:用c语言编写韩信点兵 编辑:程序博客网 时间:2024/05/17 01:35

最近做一个android项目要用到用户反馈的功能,就想出了这个笨方法,
通过邮件的方式来反馈,当然其过程对于用户来说是不可见的!
代码如下

package com.shyboy.mail;import java.io.BufferedReader;import java.io.InputStreamReader;import java.io.OutputStream;import java.net.InetSocketAddress;import java.net.Socket;public class Mail {    static OutputStream ou=null;    static BufferedReader bff=null;    static private final String NAME_BASE64="c2h5Ym95emhhbmdwZW5n\r\n";//用户名 base64 编码 ,注意是@前面的部分的base64编码    static private final String PASS_BASE64="********************\r\n";//密码base64编码    static private final String FROME="MAIL FROM: <shyboyzhangpeng@sina.com>\r\n";//用户名,注意格式    static private final String TO="RCPT TO: <123456789@qq.com>\r\n";//收件人,注意格式    static void sendMail(String subject,String content/*,String info*/)    {        try         {            Socket socket = new Socket();            String line = null;            socket.connect(new InetSocketAddress("smtp.sina.com", 25), 3000);//连接服务器,这里用的是新浪邮箱            bff = new BufferedReader(new InputStreamReader(socket.getInputStream()));            ou = socket.getOutputStream();            line=bff.readLine();            System.out.println("CONNECT:"+line);            ou.write("HELO smtp.sina.com\r\n".getBytes("UTF-8"));//发送问候消息            line=bff.readLine();            System.out.println("HELO:"+line);            ou.write("AUTH LOGIN\r\n".getBytes("UTF-8"));//发送登陆命令            line=bff.readLine();            System.out.println("AUTH LOGIN:"+line);            ou.write(NAME_BASE64.getBytes("UTF-8"));//发送用户名的base64编码            line=bff.readLine();            System.out.println("NAME:"+line);            ou.write(PASS_BASE64.getBytes("UTF-8"));//发送密码的base64编码            line=bff.readLine();            System.out.println("PASS:"+line);            ou.write(FROME.getBytes("UTF-8"));//发送用户名,应定要和前面发送的编码一致            line=bff.readLine();            System.out.println("FROM:"+line);            ou.write(TO.getBytes("UTF-8"));//发送收件人地址            line=bff.readLine();            System.out.println("TO:"+line);            ou.write("DATA\r\n".getBytes("UTF-8"));//发送数据命令            line=bff.readLine();            System.out.println("DATA:"+line);            ou.write(("From:shyboyzhangpeng@sina.com\r\n"//发件人,要和前面的一致                    + "To:123456789@qq.com\r\n" //收件人,要和前面的一致                    + "Subject:"+subject+"\r\n\r\n").getBytes("UTF-8"));//邮件主题            ou.write(("\r\t"+content).getBytes("UTF-8"));//邮件正文内容            ou.write("\r\n.\r\n".getBytes("UTF-8"));//结束标志            line=bff.readLine();            System.out.println("END:"+line);            ou.write("QUIT\r\n".getBytes("UTF-8"));//退出登录            line=bff.readLine();            System.out.println("QUIT:"+line);            ou.close(); // 关闭Socket输出流              bff.close(); // 关闭Socket输入流              socket.close(); // 关闭Socket          } catch (Exception e){            System.out.println("Error. " + e);        }    }    //测试发送程序    public static void main(String[] args)    {        sendMail("这里写主题","这里写内容");    }}

运行结果如下:

CONNECT:220 smtp-2-33.smtpsmail.fmail.yf.sinanode.com ESMTPHELO:250 smtp-2-33.smtpsmail.fmail.yf.sinanode.comAUTH LOGIN:334 VXNlcm5hbWU6NAME:334 UGFzc3dvcmQ6PASS:235 OK AuthenticatedFROM:250 okTO:250 okDATA:354 End data with <CR><LF>.<CR><LF>END:250 ok queue id 2792013015358QUIT:221 smtp-2-33.smtpsmail.fmail.yf.sinanode.com

目前新浪邮箱测试成功,其他邮箱同学们自行测试,注意所用的邮箱一定要开启smtp服务!

仅供个人学习研究参考,严禁用于非法用途!

附录:SMTP相应代码
SMTP常用的响应

501——参数格式错误

502——命令不可实现

503——错误的命令序列

504——命令参数不可实现

211——系统状态或系统帮助响应

214——帮助信息

220——服务器就绪

221——服务关闭

421——服务器未就绪,关闭传输信道

250——要求的邮件操作完成

251——用户非本地,将转发向

450——要求的邮件操作未完成,邮箱不可用

550——要求的邮件操作未完成,邮箱不可用

451——放弃要求的操作,处理过程中出错

551——用户非本地,请尝试

452——系统存储不足,要求的操作未执行

552——过量的存储分配,要求的操作未执行

553——邮箱名不可用,要求的操作未执行

354——开始邮件输入,以“.”结束

554——操作失败

0 0