前言
今天在课堂上学习了JavaMail,它经常被用于邮件的发送,在以前邮件被广泛的使用,即使是现在邮件也应用在很多场景,所以我们一起来学习一下JavaMail的基本邮件发送的案例。
一、JavaMail是什么?
JavaMail,顾名思义,提供给开发者处理电子邮件相关的编程接口。它是Sun发布的用来处理email的API。它可以方便地执行一些常用的邮件传输。我们可以基于JavaMail开发出类似于Microsoft Outlook的应用程序。
二、建立邮件服务器
在国内,我们常用的邮箱有网易、新浪、QQ邮箱等。这些基本都是主流。他们有这不同的邮件服务器。
我以网易163邮箱为例:
首先要将POP3/SMTP服务打开,然后得到并复制授权码,再得到SMTP网址。如下图:
作好以上准备后,还需要的java环境:
-
jdk1.6以上
-
javax.mail-1.6.2.jar
三.发送邮件
3.1前期准备
导入jar包
创建一个JavaMailUtils类,用来连接服务器,类定义为final,构造方法用private修饰,创建一个creatSession方法,方法中创建一个Properties对象,调用Properties对象的put方法将SMTP主机名,主机端口号,是否需要用户认证,启用TLS加密的信息封装进去。代码如下:
Properties props = new Properties();
props.put("mail.smtp.host", "smtp.163.com");// SMTP主机名
props.put("mail.smtp.port", "25");// 主机端口号
props.put("mail.smtp.auth", "true");// 是否需要用户认证
props.put("mail.smtp.starttls.enable", "true");// 启用TLS加密
然后创建一个Session对话,通过getInstance(props,Authenticator)方法将props和密码封装进Seesion中,其中要重写Authenticator中的getPasswordAuthentication,定义两个String类型的账户名和密码,return账户名和密码,以此建立与服务器的连接,最终return Session。代码如下:
String userName = "[email protected]";
String password = "QDBJPWxxxxVNHHSZ";
Session session = Session.getInstance(props, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(userName, password);
}
});
return session;
有了这个类后,就可以正式开始邮件的发送了。
3.2 单个邮件发送
通过刚创建的JavaMailUtils的createSession方法,创建一个Session对象,再创建一个MimeMessage对象,将session对象放入构造方法中,然后通过message对象的setForm设置发件人账号,setRecipient设置收件人信息,其中setRecipient(RecipientType.TO,new InternetAddress(“[email protected]”))的第一个参数代表发送给一个联系人,通过message的setSubject方法设置邮件标题,setText设置正文内容,最终使用Transport.send(message)发送邮件。代码如下:
Session session = JavaMailUtils.createSession();
MimeMessage message = new MimeMessage(session);
try {
message.setFrom(new InternetAddress("[email protected]"));
message.setRecipient(RecipientType.TO, new InternetAddress("[email protected]"));
message.setSubject("CXK");
message.setText("1");
Transport.send(message);
} catch (MessagingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
结果如图
3.2 单个邮件发送,带附件
要在邮件中带附件,就不能直接使用message.setText()方法,而是要构造一个Multipart对象:
//添加text:
Multipart multipart = new MimeMultipart();
BodyPart textpart = new MimeBodyPart();
textpart.setContent(body,"text/html;charset=utf-8");//可以有超文本
multipart.addBodyPart(textpart);
//添加image:
BodyPart imagepart = new MimeBodyPart();
imagepart.setFileNmae(附件名称);
imagepart.setDataHandler(new DataHandler(new ByteArrayDataSource(文件输入流,"application/octet-stream"));
multipart.addBodyPart(imagepart);
message.setContent(multipart);
一个multipart对象可以添加若干个BodyPart,其中第一个BodyPart是文本,即邮件正文,后面的BodyPart是附件。如添加文本,可以用setContent(“…”,“text/plain;charset=utf-8”),或者将第二个参数设置成text/html;charset=utf-8即可添加HTML文本。如果添加附件,需要设置文件名(不一定和真实文件名一致),并且添加一个DataHandler(),传入文件的MIME类型。二进制文件可以用application/octet-stream,Word文档则是application/msword。最后通过setContent()把Multipart添加到Mesage中,即可发送。
效果如图:
3.2 抄送邮件,带内嵌图片
想要抄送,要使用message.setRecipients()方法并且第一个参数设置为RecipientType.CC,第二个参数是new InternetAddress[]集合,集合中存放收件人的账号。代码如下:
message.setRecipients(RecipientType.CC, new InternetAddress[] { new InternetAddress("[email protected]"),
new InternetAddress("[email protected]") });
想要发送的HTML邮件中内嵌图片,可以选择在邮件正文中加入<img src=“cid:图片名称”>,将图片的BodyPart对象用setHeader(“Content-ID”,“<图片名称>”)联系起来,最后发送。代码如下:
BodyPart textBoby = new MimeBodyPart();
StringBuilder content = new StringBuilder();
content.append("<p>只因你太美<p>");
content.append("<img src=\"cid:cxk\"/> ");
textBoby.setContent(content.toString(), "text/html;charset=utf-8");
BodyPart imgBoby = new MimeBodyPart();
imgBoby.setDataHandler(new DataHandler(new ByteArrayDataSource(
Files.readAllBytes(Paths.get("D:\\\\Study\\\\cxk.jpg")), "application/octet-stream")));
imgBoby.setHeader("Content-ID", "cxk");
Multipart multipart = new MimeMultipart();
multipart.addBodyPart(textBoby);
multipart.addBodyPart(imgBoby);
message.setContent(multipart);
效果如图:
总结
以上就是今天学习的内容,本文介绍了JavaMail,发送单个邮件,抄送邮件,带附件邮件以及发送HTML邮件内嵌图片的案例,希望对您有所帮助。