




已阅读5页,还剩13页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
以下为Mail.java的全部代码:package com.zlz3907.mail; import java.io.BufferedReader; import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import java.io.UnsupportedEncodingException;import .Socket;import java.nio.charset.Charset;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Date;import java.util.HashMap;import java.util.List;import java.util.Map;import sun.misc.BASE64Encoder;/* * 该类使用Socket连接到邮件服务器, * 并实现了向指定邮箱发送邮件及附件的功能。 * * author Zhong Lizhi */public class Mail /* * 换行符 */ private static final String LINE_END = rn; /* * 值为“true”输出高度信息(包括服务器响应信息),值为“ * false”则不输出调试信息。 */ private boolean isDebug = true; /* * 值为“true”则在发送邮件link Mail#send() * 过程中会读取服务器端返回的消息, * 并在邮件发送完毕后将这些消息返回给用户。 */ private boolean isAllowReadSocketInfo = true; /* * 邮件服务器地址 */ private String host; /* * 发件人邮箱地址 */ private String from; /* * 收件人邮箱地址 */ private List to; /* * 抄送地址 */ private List cc; /* * 暗送地址 */ private List bcc; /* * 邮件主题 */ private String subject; /* * 用户名 */ private String user; /* * 密码 */ private String password; /* * MIME邮件类型 */ private String contentType; /* * 用来绑定多个邮件单元link #partSet * 的分隔标识,我们可以将邮件的正文及每一个附件都看作是一个邮件单元 * 。 */ private String boundary; /* * 邮件单元分隔标识符,该属性将用来在邮件中作为分割各个邮件单元的标识 * 。 */ private String boundaryNextPart; /* * 传输邮件所采用的编码 */ private String contentTransferEncoding; /* * 设置邮件正文所用的字符集 */ private String charset; /* * 内容描述 */ private String contentDisposition; /* * 邮件正文 */ private String content; /* * 发送邮件日期的显示格式 */ private String simpleDatePattern; /* * 附件的默认MIME类型 */ private String defaultAttachmentContentType; /* * 邮件单元的集合,用来存放正文单元和所有的附件单元。 */ private List partSet; /* * 不同类型文件对应的link MIME 类型映射。在添加附件 * link #addAttachment(String) * 时,程序会在这个映射中查找对应文件的 link MIME * 类型,如果没有, 则使用 * link #defaultAttachmentContentType * 所定义的类型。 */ private static Map contentTypeMap; static / MIME Media Types contentTypeMap = new HashMap(); contentTypeMap.put(xls, application/vnd.ms-excel); contentTypeMap.put(xlsx, application/vnd.ms-excel); contentTypeMap.put(xlsm, application/vnd.ms-excel); contentTypeMap.put(xlsb, application/vnd.ms-excel); contentTypeMap.put(doc, application/msword); contentTypeMap.put(dot, application/msword); contentTypeMap.put(docx, application/msword); contentTypeMap.put(docm, application/msword); contentTypeMap.put(dotm, application/msword); /* * 该类用来实例化一个正文单元或附件单元对象,他继承了 * link Mail * ,在这里制作这个子类主要是为了区别邮件单元对象和邮件服务对象 * ,使程序易读一些。 这些邮件单元全部会放到partSet * 中,在发送邮件 link #send()时, 程序会调用 * link #getAllParts() * 方法将所有的单元合并成一个符合MIME格式的字符串。 * * author Zhong Lizhi */ private class MailPart extends Mail public MailPart() /* * 默认构造函数 */ public Mail() defaultAttachmentContentType = application/octet-stream; simpleDatePattern = yyyy-MM-dd HH:mm:ss; boundary = -=_NextPart_zlz_3907_ + System.currentTimeMillis(); boundaryNextPart = - + boundary; contentTransferEncoding = base64; contentType = multipart/alternative; charset = Charset.defaultCharset().name(); partSet = new ArrayList(); to = new ArrayList(); cc = new ArrayList(); bcc = new ArrayList(); /* * 根据指定的完整文件名在 * link #contentTypeMap * 中查找其相应的MIME类型, 如果没找到,则返回 * link #defaultAttachmentContentType * 所指定的默认类型。 * * param fileName * 文件名 * return 返回文件对应的MIME类型。 */ private String getPartContentType(String fileName) String ret = null; if (null != fileName) int flag = fileName.lastIndexOf(.); if (0 = flag & flag = 0; i-) Mail attachment = partSet.get(i); String attachmentContent = attachment.getContent(); if (null != attachmentContent & 0 attachmentContent.length() sbd.append(getBoundaryNextPart().append(LINE_END); sbd.append(Content-Type: ); sbd.append(attachment.getContentType(); sbd.append(LINE_END); sbd.append(Content-Transfer-Encoding: ); sbd.append(attachment.getContentTransferEncoding(); sbd.append(LINE_END); if (i != partCount - 1) sbd.append(Content-Disposition: ); sbd.append(attachment.getContentDisposition(); sbd.append(LINE_END); sbd.append(LINE_END); sbd.append(attachment.getContent(); sbd.append(LINE_END); sbd.append(LINE_END); sbd.append(LINE_END); / sbd.append(boundaryNextPart). / append(LINE_END); partSet.clear(); return sbd.toString(); /* * 添加邮件正文单元 */ private void addContent() if (null != content) MailPart part = new MailPart(); part.setContent(toBase64(content); part.setContentType(text/plain;charset= + charset + ); partSet.add(part); private String listToMailString(List mailAddressList) StringBuilder sbd = new StringBuilder(); if (null != mailAddressList) int listSize = mailAddressList.size(); for (int i = 0; i listSize; i+) if (0 != i) sbd.append(;); sbd.append(); return sbd.toString(); private List getrecipient() List list = new ArrayList(); list.addAll(to); list.addAll(cc); list.addAll(bcc); return list; /* * 添加一个附件单元 * * param filePath * 文件路径 */ public void addAttachment(String filePath) addAttachment(filePath, null); public void addTo(String mailAddress) this.to.add(mailAddress); public void addCc(String mailAddress) this.cc.add(mailAddress); public void addBcc(String mailAddress) this.bcc.add(mailAddress); /* * 添加一个附件单元 * * param filePath * 文件路径 * param charset * 文件编码格式 */ public void addAttachment(String filePath, String charset) if (null != filePath & filePath.length() 0) File file = new File(filePath); try addAttachment(file.getName(), new FileInputStream(file), charset); catch (FileNotFoundException e) System.out.println(错误: + e.getMessage(); System.exit(1); /* * 添加一个附件单元 * * param fileName * 文件名 * param attachmentStream * 文件流 * param charset * 文件编码格式 */ public void addAttachment(String fileName, InputStream attachmentStream, String charset) try byte bs = null; if (null != attachmentStream) int buffSize = 1024; byte buff = new bytebuffSize; byte temp; bs = new byte0; int readTotal = 0; while (-1 != (readTotal = attachmentStream.read(buff) temp = new bytebs.length; System.arraycopy(bs, 0, temp, 0, bs.length); bs = new bytetemp.length + readTotal; System.arraycopy(temp, 0, bs, 0, temp.length); System.arraycopy(buff, 0, bs, temp.length, readTotal); if (null != bs) MailPart attachmentPart = new MailPart(); charset = null != charset ? charset : Charset.defaultCharset() .name(); String contentType = getPartContentType(fileName) + ;name=? + charset + ?B? + toBase64(fileName) + ?=; attachmentPart.setCharset(charset); attachmentPart.setContentType(contentType); attachmentPart.setContentDisposition(attachment;filename=? + charset + ?B? + toBase64(fileName) + ?=); attachmentPart.setContent(toBase64(bs); partSet.add(attachmentPart); catch (Exception e) e.printStackTrace(); finally if (null != attachmentStream) try attachmentStream.close(); attachmentStream = null; catch (IOException e) e.printStackTrace(); Runtime.getRuntime().gc(); Runtime.getRuntime().runFinalization(); /* * 发送邮件 * * return 邮件服务器反回的信息 */ public String send() / 对象申明 / 当邮件发送完毕后,以下三个对象(Socket、 / PrintWriter, / BufferedReader)需要关闭。 Socket socket = null; PrintWriter pw = null; BufferedReader br = null; try socket = new Socket(host, 25); pw = new PrintWriter(socket.getOutputStream(); br = new BufferedReader(new InputStreamReader(socket .getInputStream(); StringBuilder infoBuilder = new StringBuilder( nServer info: n-n); / 与服务器建立连接 pw.write(HELO .concat(host).concat(LINE_END); / 连接到邮件服务 if (!readResponse(pw, br, infoBuilder, 220) return infoBuilder.toString(); pw.write(AUTH LOGIN.concat(LINE_END); / 登录 if (!readResponse(pw, br, infoBuilder, 250) return infoBuilder.toString(); pw.write(toBase64(user).concat(LINE_END); / 输入用户名 if (!readResponse(pw, br, infoBuilder, 334) return infoBuilder.toString(); pw.write(toBase64(password).concat(LINE_END); / 输入密码 if (!readResponse(pw, br, infoBuilder, 334) return infoBuilder.toString(); pw.write(MAIL FROM: + LINE_END); / 发件人邮箱地址 if (!readResponse(pw, br, infoBuilder, 235) return infoBuilder.toString(); List recipientList = getrecipient(); / 收件邮箱地址 for (int i = 0; i recipientList.size(); i+) pw.write(RCPT TO: + LINE_END); if (!readResponse(pw, br, infoBuilder, 250) return infoBuilder.toString(); / System.out.println( / getAllSendAddress(); pw.write(DATA + LINE_END); / 开始输入邮件 if (!readResponse(pw, br, infoBuilder, 250) return infoBuilder.toString(); flush(pw); / 设置邮件头信息 StringBuffer sbf = new StringBuffer(From: + LINE_END); / 发件人 sbf.append(To: + listToMailString(to) + LINE_END);/ 收件人 sbf.append(Cc: + listToMailString(cc) + LINE_END);/ 收件人 sbf.append(Bcc: + listToMailString(bcc) + LINE_END);/ 收件人 sbf.append(Subject: + subject + LINE_END);/ 邮件主题 SimpleDateFormat sdf = new SimpleDateFormat(simpleDatePattern); sbf.append(Date: ).append(sdf.format(new Date(); sbf.append(LINE_END); / 发送时间 sbf.append(Content-Type: ); sbf.append(contentType); sbf.append(;); sbf.append(boundary=); sbf.append(boundary).append(); / 邮件类型设置 sbf.append(LINE_END); sbf.append(This is a multi-part message in MIME format.); sbf.append(LINE_END); / 添加邮件正文单元 addContent(); / 合并所有单元,正文和附件。 sbf.append(getAllParts(); / 发送 sbf.append(LINE_END).append(.).append(LINE_END); pw.write(sbf.toString(); readResponse(pw, br, infoBuilder, 354); flush(pw); / QUIT退出 pw.write(QUIT + LINE_END); if (!readResponse(pw, br, infoBuilder, 250) return infoBuilder.toString(); flush(pw); return infoBuilder.toString(); catch (Exception e) e.printStackTrace(); return Exception: + e.getMessage(); finally / 释放资源 try if (null != socket) socket.close(); if (null != pw) pw.close(); if (null != br) br.close(); catch (IOException e) e.printStackTrace(); / this.to.clear(); / this.cc.clear(); / this.bcc.clear(); this.partSet.clear(); /* * 将SMTP命令发送到邮件服务器 * * param pw * 邮件服务器输入流 */ private void flush(PrintWriter pw) if (!isAllowReadSocketInfo) pw.flush(); /* * 读取邮件服务器的响应信息 * * param pw * 邮件服务器输入流 * param br * 邮件服务器输出流 * param infoBuilder * 用来存放服务器响应信息的字符串缓冲 * param msgCode * return * throws IOException */ private boolean readResponse(PrintWriter pw, BufferedReader br, StringBuilder infoBuilder, String msgCode) throws IOException if (isAllowReadSocketInfo) pw.flush(); String message = br.readLine(); infoBuilder.append(SERVER:/); infoBuilder.append(message).append(LINE_END); if (null = message | 0 message.indexOf(msgCode) System.out.println(ERROR: + message); pw.write(QUIT.concat(LINE_END); pw.flush(); return false; if (isDebug) System.out.println(DEBUG:/ + msgCode + / + message); return true; public String getBoundaryNextPart() return boundaryNextPart; public void setBoundaryNextPart(String boundaryNextPart) this.boundaryNextPart = boundaryNextPart; publi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 全小区房屋出售合同范本
- 加盟共享充电宝合同范本
- 剥离工程承包合同协议书
- 五金销售代理商合同协议
- 亲戚全家遗产继承协议书
- 公司分开经营合同协议书
- 俱乐部租赁球员合同范本
- 宿舍免责协议书2025
- 加盟艺术培训合同协议书
- 双方自愿解除居间协议书
- 第四节道亨slw2d架空送电线路评断面处理及定位设计系统部分操作说明
- 测振仪使用方法
- 2023-2024学年湖南省耒阳市小学语文六年级下册期末自测测试题
- 12YJ4-1 常用门窗标准图集
- 表- 邻二氯苯的理化性质和危险特性表
- 工程项目全过程造价管理课件PPT超详细
- 成人手术后疼痛处理专家共识
- 读书分享-《教育的情调》
- 《材料力学》说课-课件
- 物资采购付款报销单
- 政务云收费标准 云托管收费标准
评论
0/150
提交评论