source:http://www.blogjava.net/fengliangjun/archive/2006/06/03/5740.html
import java.util.Properties;
import javax.mail.*;
import javax.mail.internet.*;
public class receivemail {
public static void main(String[] args) throws Exception {
Properties props = new Properties();
Session recesession = Session.getDefaultInstance(props, null);
recesession.setDebug(true);
Store store = recesession.getStore("pop3");
String user = "****";//帐户
String password = "*****";//密码
store.connect("pop.163.com", user, password);
Folder folder = store.getFolder("INBOX");
folder.open(Folder.READ_ONLY);
Message[] msgs = folder.getMessages();
for (int msgNum = 0; msgNum < msgs.length; msgNum++) {
System.out.println(msgs[msgNum].getSentDate());
System.out.println(msgs[msgNum].getSubject());
System.out.println(msgs[msgNum].getContent());
}
folder.close(false);
store.close();
}
}
package com.email.receive;
import javax.mail.*;
import javax.mail.internet.*;
import java.util.*;
import java.io.*;
/*
Title: 使用JavaMail接收邮件
Description: 实例JavaMail包接收邮件,本实例没有实现接收邮件的附件。
Copyright: Copyright (c) 2003
Filename: POPMail.java
@version 1.0
*/
public class ReceiveEmail{
/*
方法说明:主方法,接收用户输入的邮箱服务器、用户名和密码
输入参数:
返回类型:
*/
public static void main(String args[]){
try{
String popServer="pop3.sina.com"; //邮件服务器
String popUser="user"; //根据自已的用户名修改
String popPassword="pass"; //根据自已的密码修改
receive(popServer, popUser, popPassword);
}catch (Exception ex){
System.out.println("Usage: java com.lotontech.mail.POPMail"+" popServer popUser popPassword");
}
System.exit(0);
}
/*
方法说明:接收邮件信息
输入参数:
返回类型:*/
public static void receive(String popServer, String popUser, String popPassword){
Store store=null;
Folder folder=null;
try{
//获取默认会话
Properties props = System.getProperties();
Session session = Session.getDefaultInstance(props, null);
//使用POP3会话机制,连接服务器
store = session.getStore("pop3");
store.connect(popServer, popUser, popPassword);
//获取默认文件夹
folder = store.getDefaultFolder();
if (folder == null) throw new Exception("No default folder");
//如果是收件箱
folder = folder.getFolder("INBOX");
if (folder == null) throw new Exception("No POP3 INBOX");
//使用只读方式打开收件箱
folder.open(Folder.READ_ONLY);
//得到文件夹信息,获取邮件列表
Message[] msgs = folder.getMessages();
for (int msgNum = 0; msgNum < msgs.length; msgNum++){
printMessage(msgs[msgNum]);
}
}catch (Exception ex){
ex.printStackTrace();
}
finally{
//释放资源
try{
if (folder!=null) folder.close(false);
if (store!=null) store.close();
}catch (Exception ex2) {
ex2.printStackTrace();
}
}
}
/*
方法说明:打印邮件信息
输入参数:Message message 信息对象
返回类型:
*/
public static void printMessage(Message message){
try{
//获得发送邮件地址
String from=((InternetAddress)message.getFrom()[0]).getPersonal();
if (from==null) from=((InternetAddress)message.getFrom()[0]).getAddress();
System.out.println("FROM: "+from);
//获取主题
String subject=message.getSubject();
System.out.println("SUBJECT: "+subject);
//获取信息对象
Part messagePart=message;
Object content=messagePart.getContent();
//附件
if (content instanceof Multipart){
messagePart=((Multipart)content).getBodyPart(0);
System.out.println("[ Multipart Message ]");
}
//获取content类型
String contentType=messagePart.getContentType();
//如果邮件内容是纯文本或者是HTML,那么打印出信息
System.out.println("CONTENT:"+contentType);
if (contentType.startsWith("text/plain")||
contentType.startsWith("text/html")){
InputStream is = messagePart.getInputStream();
BufferedReader reader=new BufferedReader(new InputStreamReader(is));
String thisLine=reader.readLine();
while (thisLine!=null){
System.out.println(thisLine);
thisLine=reader.readLine();
}
}
System.out.println("-------------- END ---------------");
}catch (Exception ex){
ex.printStackTrace();
}
}
}
package com.util.mail;
import java.io.FileOutputStream;
import java.util.Properties;
import javax.mail.Address;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.Multipart;
import javax.mail.NoSuchProviderException;
import javax.mail.Part;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.internet.InternetAddress;
/**
* 邮件接受测试
*
*/
public class POP3MailReceiverTest {
public POP3MailReceiverTest() {
try {
// 1. 设置连接信息, 生成一个 Session
Properties props = new Properties();
props.put("mail.transport.protocol", "pop3");// POP3 收信协议
props.put("mail.pop.port", "110");
// props.put("mail.debug", "true");// 调试
Session session = Session.getInstance(props);
// 2. 获取 Store 并连接到服务器
Store store = session.getStore("pop3");
store.connect("pop3.126.com", "[email protected]", "135246");
// 3. 通过 Store 打开默认目录 Folder
Folder folder = store.getDefaultFolder();// 默认父目录
if (folder == null) {
System.out.println("服务器不可用");
return;
// System.exit(1);
}
// System.out.println("默认信箱名:" + folder.getName());
//
// Folder[] folders = folder.list();// 默认目录列表
//
// System.out.println("默认目录下的子目录数: " + folders.length);
Folder popFolder = folder.getFolder("INBOX");// 获取收件箱
popFolder.open(Folder.READ_WRITE);// 可读邮件,可以删邮件的模式打开目录
// 4. 列出来收件箱 下所有邮件
Message[] messages = popFolder.getMessages();
// 取出来邮件数
int msgCount = popFolder.getMessageCount();
System.out.println("共有邮件: " + msgCount + "封");
// FetchProfile fProfile = new FetchProfile();// 选择邮件的下载模式,
// 根据网速选择不同的模式
// fProfile.add(FetchProfile.Item.ENVELOPE);
// folder.fetch(messages, fProfile);// 选择性的下载邮件
// 5. 循环处理每个邮件并实现邮件转为新闻的功能
for (int i = 0; i < msgCount; i++) {
Message msg = messages[i];// 单个邮件
// 发件人信息
Address[] froms = msg.getFrom();
if(froms != null) {
System.out.println("发件人信息:" + froms[0]);
InternetAddress addr = (InternetAddress)froms[0];
System.out.println("发件人地址:" + addr.getAddress());
System.out.println("发件人显示名:" + addr.getPersonal());
}
News news = new News();// 生成新闻对象
System.out.println("邮件主题:" + msg.getSubject());
news.setTitle(msg.getSubject());
// getContent() 是获取包裹内容, Part 相当于外包装
Multipart multipart = (Multipart) msg.getContent();// 获取邮件的内容, 就一个大包裹,
// MultiPart
// 包含所有邮件内容(正文+附件)
System.out.println("邮件共有" + multipart.getCount() + "部分组成");
// 依次处理各个部分
for (int j = 0, n = multipart.getCount(); j < n; j++) {
System.out.println("处理第" + j + "部分");
Part part = multipart.getBodyPart(j);//解包, 取出 MultiPart的各个部分, 每部分可能是邮件内容,
// 也可能是另一个小包裹(MultipPart)
// 判断此包裹内容是不是一个小包裹, 一般这一部分是 正文 Content-Type: multipart/alternative
if (part.getContent() instanceof Multipart) {
Multipart p = (Multipart) part.getContent();// 转成小包裹
System.out.println("小包裹中有" + p.getCount() + "部分");
// 列出小包裹中所有内容
for (int k = 0; k < p.getCount(); k++) {
System.out.println("小包裹内容:" + p.getBodyPart(k).getContent());
System.out.println("内容类型:"
+ p.getBodyPart(k).getContentType());
if(p.getBodyPart(k).getContentType().startsWith("text/plain")) {
// 处理文本正文
news.setBody(p.getBodyPart(k).getContent() + "");
} else {
// 处理 HTML 正文
news.setBody(p.getBodyPart(k).getContent() + "");
}
}
}
// Content-Disposition: attachment; filename="String2Java.jpg"
String disposition = part.getDisposition();// 处理是否为附件信息
if (disposition != null) {
System.out.println("发现附件: " + part.getFileName());
System.out.println("内容类型: " + part.getContentType());
System.out.println("附件内容:" + part.getContent());
java.io.InputStream in = part.getInputStream();// 打开附件的输入流
// 读取附件字节并存储到文件中
java.io.FileOutputStream out = new FileOutputStream(part.getFileName());
int data;
while((data = in.read()) != -1) {
out.write(data);
}
in.close();
out.close();
}
}
// }
// TODO newsDAO.save(news); // 将邮件所携带的信息作为新闻存储起来
// 6. 删除单个邮件, 标记一下邮件需要删除, 不会真正执行删除操作
// msg.setFlag(Flags.Flag.DELETED, true);
}
// 7. 关闭 Folder 会真正删除邮件, false 不删除
popFolder.close(true);
// 8. 关闭 store, 断开网络连接
store.close();
} catch (NoSuchProviderException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* @param args
*/
public static void main(String[] args) {
new POP3MailReceiverTest();
}
}
在前面的文章 JavaMail:在Web应用下完整接收、解析复杂邮件 中只是实现了基本的登录邮箱、查看邮件、下载附件的功能而已,就少了个在线编辑邮件正文并发送的功能,总是感觉不够意思,所以花点时间再写了几个 HTML 、JSP 文件把这个基本功能也添加进去。
下面的功能是为了和上篇文章中的邮件接收、解析功能合并的,具体的内容可以浏览 JavaMail:在Web应用下完整接收、解析复杂邮件 。如此一来,输入邮箱相关信息并登录邮箱,就能同时编辑邮件和浏览邮箱中的所有邮件以及下载附件了。
需求:
1、提供一个邮箱用户名、密码登录的页面,此时得有一个邮箱类型的下拉框可选,例如我们平常所用的邮箱有:163、126、qq、sina、sohu 等等;如下图:
2、填写了邮箱信息后弹出编辑纯文本邮件正文的页面(关于同时上传附件的功能再找个时间也实现一下,呵呵…),此时页面的下半部分则是直接连接 POP3 服务器获得邮箱中的所有邮件,如下图:
3、编辑好邮件的纯文本正文内容之后,则可点击“发送”按钮将邮件发送出去了。
注:在我的代码中,与 SMTP 服务器的连接、用户身份认证是在点击“发送”之后才引发的,这与上面的连接 POP3 服务器获取邮箱所有邮件的设计决定时机不同,看看代码就清楚了,如下图:
下面这张截图是乱码未解决之前在控制台打印出的结果,看一下下面的 ???跟上面框起来的正文,就是这里除了问题。
上面是启动 Tomcat 服务器之后的控制台,由于 setDebug(true) 所以会输出与 SMTP 服务器通信的过程中的交互信息,看样子是发送成功了。登录 [email protected] 邮箱查看邮件是否发送成功,如下图:
下面仍然是乱码未解决之前的截图:
嗯嗯,邮件时收到了,可是邮件中的中文乱码了,这个问题暂时还找不出原因,得再考虑考虑…
其实,乱码的原因在于下面的代码中 sendMails.jsp 文件标上背景颜色的一句代码,需要将 HTML 页面请求的编码显式地设置为 GBK 或 gb2312,即 request.setCharacterEncoding("gbk"); 这样子从 writeMails.html 页面获得的 subject 和 body 才不会以默认的编码方式传入进来。
下面是具体的代码实现,省略了上一篇文章中的所有内容,此外,代码中有好几处是默认写上了邮箱的用户名、密码,以及收件人的邮箱地址,下面有标出来了。
程序代码:
index.html
- <hmtl>
- <head>
- <title>蚂蚁-->邮箱登录页面</title>
- </head>
- <body>
- <form action="loginMailbox.jsp" method="post">
- 服务器:<select name="server">
- <option value="126.com">126.com</option>
- <option value="163.com">163.com</option>
- <option value="sina.com">sina.com</option>
- <option value="sohu.com">sohu.com</option>
- <option value="qq.com">qq.com</option>
- </select></br>
- 用户名:<input name="user" value="testhao" type="text"></br>
- 密码:  <input name="pwd" value="123456" type="password"></br>
- <input type="submit" value="登录">
- <input type="reset" value="重置"></br>
- </form>
- </body>
- </html>
loginMailbox.jsp
- <%@ page language="java"
- import="java.util.*,javax.mail.*"
- pageEncoding="gbk"%>
- <%
- // 初始化SMTP、POP3服务器的主机名
- String server = request.getParameter("server");
- String smtpServer = "smtp." + server;
- String pop3Server = "pop3." + server;
- // 邮箱用户名、密码
- String user = request.getParameter("user");
- String pwd = request.getParameter("pwd");
- // 用当前会话对象session保存发件人、用户名、密码
- session.setAttribute("from", user+"@"+server);
- session.setAttribute("user", user);
- session.setAttribute("pwd", pwd);
- // 创建SMTP服务器的属性文件并初始化
- Properties smtpProps = new Properties();
- smtpProps.setProperty("mail.transport.protocol", "smtp");
- smtpProps.setProperty("mail.smtp.host", smtpServer);
- smtpProps.setProperty("mail.smtp.auth", "true");
- // 根据属性文件获得javax.mail.Session对象,并保存之
- Session smtpSession = Session.getInstance(smtpProps);
- smtpSession.setDebug(true);
- session.setAttribute("smtpSession", smtpSession);
- // 创建POP3服务器的属性文件并初始化
- Properties pop3Props = new Properties();
- pop3Props.setProperty("mail.store.protocol", "pop3");
- pop3Props.setProperty("mail.pop3.host", pop3Server);
- // 根据属性文件获得javax.mail.Session对象,并保存之
- Session pop3Session = Session.getInstance(pop3Props);
- //pop3Session.setDebug(true);//这里如果为true的话控制台输出太多了
- session.setAttribute("pop3Session", pop3Session);
- %>
- <frameset rows="30%,*">
- <frame src="/JavaMail/WriteMails.html?user=<%=user%>&pwd=<%=pwd%>" scrolling="yes">
- <frame src="/JavaMail/POP3Login.jsp?user=<%=user%>&pwd=<%=pwd%>" scrolling="yes">
- </frameset>
WriteMails.html
- <html>
- <body bgcolor="#d0d0d0" >
- <form action="sendMails.jsp" method="post">
- 收件人:<input name="to" value="[email protected]" type="text"></br>
- 主题:  <input name="subject" value="我的主题!" type="text"></br>
- 正文:</br>
- <textarea name="body" rows="3" cols="40">我是正文部分!!!
- </textarea></br>
- <input type="submit" value="发送">
- <input type="reset" value="重置"></br>
- </form>
- </body>
- </html>
sendMails.jsp
- <%@ page
- import="javax.mail.*,java.util.Properties,javax.mail.internet.*"
- contentType="text/html;charset=gbk" %>
- <%
- // 从会话对象session中获得已保存的用户名、密码、发件人
- String user = (String)session.getAttribute("user");
- String pwd = (String)session.getAttribute("pwd");
- String from = (String)session.getAttribute("from");
- // 获取HTML页面请求中的收件人、主题、正文
- request.setCharacterEncoding("gbk");
- String to = request.getParameter("to");
- String subject = request.getParameter("subject");
- String body = request.getParameter("body");
- // 从会话对象session中获得javax.mail.Session对象,创建Message对象
- Session smtpSession = (Session)session.getAttribute("smtpSession");
- Message mail = new MimeMessage(smtpSession);
- // 设置Message对象中的收件人、发件人、主题、正文
- mail.setRecipient(Message.RecipientType.TO, new InternetAddress(to));
- mail.setFrom(new InternetAddress(from));
- mail.setSubject(subject);
- // 将纯文本的正文放到Multipart对象中,以避免中文乱码
- MimeMultipart allParts = new MimeMultipart("alternative");
- MimeBodyPart textBody = new MimeBodyPart();
- textBody.setContent(body, "text/html;charset=gbk");
- allParts.addBodyPart(textBody);
- mail.setContent(allParts);
- mail.saveChanges(); // 保存修改后的Message对象
- try{
- // 获得Transport对象并连接SMTP服务器,由于属性文件中
- // 已设置了SMTP服务器的主机名,此处可用null省略之
- Transport transport = smtpSession.getTransport();
- transport.connect(null, user, pwd);
- // 发送邮件
- transport.sendMessage(mail, mail.getRecipients(Message.RecipientType.TO)); transport.close();
- }catch(Exception e){
- e.printStackTrace();
- }
- out.println("邮件发送成功!!!");
- System.out.println("邮件发送成功!!!");
- %>
实际上,上面在设置邮件纯文本正文时,完全可以不使用 MimeMultipart 、MimeBodyPart 等对象,直接用 mail.setContent(body, "text/plain;charset=gbk"); 指定 MIME 类型和字符集编码即可。不过我是为了以后要实现上传附件的功能而保留这样的代码的。
小结:
1、只是很简陋地实现了发送纯文本邮件正文功能,上传添加附件的功能有待实现;
2、中文乱码了,得找出问题所在;已解决了;
3、在这几篇文章中,都感觉到自己对于一些代码文件的命名很乱,自己也找不着头绪,%>_<% ,这个要引起注意,因为也为此耗了些许时间;
4、程序的逻辑结构很糟糕,自己感觉是拼凑起来的,因为事先总是不善于在纸上有了大概构思、设计之后才真正动手,经验严重不足。
我的相关文章:
JavaMail:在Web应用下完整接收、解析复杂邮件
JavaMail:邮件发送以及sina、163、QQ服务器不同的解析结果(附图)
JavaMail:创建内含附件、图文并茂的邮件
本文出自 “蚂蚁” 博客,请务必保留此出处http://haolloyin.blog.51cto.com/1177454/361200