使用ESMTP(SMTP)进行邮件发送
2024-07-21 02:14:05
供稿:网友
 
使用esmtp/smtp进行邮件发送,遇到一个问题:
假如附件为图片gif文件,发送没有问题。但是接收后,无法显示图片。敬请高手指点!!!!!
/*
 * created on 2004-12-21
 *
 * todo to change the template for this generated file go to
 * window - preferences - java - code style - code templates
 */
/**
 * @author administrator
 *
 * todo to change the template for this generated type comment go to
 * window - preferences - java - code style - code templates
 */
public class foxmailmain {
 public static void main(string[] args) {
 
 foxmail foxmail = new foxmail("smtp.citiz.net",25);
 foxmail.setmailusername("zhou");
 foxmail.setmailuserpass("abcdefgf");
 foxmail.setmailto("[email protected]");
 foxmail.setmailfrom("[email protected]");
 foxmail.setmailshowto("tom");
 foxmail.setmailshowfrom("nike");
 foxmail.setmailsubject("hello用中文主题");
 foxmail.setmailbody("welcome for you. mmm.中文呀.aaa /r/n载来一行");
 foxmail.setmailattachfile(new string[] {"d://eclipse_project//workspace//project_email//src//pic.gif"});
 
 if(foxmail.sendmail()){
 system.out.println("ok.");
 }else{
 system.out.println("false.");
 }
 }
}
foxmail.java 代码
import java.io.file;
import java.io.fileinputstream;
import java.io.filenotfoundexception;
import java.io.ioexception;
import java.io.inputstream;
import java.io.outputstream;
import java.net.socket;
import java.text.dateformat;
import java.text.simpledateformat;
import java.util.date;
/*
 * created on 2004-12-21
 *
 * todo to change the template for this generated file go to
 * window - preferences - java - code style - code templates
 */
/**
 * @author administrator
 *
 * todo to change the template for this generated type comment go to
 * window - preferences - java - code style - code templates
 */
public class foxmail {
 
 private final static byte location_to_screen = 1;//log信息输出位置 1=输出到屏幕
 private final static dateformat dateformat = new simpledateformat("yyyy-mm-dd hh:mm:ss");//日志用日期格式
 private final static string end_flag = "/r/n";//smtp/esmtp命令结束标记
 private final static string email_attach_sign = "=====att";//邮件附件的表示符号
 private string smtpserver = null;//邮件发送服务器域名
 private int smtpport = 25;//邮件发送端口
 private socket clientmailsocket;//邮件连接socket
 private inputstream indata;//接收数据 
 private outputstream outdata;//发送数据
 private string mailusername = null;//邮件账户
 private string mailuserpass = null;//邮件账户的密码
 private string mailto = null;//邮件发送目标
 private string mailfrom = null;//邮件发送人
 private string mailsubject = null;//邮件主题
 private string mailbody = null;//邮件正文 
 private string mailshowto = null;//邮件内容抬头部分-邮件发送目标
 private string mailshowfrom = null;//邮件内容抬头部分-邮件发送人
 private string[] mailattachfile = null;//邮件附件对应的本地文件名(包含绝对路径)
 
 /**
 * @return returns the mailattachfile.
 */
 public string[] getmailattachfile() {
 return mailattachfile;
 }
 /**
 * @param mailattachfile the mailattachfile to set.
 */
 public void setmailattachfile(string[] mailattachfile) {
 this.mailattachfile = mailattachfile;
 }
 /**
 * @return returns the mailshowfrom.
 */
 public string getmailshowfrom() {
 return mailshowfrom;
 }
 /**
 * @param mailshowfrom the mailshowfrom to set.
 */
 public void setmailshowfrom(string mailshowfrom) {
 this.mailshowfrom = mailshowfrom;
 }
 /**
 * @return returns the mailshowto.
 */
 public string getmailshowto() {
 return mailshowto;
 }
 /**
 * @param mailshowto the mailshowto to set.
 */
 public void setmailshowto(string mailshowto) {
 this.mailshowto = mailshowto;
 }
 
