发送邮件及邮件附件java代码实例(支持多附件,群发送)_第1页
发送邮件及邮件附件java代码实例(支持多附件,群发送)_第2页
发送邮件及邮件附件java代码实例(支持多附件,群发送)_第3页
发送邮件及邮件附件java代码实例(支持多附件,群发送)_第4页
发送邮件及邮件附件java代码实例(支持多附件,群发送)_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、以下为Mail.java的全部代码:/* * 该类使用Socket连接到邮件服务器, * 并实现了向指定邮箱发送邮件及附件的功能。 * * author Zhong Lizhi */public class Mail /* * 换行符 */ private static final String LINE_END = "rn" /* * 值为“true”输出高度信息(包括服务器响应信息),值为“ * false”则不输出调试信息。 */ private boolean isDebug = true; /* * 值为“true”则在发送邮件link Mail#send() *

2、 过程中会读取服务器端返回的消息, * 并在邮件发送完毕后将这些消息返回给用户。 */ private boolean isAllowReadSocketInfo = true; /* * 邮件服务器地址 */ private String host; /* * 发件人邮箱地址 */ private String from; /* * 收件人邮箱地址 */ private List<String> to; /* * 抄送地址 */ private List<String> cc; /* * 暗送地址 */ private List<String> bcc;

3、/* * 邮件主题 */ private String subject; /* * 用户名 */ private String user; /* * 密码 */ private String password; /* * MIME邮件类型 */ private String contentType; /* * 用来绑定多个邮件单元link #partSet * 的分隔标识,我们可以将邮件的正文及每一个附件都看作是一个邮件单元 * 。 */ private String boundary; /* * 邮件单元分隔标识符,该属性将用来在邮件中作为分割各个邮件单元的标识 * 。 */ private

4、 String boundaryNextPart; /* * 传输邮件所采用的编码 */ private String contentTransferEncoding; /* * 设置邮件正文所用的字符集 */ private String charset; /* * 内容描述 */ private String contentDisposition; /* * 邮件正文 */ private String content; /* * 发送邮件日期的显示格式 */ private String simpleDatePattern; /* * 附件的默认MIME类型 */ private Str

5、ing defaultAttachmentContentType; /* * 邮件单元的集合,用来存放正文单元和所有的附件单元。 */ private List<MailPart> partSet; /* * 不同类型文件对应的link MIME 类型映射。在添加附件 * link #addAttachment(String) * 时,程序会在这个映射中查找对应文件的 link MIME * 类型,如果没有, 则使用 * link #defaultAttachmentContentType * 所定义的类型。 */ private static Map<String, Str

