Java网络编程之JavaMail发送邮件和接受邮件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
|
package whut.mailsender;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Address;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.Multipart;
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 whut.mailreceiver.MailAuthenticator;
public class SimpleSMTPSender
{
public static void main(String[]
args) {
try {
Properties
props= new Properties();
//传递一个邮件服务器名smtp.163.com
//mail.smtp.host代表是发信人所在的邮箱服务器名
props.put( "mail.smtp.host" , "smtp.163.com" );
props.put( "mail.smtp.auth" , true );
//对于发送邮件,只需要保证发送人所在的邮件服务器正确打开就可以了
//收信人的邮箱可以是任意地址,如@163.com,@qq.com,@126.com
//创建一个程序与邮件服务器的通信
Session
mailConnection=Session.getInstance(props, null );
Message
msg= new MimeMessage(mailConnection);
//创建一个要输入用户名和指令的
//Session
mailConnection=Session.getInstance(props,new MailAuthenticator());
//设置发送人和接受人
Address
sender= new InternetAddress( "yyyy@163.com" );
Address
receiver= new InternetAddress( "xxx@163.com" );
/*
*
群发邮件的方法
*
StringBuffer buffer=new StringBuffer();
*
buffer.append("11@163.com,")
*
buffer.append("22@163.com")
*
String all=buffer.toString();
*
Address[] allre=InternetAddress.parse(all);
*
msg.setRecipient(Message.RecipientType.TO, allre);
*/
msg.setFrom(sender);
msg.setRecipient(Message.RecipientType.TO,
receiver);
msg.setSubject( "You
must comply" );
//msg.setContent("Hello",
"text/plain");
//下面是模拟发送带附件的邮件
//新建一个MimeMultipart对象用来存放多个BodyPart对象
Multipart
mtp= new MimeMultipart();
//------设置信件文本内容------
//新建一个存放信件内容的BodyPart对象
BodyPart
mdp= new MimeBodyPart();
//给BodyPart对象设置内容和格式/编码方式
mdp.setContent( "hello" , "text/html;charset=gb2312" );
//将含有信件内容的BodyPart加入到MimeMultipart对象中
mtp.addBodyPart(mdp);
//设置信件的附件(用本地机上的文件作为附件)
mdp= new MimeBodyPart();
FileDataSource
fds= new FileDataSource( "f:/webservice.doc" );
DataHandler
dh= new DataHandler(fds);
mdp.setFileName( "webservice.doc" ); //可以和原文件名不一致
mdp.setDataHandler(dh);
mtp.addBodyPart(mdp);
//把mtp作为消息对象的内容
msg.setContent(mtp);
//以上为发送带附件的方式
//先进行存储邮件
msg.saveChanges();
Transport
trans=mailConnection.getTransport( "smtp" );
String
username= "yyyy@163.com" ;
String
pw= "" ;
//邮件服务器名,用户名,密码
trans.connect( "smtp.163.com" ,
username, pw);
trans.sendMessage(msg,
msg.getAllRecipients());
trans.close();
} catch (Exception
e)
{
System.err.println(e);
}
finally {
System.exit( 0 );
}
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
|
package whut.mailreceiver;
import java.io.InputStreamReader;
import java.io.Reader;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Enumeration;
import java.util.Properties;
import javax.mail.Flags;
import javax.mail.Folder;
import javax.mail.Header;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeUtility;
//利用POP3来读取邮件
//主要用来检测消息Message的基本信息,如发送者,收信者,时间
public class POP3Client
{
public static void main(String[]
args) {
Properties
props = System.getProperties();
String
host = "pop3.163.com" ;
String
username = "22222222@163.com" ;
String
password = "312313121" ;
String
provider = "pop3" ;
try {
//
连接到POP3服务器
Session
ss = Session.getDefaultInstance(props, null );
//
向回话"请求"一个某种提供者的存储库,是一个POP3提供者
Store
store = ss.getStore(provider);
//
连接存储库,从而可以打开存储库中的文件夹,此时是面向IMAP的
store.connect(host,
username, password);
//
打开文件夹,此时是关闭的,只能对其进行删除或重命名,无法获取关闭文件夹的信息
//
从存储库的默认文件夹INBOX中读取邮件
Folder
inbox = store.getFolder( "INBOX" );
if (inbox
== null )
{
System.out.println( "NO
INBOX" );
System.exit( 1 );
}
//
打开文件夹,读取信息
inbox.open(Folder.READ_ONLY);
System.out.println( "TOTAL
EMAIL:" +
inbox.getMessageCount());
//
获取邮件服务器中的邮件
Message[]
messages = inbox.getMessages();
for ( int i
= 0 ;
i < messages.length; i++) {
System.out.println( "------------Message--" +
(i + 1 )
+ "------------" );
//
解析地址为字符串
String
from = InternetAddress.toString(messages[i].getFrom());
if (from
!= null )
{
String
cin = getChineseFrom(from);
System.out.println( "From:" +
cin);
}
String
replyTo = InternetAddress.toString(messages[i]
.getReplyTo());
if (replyTo
!= null )
{
String
rest = getChineseFrom(replyTo);
System.out.println( "Reply
To" +
rest);
}
String
to = InternetAddress.toString(messages[i]
.getRecipients(Message.RecipientType.TO));
if (to
!= null )
{
String
tos = getChineseFrom(to);
System.out.println( "To:" +
tos);
}
String
subject = messages[i].getSubject();
if (subject
!= null )
System.out.println( "Subject:" +
subject);
SimpleDateFormat
sdf = new SimpleDateFormat(
"yyyy-MM-dd
HH:mm:ss" );
Date
sent = messages[i].getSentDate();
if (sent
!= null )
System.out.println( "Sent
Date:" +
sdf.format(sent));
Date
ress = messages[i].getReceivedDate();
if (ress
!= null )
System.out.println( "Receive
Date:" +
sdf.format(ress));
//
显示消息的所有首部信息
//
Enumeration headers=messages[i].getAllHeaders();
//
while(headers.hasMoreElements())
//
{
//
Header h=(Header)headers.nextElement();
//
String res=h.getName();
//
String val=h.getValue();
//
System.out.println(res+":"+val);
//
}
//
System.out.println();
//
读取消息主题部分
//
Object content=messages[i].getContent();
//
System.out.println(content);
//
根据指定的编码格式读出内容
//
Reader read=new
//
InputStreamReader(messages[i].getInputStream());
//
int a=0;
//
while((a=read.read())!=-1)
//
{
//
System.out.print((char)a);
//
}
//
获取该消息的类型
//
String type=messages[i].getContentType();
//
String
//
sender=InternetAddress.toString(messages[i].getFrom());
//
System.out.println("Sender:"+sender);
//
System.out.println("Content-type:"+type);
}
//
关闭连接,但不删除服务器上的消息
//
false代表不是删除
inbox.close( false );
store.close();
} catch (Exception
e) {
System.err.println(e);
}
}
//
解决中文乱码问题
public static String
getChineseFrom(String res) {
String
from = res;
try {
if (from.startsWith( "=?GB" )
|| from.startsWith( "=?gb" )
||
from.startsWith( "=?UTF" ))
{
from
= MimeUtility.decodeText(from);
} else {
from
= new String(from.getBytes( "ISO8859_1" ), "GBK" );
}
} catch (Exception
e) {
e.printStackTrace();
}
return from;
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
package whut.mailreceiver;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
//口令验证
public class MailAuthenticator extends Authenticator
{
private JDialog
passwordDialog= new JDialog( new JFrame(), true );
private JLabel
mainLabel= new JLabel( "Please
enter your user name and password:" );
private JLabel
userLabel= new JLabel( "User
name:" );
private JLabel
passwordLabel= new JLabel( "Password:" );
private JTextField
usernameField= new JTextField( 20 );
private JPasswordField
passwordField= new JPasswordField( 20 );
private JButton
okButton= new JButton( "OK" );
public MailAuthenticator()
{
this ( "" );
}
public MailAuthenticator(String
username)
{
Container
pane=passwordDialog.getContentPane();
pane.setLayout( new GridLayout( 4 , 1 ));
pane.add(mainLabel);
JPanel
p2= new JPanel();
p2.add(userLabel);
p2.add(usernameField);
pane.add(p2);
JPanel
p3= new JPanel();
p3.add(passwordLabel);
p3.add(passwordField);
pane.add(p3);
JPanel
p4= new JPanel();
p4.add(okButton);
pane.add(p4);
passwordDialog.setSize( 400 , 200 );
ActionListener
al= new HideDialog();
okButton.addActionListener(al);
usernameField.addActionListener(al);
passwordField.addActionListener(al);
}
class HideDialog implements ActionListener
{
public void actionPerformed(ActionEvent
e)
{
passwordDialog.hide();
}
}
@Override
protected PasswordAuthentication
getPasswordAuthentication() {
//
TODO Auto-generated method stub
passwordDialog.show();
//getPassword是返回的字符数组
String
username=usernameField.getText();
String
password= new String(passwordField.getPassword());
passwordField.setText( "" );
return new PasswordAuthentication(username,password);
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
package whut.mailsender;
import javax.mail.Part;
import javax.mail.internet.MimeUtility;
import sun.misc.BASE64Decoder;
public class StringUtil
{
//发信人,收信人,回执人邮件中有中文处理乱码,res为获取的地址
//http默认的编码方式为ISO8859_1
//对含有中文的发送地址,使用MimeUtility.decodeTex方法
//对其他则把地址从ISO8859_1编码转换成gbk编码
public static String
getChineseFrom(String res) {
String
from = res;
try {
if (from.startsWith( "=?GB" )
|| from.startsWith( "=?gb" )
||
from.startsWith( "=?UTF" ))
{
from
= MimeUtility.decodeText(from);
} else {
from
= new String(from.getBytes( "ISO8859_1" ), "GBK" );
}
} catch (Exception
e) {
e.printStackTrace();
}
return from;
}
//转换为GBK编码
public static String
toChinese(String strvalue) {
try {
if (strvalue
== null )
return null ;
else {
strvalue
= new String(strvalue.getBytes( "ISO8859_1" ), "GBK" );
return strvalue;
}
} catch (Exception
e) {
return null ;
}
}
//接收邮件时,获取某个邮件的中文附件名,出现乱码
//对于用base64编码过的中文,则采用base64解码,
//否则对附件名进行ISO8859_1到gbk的编码转换
public static String
getFileChinese(Part part) throws Exception
{
String
temp = part.getFileName(); //
part为Part实例
if ((temp.startsWith( "=?GBK?" )
&& temp.endsWith( "?=" ))
||
(temp.startsWith( "=?gbk?b?" )
&& temp.endsWith( "?=" )))
{
temp
= StringUtil.getFromBASE64(temp.substring( 8 ,
temp.indexOf( "?=" )
- 1 ));
} else {
temp
= StringUtil.toChinese(temp);
}
return temp;
}
public static String
getFromBASE64(String s) {
if (s
== null )
return null ;
BASE64Decoder
decoder = new BASE64Decoder();
try {
byte []
b = decoder.decodeBuffer(s);
return new String(b);
} catch (Exception
e) {
return null ;
}
}
}
|