javamail乱码问题(2)

2019-08-31 20:07

Properties props = new Properties(); // fill props with any information

Session session = Session.getDefaultInstance(props, null); 或者,您可以用getInstance()方法创建一个独特的会话: Properties props = new Properties(); // fill props with any information

Session session = Session.getInstance(props, null);

这两种情形下的null参数都是一种Authenticator对象,它不是在此时使用的。详细信息请参阅其后的“Autherticator”一节。

在大多数情况下,使用共享会话就足够了,即使为多个用户邮箱处理邮件会话也是如此。您可以在通信过程的后面一步添加上用户名和密码的组合,并保持所有的一切是独立的。 Message类

一旦创建了自己的Session对象,就是该去创建要发送的消息的时候了。这时就要用到消息类型。作为一个抽象类,您必须操作一个子类,在大多数情况下,该子类是

javax.mail.internet.MimeMessage。一个MimeMessage是一种理解MIME类型和报头(在不同的RFC文档中均有定义)的消息。消息的报头被严格限制成只能使用US-ASCII字符,尽管非ASCII字符可以被编码到某些报头字段中。

可以通过将Session对象传递给MimeMessage构造器的方法来创建消息: MimeMessage message = new MimeMessage(session);

注意:还有其他的构造器,像用于创建消息的源于RFC822格式化的输入流的构造器。 一旦创建了消息,就可以设置其各个部分,如Message(消息)实现Part(部分)接口(以MimeMessage实现MimePart)。设置内容的基本机制是setContent()方法,它带有表示内容和MIME类型的参数:

message.setContent(\

但是,如果正在使用 MimeMessage,并且您的消息是纯文本,那么您就可以使用setText()方法。该方法只需要一个表示实际内容的参数,默认的MIME类型为纯文本: message.setText(\

对于纯文本消息,setText()方法更常常被用来设置内容。要发送其他类型的消息,如HTML消息,就要使用setContent方法()。现在用的更多的是HTML消息。 要设置主题,可以使用setSubject()方法: message.setSubject(\Address类

一旦创建了会话和消息,并为消息填充了内容,就需要用Address类为您的信件标上地址了。同Message类一样,Address类也是一种抽象类。您可以使用javax.mail.internet.InternetAddress类。

要创建只带有电子邮件地址的地址,可以把电子邮件地址传递给Address类的构造器: Address address = new InternetAddress(\president@whitehouse.gov\如果想让一个名字出现在电子邮件地址后,也可以将其传递给构造器:

Address address = new InternetAddress(\president@whitehouse.gov\Bush\

您要为消息的from(发送者)字段和to(接收者)字段创建地址对象。除非您的邮件服务器阻止这样做,否则要在发送的消息中注明该消息的发送者。

一旦创建好了地址,有两种方法可让您将地址与消息连接起来。为了鉴别发送者,您可以使用setFrom()和setReplyTo()方法。

message.setFrom(address)

如果您的消息需要显示多个地址来源,则可以使用addFrom()方法: Address address[] = ...; message.addFrom(address);

为了鉴别消息接收者,您可以使用addRecipient()方法。该方法除了需要一个地址参数外,还需要一个Message.RecipientType属性(消息的接收类型)。 message.addRecipient(type, address) 地址的3种预定义类型如下: · Message.RecipientType.TO · Message.RecipientType.CC · Message.RecipientType.BCC

因此,如果一条消息将发送给副总统,同时还将发送该消息的副本给第一夫人,则采用下面的代码:

Address toAddress = new InternetAddress(\vice.president@whitehouse.gov\Address ccAddress = new InternetAddress(\first.lady@whitehouse.gov\message.addRecipient(Message.RecipientType.TO, toAddress); message.addRecipient(Message.RecipientType.CC, ccAddress);

JavaMail API没有提供检查电子邮件地址有效性的机制。您可以自己编写支持扫描有效字符(在RFC 822文档中所定义的)的程序或检验MX(邮件交换)记录,这些都超越了JavaMail API的范围。

Authenticator类

与java.net类一样,JavaMail API可以利用Authenticator(验证程序)类通过用户名和密码来访问受保护的资源。对于JavaMail API来说,这种受保护的资源是指邮件服务器。JavaMail的Authenticator类可以在javax.mail包中找到,并有别于同名的java.net类。当JavaMail API在Java 1.1下工作时,JavaMail和java.net不会共享同一个Authenticator类名称,这是因为Java 1.1中不含有java.net。

要使用Authenticator类,您可以使用该抽象类的子类,并通过getPasswordAuthentication()方法返回一个PasswordAuthentication实例。在创建时,您必须用会话记录Authentication类。其后,当需要进行身份验证时,会通知您的Authenticator。会弹出一个窗口,或从一个配置文件(尽管不加密就不安全)中读取用户名和密码,并把它们作为一个PasswordAuthentication对象返回给调用程序。 Properties props = new Properties(); // fill props with any information

Authenticator auth = new MyAuthenticator();

Session session = Session.getDefaultInstance(props, auth); Transport类

发送消息的最后一步操作是使用Transport类。该类使用特定于协议(通常是SMTP)的语言来发送消息。它是一个抽象类,其操作与Session类有些相似。您可以通过只调用静态的send()方法来使用该类的默认版本: Transport.send(message);

或者,您可以从用于您的协议的会话中获取一个特定的实例,然后传递用户名和密码(不必要时可以为空)并发送消息,最后关闭连接:

message.saveChanges(); // implicit with send() Transport transport = session.getTransport(\

transport.connect(host, username, password);

transport.sendMessage(message, message.getAllRecipients()); transport.close();

当您需要发送多个消息时,建议采用后一种方法,因为它将保持消息间活动服务器的连接。而基本的send()机制会为每一个方法调用都建立一条独立的连接。

注意:要查看经过邮件服务器邮件命令,可以用session.setDebug(true)方法设置调试标志。 Store和Folder类

使用Session类来获取消息,开始时与发送消息很相似。但是,在获取会话后,很有可能使用用户名和密码或Authenticator类来连接Store类。与Transport类一样,您要告诉Store类将使用什么协议:

// Store store = session.getStore(\Store store = session.getStore(\store.connect(host, username, password);

在连接Store类后,就可以获取一个Folder类,在读取其中的消息前必须先打开该类。 Folder folder = store.getFolder(\folder.open(Folder.READ_ONLY);

Message message[] = folder.getMessages();

对于POP3协议,惟一可用的文件夹是INBOX。如果使用的是IMAP协议,则可以使用其他的文件夹。

注意:Sun公司的提供程序本来想提供方便。而Message message[]=folder.getMessages();这条语句却是一种从服务器逐条读取消息的缓慢操作,所以仅当您确实需要获取消息部分(该内容是所检索消息的内容)时可以使用这条语句。

一旦读取消息,就可以使用getContent()方法获取其内容,或使用writeTo()方法将其内容写到一个流中。getContent()方法只获取消息内容,而writeTo()方法则还会输出报头。 System.out.println(((MimeMessage)message).getContent()); 一旦您阅读完邮件,就可以关闭对文件夹和存储的连接。 folder.close(aBoolean); store.close();

传递给文件夹的close()方法的布尔变量指定了是否通过清除已删除的消息来更新文件夹。 继续前进

实际上,理解使用这7个类的方式,是使用JavaMail API处理几乎所有事情所需要的全部内容。用这7个类以外的方式构建的JavaMail API,其大多数功能都是以几乎完全相同或特定的方式来执行任务的,就好像内容是附件。特定的任务,如:搜索、隔离等将在后面进行介绍。 使用JavaMail API

您已经看到了如何操作JavaMail API的核心部分。在下面几节中,您将学习如何连接几个部分以执行特定的任务。 发送消息

发送电子邮件消息涉及到获取会话、创建和填充消息并发送消息这些操作。您可以在获取Session时,通过为要传递的Properties对象设置mail.smtp.host属性来指定您的SMTP服务器。

String host = ...; String from = ...; String to = ...;

// Get system properties

Properties props = System.getProperties(); // Setup mail server

props.put(\// Get session

Session session = Session.getDefaultInstance(props, null); // Define message

MimeMessage message = new MimeMessage(session); message.setFrom(new InternetAddress(from)); message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));

message.setSubject(\message.setText(\// Send message

Transport.send(message);

您应该在try-catch块中编写代码,以在创建消息并发送它时可以抛出一个异常。 练习

发送您的第一个消息 获取消息

对于阅读邮件来说,首先您要获取一个会话,然后获取并连接到一个相应的用于您的收件箱的存储上,接着打开相应的文件夹,再获取消息。同时,不要忘记了操作完成后关闭连接。 String host = ...; String username = ...; String password = ...; // Create empty properties

Properties props = new Properties(); // Get session

Session session = Session.getDefaultInstance(props, null); // Get the store

Store store = session.getStore(\store.connect(host, username, password); // Get folder

Folder folder = store.getFolder(\folder.open(Folder.READ_ONLY); // Get directory

Message message[] = folder.getMessages(); for (int i=0, n=message.length; i

System.out.println(i + \+ \}

// Close connection folder.close(false); store.close();

每一条消息执行何种操作取决于自己决定。上面的代码块只是显示了消息的发送者和主题。从技术上讲,发送者地址列表可以为空,此时getFrom()[0]调用会抛出一个异常。

为了显示整条消息,您可以提示用户在看完消息的发送者和主题字段后,如果想看到消息的内容,可以再调用消息的writeTo()方法。

BufferedReader reader = new BufferedReader ( new InputStreamReader(System.in)); // Get directory

Message message[] = folder.getMessages(); for (int i=0, n=message.length; i

System.out.println(i + \+ \

System.out.println(\\String line = reader.readLine(); if (\

message[i].writeTo(System.out); } else if (\break; } } 练习 检查邮件 删除消息和标志

删除消息涉及到操作与消息关联的标志。对不同的状态有不同的标志,有些标志是系统定义的,有些则是由用户定义的。预定义的标志都是在内部类Flags.Flag中定义的,如下所示: · Flags.Flag.ANSWERED · Flags.Flag.DELETED · Flags.Flag.DRAFT · Flags.Flag.FLAGGED · Flags.Flag.RECENT · Flags.Flag.SEEN · Flags.Flag.USER

仅仅因为标志存在,并不表示标志为所有的邮件服务器/提供程序所支持。例如,除了删除消息外,POP协议对它们都不支持。检查新邮件不是POP的任务,但它已内置到邮件客户程序中。要搞清楚什么标志受到支持,可以使用getPermanentFlags()方法来询问文件夹。 要删除消息,需要为消息设置DELETE标志: message.setFlag(Flags.Flag.DELETED, true); 第一次以READ_WRITE(读-写)模式打开文件夹: folder.open(Folder.READ_WRITE);

然后,处理完了所有的消息,请关闭文件夹,并传递true值以擦去删除的消息。 folder.close(true);

用户可使用Folder类的expunge()方法来删除消息。但是,该方法对Sun公司的POP3提供程序不起作用。其他提供程序或许能也或许不能实现其功能。它更有可能适用于IMAP提供程序。由于POP只支持对收件箱的简单访问,使用Sun公司的提供程序时,您将不得不关闭文件夹以删除消息。

要移去标志,只需传递一个false值给setFlag()方法。要看看是否设置了某个标志,可以使用


javamail乱码问题(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:使用万维网练习

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: