java mail cc,JavaMail的使用

Javamail是用来发送邮件的一个常用框架,我以前用过这个框架写过一个发送邮件的demo,以下内容是我以前整理的。

1javamail的使用

我是使用mavne的,所以引用了如下的依赖,如果不引入第二个依赖的话会报javamail的一个log类找不到

javax.mail

javax.mail-api

1.5.0

javadoc

com.sun.mail

javax.mail

1.5.0

2javamail中的常用类

(1) javax.mail.Properties类

JavaMail需要Properties来创建一个session对象。它将寻找字符串"mail.smtp.host",属性值就是发送邮件的主机.

用法:

Properties props = new Properties ();

props.put("mail.smtp.host", "smtp.163.com");//可以换上你的smtp主机名。

(2) javax.mail.Session类

这个Session类代表JavaMail 中的一个邮件session. 每一个基于 JavaMail的应用程序至少有一个session但是可以有任意多的session。 在这个例子中, Session对象需要知道用来处理邮件的SMTP 服务器。

用法:

Session sendMailSession;

sendMailSession = Session.getInstance(props, null);

(3) javax.mail.Transport类

邮件是既可以被发送也可以被受到。JavaMail使用了两个不同的类来完成这两个功能:Transport 和Store. Transport 是用来发送信息的,而Store用来收信。对于这的教程我们只需要用到Transport对象。

用法:

Transport transport;

transport = sendMailSession.getTransport("smtp");

用JavaMail Session对象的getTransport 方法来初始化Transport。传过去的字符串申明了对象所要使用的协议,如"smtp"。这将为我们省了很多时间。因为JavaMail以境内置了很多协议的实现方法。

注意: JavaMail并不是绝对支持每一个协议,目前支持IMAP、 SMTP和 POP3.

(4) javax.mail.MimeMessage类

Message对象将存储我们实际发送的电子邮件信息,Message对象被作为一个MimeMessage对象来创建并且需要知道应当选择哪一个JavaMail session。

用法:

Message newMessage = new MimeMessage(sendMailSession);

(5) javax.mail.InternetAddress类

一旦您创建了 Session 和 Message,并将内容填入消息后,就可以用Address确定信件地址了。和 Message 一样,Address 也是个抽象类。您用的是Javax.mail.internet.InternetAddress 类.

用法:

InternetAddress from=new InternetAddress("xxf@cafe.com");

(6) javax.mail.Store类

Store类实现特定邮件协议上的读、写、监视、查找等操作。通过Javax.mail.Store类可以访问Javax.mail.Folder类。

用法:

Store store=s.getSorte("pop3");//s为一个邮件会话

store.connect(popserver,username,password);//通过你提供的pop地址,用户名和密码登录你的邮箱

(7) javax.mail.Folder类

Folder类用于分级组织邮件,并提供照Javax.mail.Message格式访问email的能力。

用法:

Folder folder=store.getFolder("INBOX");

folder.open(Folder.READ_ONLY);

(8) javax.mail.Internet.MimeMultpart

一般保存电子邮件内容的容器是Multipart抽象类,它定义了增加和删除及获得电子邮件不同部分内容的方法.由于Multipart是抽象类,我们必须为它使用一个具体的子类,JavaMail API提供javax.mail.Internet.MimeMultpart类来使用MimeMessage对象.

用法:

MimeMultipart multipart=new MimeMultipart();

注:我们使用MimeMultipart对象的一个方法是addBodyPart(),它在我们的电子邮件内容里添加BodyPart(BodyPart类在下面紧接着要介绍)对象.消息可以有很多部分,一个BodyPart可以代表一个部分.

(9) javax.mail.Internet.MimeBodyPart类

MimeBodyPart是BodyPart具体用于mimeMessage的一个子类.

MimeBodyPart对象代表一个MimeMessage对象内容的一部分.每个MimeBodyPart被认为有两部分:

⊙一个MIME类型

⊙匹配这个类型的内容

用法:

MimeBodyPart mdp=new MimeBodyPart();

String text="Hello JavaMail!";

