`
javeye
  • 浏览: 331399 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

javamail实现对邮件的发送和收取(一)

阅读更多
javamail是大家都知道的一个邮件收发api,最近出于兴趣爱好,在网上收集了部分关于javamail的使用方法,整理后把源码贴于下。
很抱歉当时没有记住源码的出处,还望前辈们海涵啊。
运行需求:mail.jar,activation.jar 可以在http://java.sun.com上搜索javamail和jaf分别下载上述的包。
1、ReceiveMail.java
作用是接收邮件。具体不多说,看代码就可以。
package org.mail.core;

import java.io.*;
import java.text.*;
import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;

public class ReceiveMail {

	private MimeMessage mimeMessage = null;
	private String saveAttachPath = ""; // 附件下载后的存放目录
	private StringBuffer bodytext = new StringBuffer();
	// 存放邮件内容的StringBuffer对象
	private String dateformat = "yy-MM-dd HH:mm"; // 默认的日前显示格式

	/**
	 * 构造函数,初始化一个MimeMessage对象
	 */
	public ReceiveMail() {
	}

	public ReceiveMail(MimeMessage mimeMessage) {
		this.mimeMessage = mimeMessage;
		System.out.println("create a ReceiveMail object........");
	}

	public void setMimeMessage(MimeMessage mimeMessage) {
		this.mimeMessage = mimeMessage;
	}

	/**
	 * * 获得发件人的地址和姓名
	 */
	public String getFrom() throws Exception {
		InternetAddress address[] = (InternetAddress[]) mimeMessage.getFrom();
		String from = address[0].getAddress();
		if (from == null)
			from = "";
		String personal = address[0].getPersonal();
		if (personal == null)
			personal = "";
		String fromaddr = personal + "<" + from + ">";
		return fromaddr;
	}

	/**
	 * * 获得邮件的收件人,抄送,和密送的地址和姓名,根据所传递的参数的不同 * "to"----收件人 "cc"---抄送人地址
	 * "bcc"---密送人地址
	 */

	public String getMailAddress(String type) throws Exception {
		String mailaddr = "";
		String addtype = type.toUpperCase();
		InternetAddress[] address = null;
		if (addtype.equals("TO") || addtype.equals("CC")
				|| addtype.equals("BCC")) {
			if (addtype.equals("TO")) {
				address = (InternetAddress[]) mimeMessage
						.getRecipients(Message.RecipientType.TO);
			} else if (addtype.equals("CC")) {
				address = (InternetAddress[]) mimeMessage
						.getRecipients(Message.RecipientType.CC);
			} else {
				address = (InternetAddress[]) mimeMessage
						.getRecipients(Message.RecipientType.BCC);
			}
			if (address != null) {
				for (int i = 0; i < address.length; i++) {
					String email = address[i].getAddress();
					if (email == null)
						email = "";
					else {
						email = MimeUtility.decodeText(email);
					}
					String personal = address[i].getPersonal();
					if (personal == null)
						personal = "";
					else {
						personal = MimeUtility.decodeText(personal);
					}
					String compositeto = personal + "<" + email + ">";
					mailaddr += "," + compositeto;
				}
				mailaddr = mailaddr.substring(1);
			}
		} else {
			throw new Exception("Error emailaddr type!");
		}
		return mailaddr;
	}

	/**
	 * * 获得邮件主题
	 */

	public String getSubject() throws MessagingException {
		String subject = "";
		try {
			subject = MimeUtility.decodeText(mimeMessage.getSubject());
			if (subject == null)
				subject = "";
		} catch (Exception exce) {
		}
		return subject;
	}

	/**
	 * * 获得邮件发送日期
	 */

	public String getSentDate() throws Exception {
		Date sentdate = mimeMessage.getSentDate();
		SimpleDateFormat format = new SimpleDateFormat(dateformat);
		return format.format(sentdate);
	}

	/**
	 * * 获得邮件正文内容
	 */

	public String getBodyText() {
		return bodytext.toString();
	}

	/**
	 * * 解析邮件,把得到的邮件内容保存到一个StringBuffer对象中,解析邮件 *
	 * 主要是根据MimeType类型的不同执行不同的操作,一步一步的解析
	 */

	public void getMailContent(Part part) throws Exception {
		String contenttype = part.getContentType();
		int nameindex = contenttype.indexOf("name");
		boolean conname = false;
		if (nameindex != -1)
			conname = true;
		System.out.println("CONTENTTYPE: " + contenttype);
		if (part.isMimeType("text/plain") && !conname) {
			bodytext.append((String) part.getContent());
		} else if (part.isMimeType("text/html") && !conname) {
			bodytext.append((String) part.getContent());
		} else if (part.isMimeType("multipart/*")) {
			Multipart multipart = (Multipart) part.getContent();
			int counts = multipart.getCount();
			for (int i = 0; i < counts; i++) {
				getMailContent(multipart.getBodyPart(i));
			}
		} else if (part.isMimeType("message/rfc822")) {
			getMailContent((Part) part.getContent());
		} else {
		}
	}

	/**
	 * * 判断此邮件是否需要回执,如果需要回执返回"true",否则返回"false"
	 */
	public boolean getReplySign() throws MessagingException {
		boolean replysign = false;
		String needreply[] = mimeMessage
				.getHeader("Disposition-Notification-To");
		if (needreply != null) {
			replysign = true;
		}
		return replysign;
	}

	/**
	 * * 获得此邮件的Message-ID
	 */
	public String getMessageId() throws MessagingException {
		return mimeMessage.getMessageID();
	}

	/**
	 * * 【判断此邮件是否已读,如果未读返回返回false,反之返回true】
	 */
	public boolean isNew() throws MessagingException {
		boolean isnew = false;
		Flags flags = ((Message) mimeMessage).getFlags();
		Flags.Flag[] flag = flags.getSystemFlags();
		System.out.println("flags's length: " + flag.length);
		for (int i = 0; i < flag.length; i++) {
			if (flag[i] == Flags.Flag.SEEN) {
				isnew = true;
				System.out.println("seen Message.......");
				break;
			}
		}
		return isnew;
	}

	/**
	 * * 判断此邮件是否包含附件
	 */
	public boolean isContainAttach(Part part) throws Exception {
		boolean attachflag = false;
		String contentType = part.getContentType();
		if (part.isMimeType("multipart/*")) {
			Multipart mp = (Multipart) part.getContent();
			for (int i = 0; i < mp.getCount(); i++) {
				BodyPart mpart = mp.getBodyPart(i);
				String disposition = mpart.getDisposition();
				if ((disposition != null)
						&& ((disposition.equals(Part.ATTACHMENT)) || (disposition
								.equals(Part.INLINE))))
					attachflag = true;
				else if (mpart.isMimeType("multipart/*")) {
					attachflag = isContainAttach((Part) mpart);
				} else {
					String contype = mpart.getContentType();
					if (contype.toLowerCase().indexOf("application") != -1)
						attachflag = true;
					if (contype.toLowerCase().indexOf("name") != -1)
						attachflag = true;
				}
			}
		} else if (part.isMimeType("message/rfc822")) {
			attachflag = isContainAttach((Part) part.getContent());
		}
		return attachflag;
	}

	/**
	 * * 【保存附件】
	 */

	public void saveAttachMent(Part part) throws Exception {
		String fileName = "";
		if (part.isMimeType("multipart/*")) {
			Multipart mp = (Multipart) part.getContent();
			for (int i = 0; i < mp.getCount(); i++) {
				BodyPart mpart = mp.getBodyPart(i);
				String disposition = mpart.getDisposition();
				if ((disposition != null)
						&& ((disposition.equals(Part.ATTACHMENT)) || (disposition
								.equals(Part.INLINE)))) {
					fileName = mpart.getFileName();
					if (fileName.toLowerCase().indexOf("gb2312") != -1) {
						fileName = MimeUtility.decodeText(fileName);
					}
					saveFile(fileName, mpart.getInputStream());
				} else if (mpart.isMimeType("multipart/*")) {
					saveAttachMent(mpart);
				} else {
					fileName = mpart.getFileName();
					if ((fileName != null)
							&& (fileName.toLowerCase().indexOf("GB2312") != -1)) {
						fileName = MimeUtility.decodeText(fileName);
						saveFile(fileName, mpart.getInputStream());
					}
				}
			}
		} else if (part.isMimeType("message/rfc822")) {
			saveAttachMent((Part) part.getContent());
		}
	}

	/**
	 * * 【设置附件存放路径】
	 */

	public void setAttachPath(String attachpath) {
		this.saveAttachPath = attachpath;
	}

	/**
	 * * 【设置日期显示格式】
	 */

	public void setDateFormat(String format) throws Exception {
		this.dateformat = format;
	}

	/**
	 * * 【获得附件存放路径】
	 */

	public String getAttachPath() {
		return saveAttachPath;
	}

	/**
	 * * 【真正的保存附件到指定目录里】
	 */

	private void saveFile(String fileName, InputStream in) throws Exception {
		String osName = System.getProperty("os.name");
		String storedir = getAttachPath();
		String separator = "";
		if (osName == null)
			osName = "";
		if (osName.toLowerCase().indexOf("win") != -1) {
			separator = "\\";
			if (storedir == null || storedir.equals(""))
				storedir = "c:\\tmp";
		} else {
			separator = "/";
			storedir = "/tmp";
		}
		File storefile = new File(storedir + separator + fileName);
		System.out.println("storefile's path: " + storefile.toString());
		// for(int i=0;storefile.exists();i++){
		// storefile = new File(storedir+separator+fileName+i);
		// }
		BufferedOutputStream bos = null;
		BufferedInputStream bis = null;
		try {
			bos = new BufferedOutputStream(new FileOutputStream(storefile));
			bis = new BufferedInputStream(in);
			int c;
			while ((c = bis.read()) != -1) {
				bos.write(c);
				bos.flush();
			}
		} catch (Exception exception) {
			exception.printStackTrace();
			throw new Exception("文件保存失败!");
		} finally {
			bos.close();
			bis.close();
		}
	}

	/**
	 * * ReceiveMail类测试
	 */

	public static void main(String args[]) throws Exception {
		String host = "pop.163.com";
		String username = "demo";//您的邮箱用户名
		String password = "******";//您的邮箱密码
		Properties props = new Properties();
		Session session = Session.getDefaultInstance(props, null);
		Store store = session.getStore("pop3");
		store.connect(host, username, password);
		Folder folder = store.getFolder("INBOX");
		folder.open(Folder.READ_ONLY);
		Message message[] = folder.getMessages();
		System.out.println("Messages's length: " + message.length);
		ReceiveMail pmm = null;
		for (int i = 0; i < message.length; i++) {
			pmm = new ReceiveMail((MimeMessage) message[i]);
			System.out
					.println("Message " + i + " subject: " + pmm.getSubject());
			System.out.println("Message " + i + " sentdate: "
					+ pmm.getSentDate());
			System.out.println("Message " + i + " replysign: "
					+ pmm.getReplySign());
			System.out.println("Message " + i + " hasRead: " + pmm.isNew());
			System.out.println("Message " + i + "  containAttachment: "
					+ pmm.isContainAttach((Part) message[i]));
			System.out.println("Message " + i + " form: " + pmm.getFrom());
			System.out.println("Message " + i + " to: "
					+ pmm.getMailAddress("to"));
			System.out.println("Message " + i + " cc: "
					+ pmm.getMailAddress("cc"));
			System.out.println("Message " + i + " bcc: "
					+ pmm.getMailAddress("bcc"));
			pmm.setDateFormat("yy年MM月dd日 HH:mm");
			System.out.println("Message " + i + " sentdate: "
					+ pmm.getSentDate());
			System.out.println("Message " + i + " Message-ID: "
					+ pmm.getMessageId());
			pmm.getMailContent((Part) message[i]);
			System.out.println("Message " + i + " bodycontent: \r\n"
					+ pmm.getBodyText());
			pmm.setAttachPath("c:\\tmp\\coffeecat1124");
			pmm.saveAttachMent((Part) message[i]);
		}
	}
}

2、SendMail.java
作用是邮件发送的示例代码,可完成多个附件的发送
package org.mail.core;

import java.util.Date;
import java.util.Enumeration;
import java.util.Properties;
import java.util.Vector;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;

/**
 * Title: 使用javamail发送邮件
 * Description: 演示如何使用javamail包发送电子邮件。这个实例可发送多附件
 * @version 1.0
 */
public class SendMail {

	String to = "";// 收件人
	String from = "";// 发件人
	String host = "";// smtp主机
	String username = "";
	String password = "";
	String filename = "";// 附件文件名
	String subject = "";// 邮件主题
	String content = "";// 邮件正文
	Vector file = new Vector();// 附件文件集合

	/**
	 * <br>
	 * 方法说明:默认构造器 <br>
	 * 输入参数: <br>
	 * 返回类型:
	 */
	public SendMail() {
	}

	/**
	 * <br>
	 * 方法说明:构造器,提供直接的参数传入 <br>
	 * 输入参数: <br>
	 * 返回类型:
	 */
	public SendMail(String to, String from, String smtpServer, String username,
			String password, String subject, String content) {
		this.to = to;
		this.from = from;
		this.host = smtpServer;
		this.username = username;
		this.password = password;
		this.subject = subject;
		this.content = content;
	}

	/**
	 * <br>
	 * 方法说明:设置邮件服务器地址 <br>
	 * 输入参数:String host 邮件服务器地址名称 <br>
	 * 返回类型:
	 */
	public void setHost(String host) {
		this.host = host;
	}

	/**
	 * <br>
	 * 方法说明:设置登录服务器校验密码 <br>
	 * 输入参数: <br>
	 * 返回类型:
	 */
	public void setPassWord(String pwd) {
		this.password = pwd;
	}

	/**
	 * <br>
	 * 方法说明:设置登录服务器校验用户 <br>
	 * 输入参数: <br>
	 * 返回类型:
	 */
	public void setUserName(String usn) {
		this.username = usn;
	}

	/**
	 * <br>
	 * 方法说明:设置邮件发送目的邮箱 <br>
	 * 输入参数: <br>
	 * 返回类型:
	 */
	public void setTo(String to) {
		this.to = to;
	}

	/**
	 * <br>
	 * 方法说明:设置邮件发送源邮箱 <br>
	 * 输入参数: <br>
	 * 返回类型:
	 */
	public void setFrom(String from) {
		this.from = from;
	}

	/**
	 * <br>
	 * 方法说明:设置邮件主题 <br>
	 * 输入参数: <br>
	 * 返回类型:
	 */
	public void setSubject(String subject) {
		this.subject = subject;
	}

	/**
	 * <br>
	 * 方法说明:设置邮件内容 <br>
	 * 输入参数: <br>
	 * 返回类型:
	 */
	public void setContent(String content) {
		this.content = content;
	}

	/**
	 * <br>
	 * 方法说明:把主题转换为中文 <br>
	 * 输入参数:String strText <br>
	 * 返回类型:
	 */
	public String transferChinese(String strText) {
		try {
			strText = MimeUtility.encodeText(new String(strText.getBytes(),
					"GB2312"), "GB2312", "B");
		} catch (Exception e) {
			e.printStackTrace();
		}
		return strText;
	}

	/**
	 * <br>
	 * 方法说明:往附件组合中添加附件 <br>
	 * 输入参数: <br>
	 * 返回类型:
	 */
	public void attachfile(String fname) {
		file.addElement(fname);
	}

	/**
	 * <br>
	 * 方法说明:发送邮件 <br>
	 * 输入参数: <br>
	 * 返回类型:boolean 成功为true,反之为false
	 */
	public boolean sendMail() {

		// 构造mail session
		Properties props = System.getProperties();
		props.put("mail.smtp.host", host);
		props.put("mail.smtp.auth", "true");
		Session session = Session.getDefaultInstance(props,
				new Authenticator() {
					public PasswordAuthentication getPasswordAuthentication() {
						return new PasswordAuthentication(username, password);
					}
				});

		try {
			// 构造MimeMessage 并设定基本的值
			MimeMessage msg = new MimeMessage(session);
			msg.setFrom(new InternetAddress(from));
			InternetAddress[] address = { new InternetAddress(to) };
			msg.setRecipients(Message.RecipientType.TO, address);
			subject = transferChinese(subject);
			msg.setSubject(subject);

			// 构造Multipart
			Multipart mp = new MimeMultipart();

			// 向Multipart添加正文
			MimeBodyPart mbpContent = new MimeBodyPart();
			mbpContent.setText(content);
			// 向MimeMessage添加(Multipart代表正文)
			mp.addBodyPart(mbpContent);

			// 向Multipart添加附件
			Enumeration efile = file.elements();
			while (efile.hasMoreElements()) {

				MimeBodyPart mbpFile = new MimeBodyPart();
				filename = efile.nextElement().toString();
				FileDataSource fds = new FileDataSource(filename);
				mbpFile.setDataHandler(new DataHandler(fds));
				mbpFile.setFileName(fds.getName());
				// 向MimeMessage添加(Multipart代表附件)
				mp.addBodyPart(mbpFile);

			}

			file.removeAllElements();
			// 向Multipart添加MimeMessage
			msg.setContent(mp);
			msg.setSentDate(new Date());
			// 发送邮件
			Transport.send(msg);

		} catch (MessagingException mex) {
			mex.printStackTrace();
			Exception ex = null;
			if ((ex = mex.getNextException()) != null) {
				ex.printStackTrace();
			}
			return false;
		}
		return true;
	}

	/**
	 * <br>
	 * 方法说明:主方法,用于测试 <br>
	 * 输入参数: <br>
	 * 返回类型:
	 */
	public static void main(String[] args) {
		SendMail sendmail = new SendMail();
		sendmail.setHost("smtp.163.com");//smtp.mail.yahoo.com.cn 
		sendmail.setUserName("demo");//您的邮箱用户名
		sendmail.setPassWord("******");//您的邮箱密码
		sendmail.setTo("someone@yahoo.com.cn");//接收者
		sendmail.setFrom("demo@163.com");//发送者
		sendmail.setSubject("你好,这是测试2!");
		sendmail.setContent("你好这是一个带多附件的测试2!");
		sendmail.attachfile("c:/attachment1.txt");
		sendmail.attachfile("c:/attachment2.txt");
		sendmail.sendMail();

	}
}// end



恩,就这些了,其他的大家自己去挖掘吧。代码在eclipse下调试通过,请放心使用

好人做到底,我把两个jar包一起附上,大家多顶啊。
  • mail.zip (381.3 KB)
  • 描述: javamail所需要的两个jar包。mail.jar,activation.jar
  • 下载次数: 48
分享到:
评论

相关推荐

    james和javamail实现邮件收发(带发送附件)

    在IT行业中,电子邮件的收发是一项基础且重要的功能,尤其对于开发者来说,了解如何通过编程方式实现邮件的发送和接收是非常必要的。在这个例子中,我们将深入探讨如何利用James服务器和JavaMail API来实现这一目标...

    javaMail实现文件接收与发送

    在提供的压缩包文件"java实现邮件发送与接收"中,应该包含示例代码,帮助你更好地理解上述过程。通过运行这些代码,你可以快速测试邮件的发送和接收功能,并根据自己的需求进行定制。 请注意,对于Gmail等服务,...

    使用javaMail发邮件及收取邮箱未读邮件并标记为已读

    JavaMail 是一个强大的 Java 库,它允许开发者在应用程序中实现电子邮件的发送和接收功能。这个库支持多种邮件协议,如 SMTP(简单邮件传输协议)用于发送邮件,POP3(邮局协议)和 IMAP(因特网消息访问协议)用于...

    javaMail发送邮件 发送成功 收不到邮件 或收到邮件无主题无收件人乱码

    在使用JavaMail进行邮件发送的过程中,可能会遇到以下几种常见问题:发送成功但收件方未收到邮件、邮件收到后无主题或无收件人信息以及邮件内容出现乱码等情况。本文将详细探讨这些问题的原因及相应的解决方案。 ##...

    javamail 发送收取邮件

    ### 实现邮件发送功能 接下来是文件中给出的部分代码示例。我们将基于这段代码进一步讲解如何发送邮件。 ```java public void senderEmailForPhone(TblEmailInfo mailInfo) { try { // 解码密码 BASE64Decoder ...

    怎么用JavaMail收取邮件

    在本文中,我们将深入探讨如何使用 JavaMail 收取邮件,包括了解 POP3 和 IMAP 协议以及如何通过 JavaMail API 实现邮件的接收。 首先,我们需要知道发送邮件通常使用 SMTP(简单邮件传输协议),而接收邮件则涉及...

    javamail实现邮件收发和加密

    JavaMail 是一个开源的 Java API,它允许开发者在 Java 应用程序中添加电子邮件功能,包括发送、接收邮件以及管理邮箱。在这个主题中,我们将深入探讨如何使用 JavaMail 实现邮件的加密和解密,以及如何进行邮件的...

    利用JavaMail实现邮件的收取.doc

    JavaMail 是一个用于处理电子邮件的开源库,它提供了发送和接收邮件的功能。本文将详细讲解如何使用JavaMail API来实现邮件的收取。 首先,我们需要了解一些基本配置。在示例代码中,创建了一个名为 `Config` 的...

    JavaMail收发Gmail邮件

    ### JavaMail收发Gmail邮件知识点详解 ...通过以上步骤,我们可以使用JavaMail实现对Gmail邮件的收发功能,并且通过SSL加密技术确保了数据的安全传输。这对于开发涉及邮件处理的应用程序非常有用。

    javamail收取邮件(包括附件)

    总结一下,JavaMail是一个强大的库,提供了对POP3和IMAP协议的支持,使得在Java应用程序中收取邮件变得简单。通过配置邮件服务器的相关参数,连接到服务器,然后打开邮箱并遍历邮件,可以方便地获取邮件信息和附件。...

    基于Javamail的邮件收发系统(系统+论文+开题报告+任务书+外文翻译+文献综述+答辩PPT).zip

    1、打开javamailsystem文件夹,找到javamail.jar可执行文件,双击该执行文件,即可打开Javamail邮件收发系统客户端软件。进入该系统后,首先选择“POP3/SMTP设置”按钮,对收发邮件所需的邮件服务器主机、收发邮件...

    javamail通过imap协议收取邮件(Exchange2007)

    JavaMail是一种开源的Java库,它允许开发人员在Java应用程序中发送和接收电子邮件。IMAP(Internet Message Access Protocol)是一种标准的邮件访问协议,用于从邮件服务器检索邮件。Exchange 2007是微软的企业级...

    JavaMail邮件上传发送的成功的小demo

    JavaMail邮件上传发送的成功的小demo是一个实用的程序示例,它展示了如何利用JavaMail API在Java应用程序中实现邮件的上传和发送功能。JavaMail是一个开源的Java库,它提供了丰富的API,使得开发者能够轻松地处理...

    javamail 邮件解析、接收、发送程序

    很好的邮件处理代码,1.5版本,作为build path放在eclipse里面,就可以用啦! oracle官方推的,很好!jdk1.6版本以上用起来很方便。

    JAVA源码Javamail的邮件收发系统源码/文档

    - **多线程处理**:为了提高效率,可以在后台异步处理邮件发送和接收任务。 - **安全性考虑**:在连接邮件服务器时应使用加密方式(如SSL/TLS),保护用户隐私。 ##### 3. 实现步骤 1. **配置邮件会话**:创建`...

    email客户端-实现发送邮件-纯java实现-包括所需要的库文件

    在这个“email客户端-实现发送邮件-纯java实现-包括所需要的库文件”的主题中,我们将深入探讨如何使用 JavaMail API 实现一个简单的电子邮件客户端,以及必要的库文件。 首先,JavaMail API 提供了 javax.mail 包...

    web版邮件接收发送问题

    通常,邮件发送涉及以下步骤: 1. **配置Properties对象**:设置SMTP服务器地址、端口、用户名和密码等信息。 2. **创建Session对象**:使用Properties对象初始化Session,这是与邮件服务器交互的会话。 3. **创建...

Global site tag (gtag.js) - Google Analytics