6、ing> contentTypeMap; static / MIME Media Types contentTypeMap = new HashMap<String, String>(); contentTypeMap.put("xls", "application/vnd.ms-excel"); contentTypeMap.put("xlsx", "application/vnd.ms-excel"); contentTypeMap.put("xlsm", "ap

7、plication/vnd.ms-excel"); contentTypeMap.put("xlsb", "application/vnd.ms-excel"); contentTypeMap.put("doc", "application/msword"); contentTypeMap.put("dot", "application/msword"); contentTypeMap.put("docx", "application/

8、msword"); contentTypeMap.put("docm", "application/msword"); contentTypeMap.put("dotm", "application/msword"); /* * 该类用来实例化一个正文单元或附件单元对象,他继承了 * link Mail * ,在这里制作这个子类主要是为了区别邮件单元对象和邮件服务对象 * ,使程序易读一些。 这些邮件单元全部会放到partSet * 中,在发送邮件 link #send()时, 程序会调用 * link

9、#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 = "-=_NextPar

10、t_zlz_3907_" + System.currentTimeMillis(); boundaryNextPart = "-" + boundary; contentTransferEncoding = "base64" contentType = "multipart/alternative" charset = Charset.defaultCharset().name(); partSet = new ArrayList<MailPart>(); to = new ArrayList<String

11、>(); cc = new ArrayList<String>(); bcc = new ArrayList<String>(); /* * 根据指定的完整文件名在 * link #contentTypeMap * 中查找其相应的MIME类型, 如果没找到,则返回 * link #defaultAttachmentContentType * 所指定的默认类型。 * * param fileName * 文件名 * return 返回文件对应的MIME类型。 */ private String getPartContentType(String fileName)

12、String ret = null; if (null != fileName) int flag = fileName.lastIndexOf("."); if (0 <= flag && flag < fileName.length() - 1) fileName = fileName.substring(flag + 1); ret = contentTypeMap.get(fileName); if (null = ret) ret = defaultAttachmentContentType; return ret; /* * 将给定字

13、符串转换为base64编码的字符串 * * param str * 需要转码的字符串 * param charset * 原字符串的编码格式 * return base64编码格式的字符 */ private String toBase64(String str, String charset) if (null != str) try return toBase64(str.getBytes(charset); catch (UnsupportedEncodingException e) e.printStackTrace(); return "" /* * 将指定的字节

14、数组转换为base64格式的字符串 * * param bs * 需要转码的字节数组 * return base64编码格式的字符 */ private String toBase64(byte bs) return new BASE64Encoder().encode(bs); /* * 将给定字符串转换为base64编码的字符串 * * param str * 需要转码的字符串 * return base64编码格式的字符 */ private String toBase64(String str) return toBase64(str, Charset.defaultCharset()

15、.name(); /* * 将所有的邮件单元按照标准的MIME格式要求合并。 * * return 返回一个所有单元合并后的字符串。 */ private String getAllParts() int partCount = partSet.size(); StringBuilder sbd = new StringBuilder(LINE_END); for (int i = partCount - 1; i >= 0; i-) Mail attachment = partSet.get(i); String attachmentContent = attachment.getCo

16、ntent(); 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

17、(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_

18、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=&quo

19、t;" + charset + """); partSet.add(part); private String listToMailString(List<String> mailAddressList) StringBuilder sbd = new StringBuilder(); if (null != mailAddressList) int listSize = mailAddressList.size(); for (int i = 0; i < listSize; i+) if (0 != i) sbd.append(&q

20、uot;"); sbd.append("<").append(mailAddressList.get(i).append(">"); return sbd.toString(); private List<String> getrecipient() List<String> list = new ArrayList<String>(); list.addAll(to); list.addAll(cc); list.addAll(bcc); return list; /* * 添加一个附件单元 *

21、 * param filePath * 文件路径 */ public void addAttachment(String filePath) addAttachment(filePath, null); public void addTo(String mailAddress) public void addCc(String mailAddress) public void addBcc(String mailAddress) /* * 添加一个附件单元 * * param filePath * 文件路径 * param charset * 文件编码格式 */ public void add

22、Attachment(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.exit(1); /* * 添加一个附件单元 * * param fileName * 文件名 * param

23、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 !=

24、(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 Ma

25、ilPart(); charset = null != charset ? charset : Charset.defaultCharset() .name(); String contentType = getPartContentType(fileName) + "name="=?" + charset + "?B?" + toBase64(fileName) + "?="" attachmentPart.setCharset(charset); attachmentPart.setContentType(co

26、ntentType); attachmentPart.setContentDisposition("attachment;filename="=?" + charset + "?B?" + toBase64(fileName) + "?=""); attachmentPart.setContent(toBase64(bs); partSet.add(attachmentPart); catch (Exception e) e.printStackTrace(); finally if (null != attach

27、mentStream) try attachmentStream.close(); attachmentStream = null; catch (IOException e) e.printStackTrace(); Runtime.getRuntime().gc(); Runtime.getRuntime().runFinalization(); /* * 发送邮件 * * return 邮件服务器反回的信息 */ public String send() / 对象申明 / 当邮件发送完毕后,以下三个对象(Socket、 / PrintWriter, / BufferedReader)需要

28、关闭。 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&

29、quot;); / 与服务器建立连接 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 infoBuil

30、der.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.writ

31、e("MAIL FROM:<" + from + ">" + LINE_END); / 发件人邮箱地址 if (!readResponse(pw, br, infoBuilder, "235") return infoBuilder.toString(); List<String> recipientList = getrecipient(); / 收件邮箱地址 for (int i = 0; i < recipientList.size(); i+) pw.write("RCPT TO:<

32、;" + recipientList.get(i) + ">" + LINE_END); if (!readResponse(pw, br, infoBuilder, "250") return infoBuilder.toString(); / getAllSendAddress(); pw.write("DATA" + LINE_END); / 开始输入邮件 if (!readResponse(pw, br, infoBuilder, "250") return infoBuilder.toSt

33、ring(); flush(pw); / 设置邮件头信息 StringBuffer sbf = new StringBuffer("From: <" + from + ">" + LINE_END); / 发件人 sbf.append("To: " + listToMailString(to) + LINE_END);/ 收件人 sbf.append("Cc: " + listToMailString(cc) + LINE_END);/ 收件人 sbf.append("Bcc: "

34、+ 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: "); sb

35、f.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(); / 合并所有单元,正文和附

36、件。 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 infoBu

37、ilder.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.printStackTr

38、ace(); /* * 将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 r

39、eadResponse(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 >

40、message.indexOf(msgCode) pw.write("QUIT".concat(LINE_END); pw.flush(); return false; if (isDebug) return true; public String getBoundaryNextPart() return boundaryNextPart; public void setBoundaryNextPart(String boundaryNextPart) this.boundaryNextPart = boundaryNextPart; public String getDe

41、faultAttachmentContentType() return defaultAttachmentContentType; public void setDefaultAttachmentContentType( String defaultAttachmentContentType) this.defaultAttachmentContentType = defaultAttachmentContentType; public String getHost() return host; public void setHost(String host) this.host = host; public String getFrom() return from; public void setFrom(String from) this.from = from; public List<String> getTo() return to; public void setTo(List<String> to) this.to = to; pu

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论