mdp.setContent(text,"text/plain");//定义MIME类型为text/plain,并设置MimeBodyPart的内容.

(10) javax.activation.DataHandler类(包含在JAF中)

JavaMail API不限制信息只为文本,任何形式的信息都可能作茧自缚MimeMessage的一部分.除了文本信息,作为文件附件包含在电子邮件信息的一部分是很普遍的.JavaMail API通过使用DataHandler对象,提供一个允许我们包含非文本BodyPart对象的简便方法.

用法:

DataHandler dh=new DataHandler(text,type);

mdp.setDatahandler(dh);//mdp是一个MimeBodyPart对象

(11) javax.activation.FileDataSource类(包含在JAF中)

一个FileDataSource对象可以表示本地文件和服务器可以直接访问的资源.一个本地文件可以通过创建一个新的MimeBodyPart对象附在一个mimeMessage对象上.

用法:

MimeMultipart mm=new MimeMultipart();

MimeBodyPart mdp=new MimeBodyPart();

FileDataSource fds=new FileDataSource("c:/exam.txt");

mdp.setDataHandler(new DataHandler(fds)); //设置数据源

mm.addBodyPart(mdp); //为当前消息MimeMultipart对象增加MimeBodyPart

(12) javax.activation.URLDataSource类(包含在JAF中)

远程资源,URL不会指向它们,由一个URLDataSource对象表示.一个远程资源可以通过创建一个新mimeBodyPart对象附在一个mimeMessage对象上(同FileDataSource差不多).

用法:

与FileDataSource唯一不同的是数据源的设置:

URLDataSource uds=new URLDataSource("http://www.csdn.net/logo.gif");

其中几个重要的类解释用法如下:

Session类定义了一个基本的邮件会话,所有的其他类都是由这个session才得意生效的,Session对象用java.util.Properties对象获取信息,如邮件服务器,用户名,密码及整个应用程序中共享的其他信息.类的构造器是此有的,private.它能用getDefaultInstance()方法来共享.获取Session对象的方方法如下:

Properties props = new Properties();

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

Null参数都是Authenticator对象,在这里没有使用.

对于大多数情况,共享的session已经足够用了.

Message消息类,在获得了Session对象后,就可以继续创建要发送的消息.因为Message是个抽象类,您必须用一个子类,多数情况下为java.mail.internet.MimeMessage.这个能理解成MIME类型和头的电子邮件消息.正如不同的RFC中定义的,虽然在某些头部域非ASCII字符也能被编译,但是Message头只能被限制用US-ASCII字符.要创建一个Message请将Session对象传递给MimeMessage的构造器.

MimeMessage message = newMimeMessage(session);

一旦获得消息,就可以设置各个部分了.最基本的就是setContent()方法,例如/

message.setContent( “ Hello ” , ” text/plain ” );

如果知道在实用MimeMessage,而且消息是纯文本格式,就可以用setText()方法,它只需要代表实际内容的参数.(Mime类型缺省为text/plain)

用setSubject()方法设置subject(主题);

message.setSubject( “ 主题 ” );

Address地址类,和Message一样也是一个抽象类,一旦创建了Session和Message并将内容填入消息后,就可以用Address确定信件的地址了,用javax.mail.internet.

InternetAddress类.若创建的地址只包含电子邮件地址,只要传递电子邮件地址给构造器就可以了.例如:Address address = new InternetAddress( “ it5719@163.com ” );

若希望名字挨着电子邮件现实,就可以把它传递给构造器,如下:

Address address = new InternetAddress( “ it5719@163.com ” , ” 我心依旧 ” );

需要为消息的from域和to域创建地址对象,除非邮件服务器阻止,没有什么能阻止你发送一段看上去是任何人的消息了呵呵.一旦创建address将他们域消息连接方法有两种,如要要识别发件人的就可以用setFrom()和setReplyTo方法.然后message.setFrom(address);

需要实用多个from地址的就用addFrom()方法.例子如下:

Address[] address = ,.,. ;    message.addFrom(address);

若要识别消息recipient收件人,就要实用addRecipient()方法了.例如:

message.addRecipient(type,address)

Authenticator与java.net类一样,JavaMailAPI也可以利用Authentcator通过用户名密码访问受保护的资源.对于JavaMail来说,这些资源就是邮件服务器,Authentcator类在javax.mail包中.要使用Authenticator,首先创建一个抽象的子类,并从

GetPasswordAuthentication方法中返回passwordAuthentication实例,创建完成后,您必须向session注册Authenticator,然后在需要认证的时候会通知它,其实说白了就是把配置的用户名和密码返回给调用它的程序.例如:

Properties props = new properties();

Authenticator auth = new MailAuthenticator()//接口声明,创建自己新类的实例.

Session session = Session.getDefauItInstance(props,auth);

Transport消息发送传输类,这个类用协议指定的语言发送消息,通常是SMTP,它是抽象类,它的工作方式与Session有些类似,尽调用静态方法send()方法,就OK了.例如:

Transport.send(message);

或者也可以从针对协议的会话中获取一个特定的实例,传递用户名和密码.发送消息,然后关闭连接,例如:

message.saveChanges();

transport transport = session.getTreansport( “ smtp ” );//指定的协议

transport.connect(host,username,password);

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

transport.close();

如果要观察传到邮件服务器上的邮件命令,请用session.setDubug(true)设置调试标志.

Store和folder用session获取消息,与发送消息开始很相似,但是在session得到后,很可能实用用户名和密码或实用Authenticator连接到一个Store.类似于Transport,也是一样要告诉store用什么协议.例如

Store store = session.getStore( “ pop3 ” );

Store.connect(host,username,password);

连接到Store之后,接下来,获得一个folder,必须打开它就可以读取里边的消息了.

Folder folder = store.getFolder("INBOX");

folder.open(Folder.READ_ONLY);

Message[] message = folder.getMessages();

POP3唯一可用的文件夹就是INBOX,如果实用IMAP,还可以用其他的文件夹.

当读到了具体的message以后,就可以用getContent来获取内容,或者用writeTo()将内容写入流,getContent()方法只能得到消息内容,而writeTo()的输出却包含消息头.

System.out.println(((MimeMessage)message).getConntent());

一旦读取完毕邮件,要关闭store和folder的连接.

folder.colse(boolean);

store.colse();

传递给folder的close()方法的boolean参数表示是否清楚已删除的消息从而更新folder.

下面是一个网页版的javamail例子

撰写登录界面程序如下:

----------------------------------------------------------------------

撰写邮件
收信人地址:
主题:
信件类型

Text

Html

附件1(自定义):

(输入文本信息)

附件2(本地):
附件3(远程):

(输入URL)

处理邮件的JSP程序如下:

----------------------------------------------------------------------------------------

发送成功