 /**
 * @return returns the mailbody.
 */
 public string getmailbody() {
 return mailbody;
 }
 /**
 * @param mailbody the mailbody to set.
 */
 public void setmailbody(string mailbody) {
 this.mailbody = mailbody;
 }
 /**
 * @return returns the mailfrom.
 */
 public string getmailfrom() {
 return mailfrom;
 }
 /**
 * @param mailfrom the mailfrom to set.
 */
 public void setmailfrom(string mailfrom) {
 this.mailfrom = mailfrom;
 }
 /**
 * @return returns the mailsubject.
 */
 public string getmailsubject() {
 return mailsubject;
 }
 /**
 * @param mailsubject the mailsubject to set.
 */
 public void setmailsubject(string mailsubject) {
 this.mailsubject = mailsubject;
 }
 /**
 * @return returns the mailto.
 */
 public string getmailto() {
 return mailto;
 }
 /**
 * @param mailto the mailto to set.
 */
 public void setmailto(string mailto) {
 this.mailto = mailto;
 }
 /**
 * @return returns the mailusername.
 */
 public string getmailusername() {
 return mailusername;
 }
 /**
 * @param mailusername the mailusername to set.
 */
 public void setmailusername(string mailusername) {
 this.mailusername = mailusername;
 }
 /**
 * @return returns the mailuserpass.
 */
 public string getmailuserpass() {
 return mailuserpass;
 }
 /**
 * @param mailuserpass the mailuserpass to set.
 */
 public void setmailuserpass(string mailuserpass) {
 this.mailuserpass = mailuserpass;
 }
 /**
 * constrctor
 * @param _smtpserver
 * @param _smtpport
 */
 public foxmail(string smtpserver,int smtpport){
 this.smtpserver = smtpserver;
 this.smtpport = smtpport;
 }
 
 
 /**
 * 写日志信息
 * @param _log
 * @param _locaton
 */
 public static void printlogger(string _log,int _locaton){
 switch(_locaton){
 case location_to_screen:
 system.out.println("["+dateformat.format(new date()) + "] " + _log);
 break;
 default:
 system.out.println("["+dateformat.format(new date()) + "] " + _log);
 }//switch(_locaton)
 }//end
 
 /**
 * 
 * @return
 */
 public boolean createconnection(){
 try {
 freeall();
 clientmailsocket = new socket(smtpserver, smtpport);
 printlogger("connect to email server " + smtpserver + " on port " + smtpport,location_to_screen);
 indata = clientmailsocket.getinputstream();
 outdata = clientmailsocket.getoutputstream();
 fetchcmdresult();//当首次连接服务器后有返回值,必须取走该返回值,否则后面命令的返回值无法判断
 } catch (ioexception e) {
 return false;
 }
 return true;
 }
 
 public static string response(inputstream in){
 byte[] buffer = new byte[1024];
 stringbuffer indata = new stringbuffer();
 int n = 0;
 try {
 n = in.read(buffer);
 indata.append(new string(buffer, 0, n));
 
 } catch (ioexception e) {
 // todo auto-generated catch block
 e.printstacktrace();
 }
 printlogger("cmdresult=" + indata.tostring(),location_to_screen);
 return indata.tostring();
 }
 
 public static void send(string s, outputstream out){
 byte[] buffer = s.getbytes();
 try {
 out.write(buffer);
 out.flush();
 } catch (ioexception e) {
 // todo auto-generated catch block
 e.printstacktrace();
 }
 }
 public string fetchcmdresult(){
 return response(indata);
 }
 
 public boolean sendcmd(string _cmd) {
 if (_cmd != null) {
 send(_cmd,outdata);
 printlogger("cmd=" + _cmd,location_to_screen);
 }
 return true;
 }
 
