我尝试在我的应用中实施SMTP协议,但是使用codenameone InputStream/OutputStream
在SocketConnection
上进行多次写入/读取时遇到问题。
这就是我到目前为止所做的:
Socket.connect("<google ip>",25,new SocketConnection(){
@Override
public void connectionError [...]
@Override
public void connectionEstablished(InputStream is, OutputStream os){
try{
BufferedInputStream in = new BufferedInputStream(is);
BufferedOutputStream out = new BufferedOutputStream(os);
byte[] response = new byte[1024];
String z;
int size;
out.write( ("HELO mydomain.me").getBytes() );
out.flush();
size = in.read(response);
//in.mark(size);
//in.reset();
z = new String(response, 0 ,size);
System.out.println(z);
response = new byte[1024];
out.write( ("MAIL FROM: <myaddress@bubu.me>").getBytes() );
out.flush();
System.out.println("I get here!");
size = in.read(response);
System.out.println("I NEVER get here!");
z = new String(response, 0 ,size);
System.out.println(z);
[... rest of SMTP that I never reach ...]
}catch(IOException ex){
System.out.println("I don't even get connection errors");
}
}
}
这是我得到的输出:
220 mx.google.com ESMTP [...] -gsmtp
i get here!
程序卡在这里。
这意味着&#34; HELO ...&#34;并且它的响应工作正常,但是当它试图从BufferedInputStream
第二次读取时会遇到困难。
我尝试从BufferedInputStream
切换到InputStream
,in.mark(size);
,in.reset()
的所有组合,只读取固定数量的字节(in.read(response, 0 , 200)
) ,但我没有设法让它工作。
我该怎么做才能解决这个问题?
答案 0 :(得分:0)
我首先要从两个流中删除缓冲,至少目前是这样,因为(a)会缩小嫌疑人列表,(b)这是一个可能不需要的优化,并使示例代码复杂化,(c) )SocketConnection本身可能会在幕后缓冲流。
您可以检查的另一件事:我看到的SMTP示例在<table id="rankTable">
<thead>
<tr>
<th>First Name</th>
<th>Last Name</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
之后没有空格。
顺便说一句,您可以使用several open source Java libraries for SMTP而不是自己构建。
答案 1 :(得分:0)
您不需要缓冲的流,因为Codename One中的流已默认缓冲。
我真的不记得SMTP协议,但检查你的服务器是否支持这个并尝试ehelo,添加crlf等。坚持读取只是意味着服务器仍在等待你的输入。