try{

String tto=request.getParameter("to");

String ttitle=request.getParameter("title");

String emailtype=request.getParameter("emailtype");//获取email类型

String tcontent=request.getParameter("content");

String tfj1=request.getParameter("fj1");

String tfj2=request.getParameter("fj2");

String tfj3=request.getParameter("fj3");

Properties props=new Properties();

props.put("mail.smtp.host","127.0.0.1");

props.put("mail.smtp.auth","true");

Session s=Session.getInstance(props);

s.setDebug(true);

MimeMessage message=new MimeMessage(s);

//给消息对象设置发件人/收件人/主题/发信时间

InternetAddress from=new InternetAddress("xxf@cafe.com");

message.setFrom(from);

InternetAddress to=new InternetAddress(tto);

message.setRecipient(Message.RecipientType.TO,to);

message.setSubject(ttitle);

message.setSentDate(new Date());

Multipart mm=new MimeMultipart();//新建一个MimeMultipart对象用来存放多个BodyPart对象

//设置信件文本内容

BodyPart mdp=new MimeBodyPart();//新建一个存放信件内容的BodyPart对象

mdp.setContent(tcontent,emailtype+";charset=gb2312");//给BodyPart对象设置内容和格式/编码方式

mm.addBodyPart(mdp);//将含有信件内容的BodyPart加入到MimeMultipart对象中

//设置信件的附件1(自定义附件:直接将所设文本内容加到自定义文件中作为附件发送)

mdp=new MimeBodyPart();//新建一个存放附件的BodyPart

DataHandler dh=new DataHandler(tfj1,"text/plain;charset=gb2312");

//新建一个DataHandler对象,并设置其内容和格式/编码方式

mdp.setFileName("text.txt");//加上这句将作为附件发送,否则将作为信件的文本内容

mdp.setDataHandler(dh);//给BodyPart对象设置内容为dh

mm.addBodyPart(mdp);//将含有附件的BodyPart加入到MimeMultipart对象中

//设置信件的附件2(用本地上的文件作为附件)

mdp=new MimeBodyPart();

FileDataSource fds=new FileDataSource(tfj2);

dh=new DataHandler(fds);

int ddd=tfj2.lastIndexOf("\\");

String fname=tfj2.substring(ddd);//提取文件名

String ffname=new String(fname.getBytes("gb2312"),"ISO8859-1");//处理文件名是中文的情况

mdp.setFileName(ffname);//可以和原文件名不一致,但最好一样

mdp.setDataHandler(dh);

mm.addBodyPart(mdp);

//设置信件的附件3(用远程文件作为附件)

mdp=new MimeBodyPart();

URL urlfj=new URL(tfj3);

URLDataSource ur=new URLDataSource(urlfj);

//注:这里用的参数只能为URL对象,不能为URL字串,在前面类介绍时有误(请谅解),这里纠正一下.

dh=new DataHandler(ur);

int ttt=tfj3.lastIndexOf("/");

String urlname=tfj3.substring(ttt);

//String urlfname=new String(urlname.getBytes("gb2312"),"ISO8859-1");//不知怎么回事,这里不能处理中文问题

mdp.setFileName(urlname);

mdp.setDataHandler(dh);

mm.addBodyPart(mdp);

message.setContent(mm);//把mm作为消息对象的内容

message.saveChanges();

Transport transport=s.getTransport("smtp");

transport.connect("127.0.0.1","xxf","coffee");

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

transport.close();

%>

}catch(MessagingException e){

out.println(e.toString());

}

%>

先建一个html登录表单(recmain.jsp)

--------------------------------------------------------------------------------------------------------------

邮箱登录
邮箱登录
用户名:
密码:
POPServer:

进入后的邮件列表代码(hodrec.jsp)

--------------------------------------------------------------------------------------------------------

收件箱

String popserver=request.getParameter("popserver");

String username=request.getParameter("username");

String password=request.getParameter("password");

%>

Store store=null;

Folder folder=null;

Properties props =new Properties();

Session s=Session.getInstance(props);

store=s.getStore("pop3");

store.connect(popserver, username, password);

folder = store.getDefaultFolder();

folder = folder.getFolder("INBOX");

folder.open(Folder.READ_ONLY);

Message[] msgs = folder.getMessages();

for (int msgNum = 0; msgNum < msgs.length; msgNum++)

{

InternetAddress[] from=(InternetAddress[])msgs[msgNum].getFrom();

InternetAddress[] to=(InternetAddress[])msgs[msgNum].getRecipients(Message.RecipientType.TO);

%>

-----------------------------------------------------------------------------------------------

发件人:,时间:,主题:,大小:字节

内容:

}

folder.close(false);

store.close();

%>

下面是一个java发邮件的代码