 /**
 * 发送邮件
 * 服务器为esmtp时候采用本方法
 * @return true=send ok,false=send failed
 */
 public boolean sendmail() {
 
 //打开与邮件服务器的连接
 if(!createconnection()){
 return false;
 }
 
 stringbuffer thecontent = null;
 //ehlo
 thecontent = new stringbuffer();
 thecontent.append("ehlo ");
 thecontent.append(smtpserver);
 thecontent.append(end_flag);
 sendcmd(thecontent.tostring());
 if(fetchcmdresult().indexof("250")==-1) return false;
 //auth login
 thecontent = new stringbuffer();
 thecontent.append("auth login");
 thecontent.append(end_flag);
 sendcmd(thecontent.tostring());
 if(fetchcmdresult().indexof("334")==-1) return false;
 //用户名
 thecontent = new stringbuffer();
 thecontent.append(base64encode(this.mailusername));
 thecontent.append(end_flag);
 sendcmd(thecontent.tostring());
 if(fetchcmdresult().indexof("334")==-1) return false;
 //密码
 thecontent = new stringbuffer();
 thecontent.append(base64encode(this.mailuserpass));
 thecontent.append(end_flag);
 sendcmd(thecontent.tostring());
 if(fetchcmdresult().indexof("235")==-1) return false;
 //邮件发送者
 thecontent = new stringbuffer();
 thecontent.append("mail from:");
 thecontent.append("<");
 thecontent.append(this.mailfrom);
 thecontent.append(">");
 thecontent.append(end_flag);
 sendcmd(thecontent.tostring());
 if(fetchcmdresult().indexof("250")==-1) return false;
 //邮件发送目标地址
 thecontent = new stringbuffer();
 thecontent.append("rcpt to:");
 thecontent.append("<");
 thecontent.append(this.mailto);
 thecontent.append(">");
 thecontent.append(end_flag);
 sendcmd(thecontent.tostring());
 if(fetchcmdresult().indexof("250")==-1) return false;
 
 //邮件内容-开始
 thecontent = new stringbuffer();
 thecontent.append("data");
 thecontent.append(end_flag);
 sendcmd(thecontent.tostring());
 if(fetchcmdresult().indexof("354")==-1) return false;
 //邮件内容-邮件抬头部分
 thecontent = new stringbuffer();
 thecontent.append("from:");
 thecontent.append(this.mailshowfrom);
 thecontent.append(end_flag);
 thecontent.append("to:");
 thecontent.append(this.mailshowto);
 thecontent.append(end_flag);
 thecontent.append("subject:");
 thecontent.append(this.mailsubject);
 thecontent.append(end_flag);
 thecontent.append("mime-version: 1.0");
 thecontent.append(end_flag);
 
 thecontent.append("content-type: multipart/mixed;boundary=/"");//设置附件表示符
 thecontent.append(email_attach_sign);
 thecontent.append("/"");
 thecontent.append(end_flag);//在正文内容前必须有2个end_flag标记
 thecontent.append(end_flag);
 sendcmd(thecontent.tostring());
 //邮件内容-正文部分
 thecontent = new stringbuffer();
 thecontent.append("--");
 thecontent.append(email_attach_sign);
 thecontent.append(end_flag);
 thecontent.append("content-type:text/plain;");
 thecontent.append(end_flag);
 thecontent.append("content-transfer-encoding: base64");
 thecontent.append(end_flag);
 thecontent.append(end_flag);
 thecontent.append(base64encode(this.mailbody));
 thecontent.append(end_flag);
 thecontent.append(end_flag);
 sendcmd(thecontent.tostring());
 
 //邮件内容-附件部分
 //mailattachfile = null;
 if(mailattachfile!=null && mailattachfile.length>0){
 for(int i=0;i<this.mailattachfile.length;i++){
 //发送附件抬头
 thecontent = new stringbuffer();
 thecontent.append("--");
 thecontent.append(email_attach_sign);
 thecontent.append(i);
 thecontent.append(end_flag);
 thecontent.append("content-type:image/gif;name=/"aaa.gif/"");
 thecontent.append(end_flag);
 thecontent.append("content-transfer-encoding:base64");
 thecontent.append(end_flag);
 thecontent.append("content-disposition:attachment;name=/"aaa.gif/"");
 thecontent.append(end_flag);
 thecontent.append(end_flag);
 sendcmd(thecontent.tostring());
 
 //发送附件内容
 sendbase64data(new stringbuffer(base64encode(readfile(mailattachfile[i]))));
 
 //发送附件结束
 /*
 thecontent = new stringbuffer();
 thecontent.append(end_flag);
 thecontent.append("--");
 thecontent.append(email_attach_sign);
 thecontent.append(i);
 thecontent.append("--");
 thecontent.append(end_flag);
 sendcmd(thecontent.tostring());
 */
 }
 
 }
 
 
 //发送附件结束
 thecontent = new stringbuffer();
 thecontent.append(end_flag);
 thecontent.append(end_flag);
 thecontent.append("--");
 thecontent.append(email_attach_sign);
 thecontent.append("--");
 thecontent.append(end_flag);
 sendcmd(thecontent.tostring());
 
 //邮件内容-结束标记
 thecontent = new stringbuffer();
 thecontent.append(end_flag);
 thecontent.append(".");
 thecontent.append(end_flag);
 sendcmd(thecontent.tostring());
 if(fetchcmdresult().indexof("250")==-1) return false;
 
 //退出断开服务器连接
 thecontent = new stringbuffer();
 thecontent.append("quit");
 thecontent.append(end_flag);
 sendcmd(thecontent.tostring());
 fetchcmdresult();
 
 //邮件发送成功后释放资源
 freeall();
 thecontent = null;
 
 return true;//邮件发送成功
 }
 
 /**
 * 发送经过base64编码后的数据
 * @param src
 */
 public void sendbase64data(stringbuffer srcdata){
 int len_cmd_data = 76;
 int startindex = 0;
 int totallength = 0;
 if(srcdata!=null && srcdata.length()>0){
 totallength = srcdata.length();
 while(true){
 if(startindex+len_cmd_data<totallength){
 sendcmd(srcdata.substring(startindex,startindex+len_cmd_data));
 sendcmd(end_flag);
 }else{
 sendcmd(srcdata.substring(startindex,totallength));
 sendcmd(end_flag);
 break;
 }
 startindex = startindex+len_cmd_data;
 }
 }
 }
 
 /**
 * 释放所有资源
 *
 */
 public void freeall(){
 if(indata!=null){
 try {
 indata.close();
 } catch (ioexception e) {
 // todo auto-generated catch block
 e.printstacktrace();
 }
 indata = null;
 }
 
 if(outdata!=null){
 try {
 outdata.close();
 } catch (ioexception e) {
 // todo auto-generated catch block
 e.printstacktrace();
 }
 outdata = null;
 } 
 
 if(clientmailsocket!=null){
 try {
 clientmailsocket.close();
 } catch (ioexception e) {
 // todo auto-generated catch block
 e.printstacktrace();
 }
 clientmailsocket = null;
 }
 
 }
 
 
 /**
 * 读取文件内容
 * @param filename
 * @return
 */
 public string readfile(string filename){
 byte[] filebuffer = new byte[1024];
 int realsize = 0;
 stringbuffer readcontent = new stringbuffer();
 try {
 inputstream infile = new fileinputstream(new file(filename));
 while(true){
 realsize = infile.read(filebuffer);
 if(-1==realsize) break;
 readcontent.append(new string(filebuffer,0,realsize));
 }
 } catch (filenotfoundexception e) {
 // todo auto-generated catch block
 e.printstacktrace();
 } catch (ioexception e) {
 // todo auto-generated catch block
 e.printstacktrace();
 }
 return readcontent.tostring();
 }
 /**
 * base64编码函数
 * 将指定的字符串编码为base64格式的字符串
 * @param src
 * @return
 */
 public static string base64encode(string src) {
 if (src == null || src.length() == 0)
 return "";
 string encodingtable = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz0123456789+/";
 byte[] buffer = src.getbytes();
 int readnow, i, res;
 char[] writebuf = new char[4];
 char[] buf = new char[3];
 string encodedstr = "";
 int readindex = 0;
 int len = buffer.length;
 boolean isend;
 int byteswritten = 0;
 readnow = 0;
 do {
 isend = false;
 for (i = 0; i < 3; i++) {
 if (readindex >= len) {
 isend = true;
 readnow = i;
 break;
 }
 buf[i] = (char) (((byte) buffer[readindex]) & 0x00ff);
 readindex = readindex + 1;
 }
 if (isend)
 break;
 writebuf[0] = encodingtable.charat((buf[0] >> 2) & 0x003f);
 writebuf[1] = encodingtable
 .charat(((buf[0] & 3) << 4 | (buf[1] >> 4)) & 0x003f);
 writebuf[2] = encodingtable
 .charat(((buf[1] & 15) << 2 | (buf[2] >> 6)) & 0x003f);
 writebuf[3] = encodingtable.charat((buf[2] & 63) & 0x003f);
 for (i = 0; i < 4; i++)
 encodedstr = encodedstr + writebuf[i];
 byteswritten = byteswritten + 4;
 if ((byteswritten % 76) == 0) {
 encodedstr = encodedstr + "";
 }
 } while (readnow != 3);
 if (readnow < 3) {
 switch (readnow) {
 case 1:
 writebuf[0] = encodingtable.charat((buf[0] >> 2) & 0x003f);
 writebuf[1] = encodingtable
 .charat(((buf[0] & 3) << 4) & 0x003f);
 writebuf[2] = '=';
 writebuf[3] = '=';
 for (i = 0; i < 4; i++)
 encodedstr = encodedstr + writebuf[i];
 break;
 case 2:
 writebuf[0] = encodingtable.charat((buf[0] >> 2) & 0x003f);
 writebuf[1] = encodingtable
 .charat(((buf[0] & 3) << 4 | (buf[1] >> 4)) & 0x003f);
 writebuf[2] = encodingtable
 .charat(((buf[1] & 15) << 2) & 0x003f);
 writebuf[3] = '=';
 for (i = 0; i < 4; i++)
 encodedstr = encodedstr + writebuf[i];
 break;
 default:
 break;
 }
 }
 return (encodedstr);
 }
}