public class JavaMailTest {

//要发送Mail地址

private String mailTo = null;

//Mail发送的起始地址

private String mailFrom = null;

//SMTP主机地址

private String smtpHost = null;

//是否采用调试方式

private boolean debug = false;

private String messageBasePath = null;

//Mail主题

private String subject;

//Mail内容

private String msgContent;

private Vector attachedFileList;

private String mailAccount = null;

private String mailPass = null;

private String messageContentMimeType ="text/html; charset=gb2312";

private String mailbccTo = null;

private String mailccTo = null;

private void fillMail(Session session,MimeMessage msg) throws IOException, MessagingException {

String fileName = null;

Multipart mPart = new MimeMultipart();

if (mailFrom != null) {

msg.setFrom(new InternetAddress(mailFrom));

System.out.println("发送人Mail地址:"+mailFrom);

} else {

System.out.println("没有指定发送人邮件地址!");

return;

}

if (mailTo != null) {

InternetAddress[] address = InternetAddress.parse(mailTo);

msg.setRecipients(Message.RecipientType.TO, address);

System.out.println("收件人Mail地址:"+mailTo);

} else {

System.out.println("没有指定收件人邮件地址!");

return;

}

if (mailccTo != null) {

InternetAddress[] ccaddress = InternetAddress.parse(mailccTo);

System.out.println("CCMail地址:"+mailccTo);

msg.setRecipients(Message.RecipientType.CC, ccaddress);

}

if (mailbccTo != null) {

InternetAddress[] bccaddress = InternetAddress.parse(mailbccTo);

System.out.println("BCCMail地址:"+mailbccTo);

msg.setRecipients(Message.RecipientType.BCC, bccaddress);

}

msg.setSubject(subject);

InternetAddress[] replyAddress = { new InternetAddress(mailFrom)};

msg.setReplyTo(replyAddress);

// create and fill the first message part

MimeBodyPart mBodyContent = new MimeBodyPart();

if (msgContent != null)

mBodyContent.setContent(msgContent, messageContentMimeType);

else

mBodyContent.setContent("", messageContentMimeType);

mPart.addBodyPart(mBodyContent);

// attach the file to the message

if (attachedFileList != null) {

for (Enumeration fileList = attachedFileList.elements(); fileList.hasMoreElements();) {

fileName = (String) fileList.nextElement();

MimeBodyPart mBodyPart = new MimeBodyPart();

// attach the file to the message

FileDataSource fds = new FileDataSource(messageBasePath + fileName);

System.out.println("Mail发送的附件为:"+messageBasePath + fileName);

mBodyPart.setDataHandler(new DataHandler(fds));

mBodyPart.setFileName(fileName);

mPart.addBodyPart(mBodyPart);

}

}

msg.setContent(mPart);

msg.setSentDate(new Date());

}

/**

* 发送e_mail,返回类型为int

* 当返回值为0时,说明邮件发送成功

* 当返回值为3时,说明邮件发送失败

*/

public int sendMail() throws IOException, MessagingException {

int loopCount;

Properties props = System.getProperties();

props.put("mail.smtp.host", smtpHost);

props.put("mail.smtp.auth", "true");

MailAuthenticator auth = new MailAuthenticator();

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

session.setDebug(debug);

MimeMessage msg = new MimeMessage(session);

Transport trans = null;

try {

fillMail(session,msg);

// send the message

trans = session.getTransport("smtp");

try {

trans.connect(smtpHost, MailAuthenticator.HUAWEI_MAIL_USER, MailAuthenticator.HUAWEI_MAIL_PASSWORD);//, HUAWEI_MAIL_PASSWORD);

} catch (AuthenticationFailedException e) {

e.printStackTrace();

System.out.println("连接邮件服务器错误:");

return 3;

} catch (MessagingException e) {

System.out.println("连接邮件服务器错误:");

return 3;

}

trans.send(msg);

trans.close();

} catch (MessagingException mex) {

System.out.println("发送邮件失败:");

mex.printStackTrace();

Exception ex = null;

if ((ex = mex.getNextException()) != null) {

System.out.println(ex.toString());

ex.printStackTrace();

}

return 3;

} finally {

try {

if (trans != null && trans.isConnected())

trans.close();

} catch (Exception e) {

System.out.println(e.toString());

}

}

System.out.println("发送邮件成功!");

return 0;

}

public void setAttachedFileList(java.util.Vector filelist)

{

attachedFileList = filelist;

}

public void setDebug(boolean debugFlag)

{

debug=debugFlag;

}

public void setMailAccount(String strAccount) {

mailAccount = strAccount;

}

public void setMailbccTo(String bccto) {

mailbccTo = bccto;

}

public void setMailccTo(String ccto) {

mailccTo = ccto;

}

public void setMailFrom(String from)

{

mailFrom=from;

}

public void setMailPass(String strMailPass) {

mailPass = strMailPass;

}

public void setMailTo(String to)

{

mailTo=to;

}

public void setMessageBasePath(String basePath)

{

messageBasePath=basePath;

}

public void setMessageContentMimeType(String mimeType)

{

messageContentMimeType = mimeType;

}

public void setMsgContent(String content)

{

msgContent=content;

}

public void setSMTPHost(String host)

{

smtpHost=host;

}

public void setSubject(String sub)

{

subject=sub;

}

public static void main(String[] argv) throws Exception

{

JavaMailTest sm = new JavaMailTest();

sm.setSMTPHost("smtp.163.com");

sm.setMailFrom("XXX@163.com");

sm.setMailTo("XXX@qq.com");

sm.setMsgContent("test");

sm.setSubject("test");

sm.sendMail();

}

}

class MailAuthenticator extends Authenticator

{

//******************************

//由于发送邮件的地方比较多,

//下面统一定义用户名,口令.

//******************************

public static String HUAWEI_MAIL_USER = "XXX@163.com";

public static String HUAWEI_MAIL_PASSWORD = "XXX";

public MailAuthenticator()

{

}

protected PasswordAuthentication getPasswordAuthentication()

{

return new PasswordAuthentication(HUAWEI_MAIL_USER, HUAWEI_MAIL_PASSWORD);

}

}

总结一下,javamail可以实现发送邮件的功能,要熟悉其中的几个核心的类。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在JavaMail使用自签名证书进行签名,您需要执行以下步骤: 1.生成自签名证书。您可以使用Java的keytool工具生成自签名证书。例如,以下命令可以生成一个名为“mycert”的自签名证书: ``` keytool -genkeypair -alias mycert -keyalg RSA -keysize 2048 -storetype PKCS12 -keystore keystore.p12 -validity 3650 ``` 2.将自签名证书添加到Java密钥库中。您可以使用以下命令将自签名证书添加到名为“mykeystore”的Java密钥库中: ``` keytool -importkeystore -srckeystore keystore.p12 -srcstoretype PKCS12 -destkeystore mykeystore -deststoretype JKS -deststorepass changeit ``` 3.在JavaMail使用自签名证书进行签名。以下是一个使用自签名证书签名邮件的示例代码: ```java import javax.mail.*; import javax.mail.internet.*; import java.security.Security; import java.util.Properties; public class Mail { public static void main(String[] args) throws Exception { // 设置 Java 安全属性 Security.setProperty("ssl.SocketFactory.provider", "com.sun.net.ssl.internal.ssl.Provider"); Security.setProperty("ssl.SocketFactory.factoryClass", "javax.net.ssl.SSLSocketFactory"); // 创建 JavaMail 会话 Properties props = new Properties(); props.put("mail.smtp.host", "smtp.gmail.com"); props.put("mail.smtp.auth", "true"); props.put("mail.smtp.port", "465"); props.put("mail.smtp.socketFactory.port", "465"); props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); Session session = Session.getInstance(props, new javax.mail.Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication("username", "password"); } }); // 创建邮件消息 MimeMessage message = new MimeMessage(session); message.setFrom(new InternetAddress("from@example.com")); message.setRecipient(Message.RecipientType.TO, new InternetAddress("to@example.com")); message.setSubject("Subject"); // 创建多部分消息 Multipart multipart = new MimeMultipart(); // 创建文本部分 MimeBodyPart textPart = new MimeBodyPart(); textPart.setText("Body"); // 创建签名部分 MimeBodyPart signaturePart = new MimeBodyPart(); signaturePart.setContent("Signature", "application/pgp-signature"); // 将文本部分和签名部分添加到多部分消息中 multipart.addBodyPart(textPart); multipart.addBodyPart(signaturePart); // 设置多部分消息为邮件消息的内容 message.setContent(multipart); // 发送邮件消息 Transport.send(message); } } ``` 在此示例代码中,我们使用了自签名证书进行签名,将签名部分作为多部分消息的一部分添加到消息中,然后将多部分消息设置为邮件消息的内容。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值