呼…前面的准备终于为真正实用的 JavaMail 功能、操作——发送邮件打下了基础,现在我们想要把一封正文部分是 HTML 格式、并包含两个附件的复杂邮件发送给指定的收件人。
JavaMail 中用于发送邮件的类有 Session 类和 Transport 类,当然也少不了 Message 类。它们之间的进行工作的关系和步骤如下:
各个类的关系与操作流程:
1、创建一个 Properties 对象,该类在 java.util 包中,以键-值对的形式设置邮件发送中需要用到的传输协议,如 SMTP 协议等;一般的 smtp 服务器都需要用户身份认证,所以这也要设置为 true ,以便向 smtp 服务器提交用户名、密码等信息;
2、先使用 Session 类中静态的 getInstance() 或getDefaultInstance() 获得自身对象,此时调用这两个方法应该传入上面创建的 Properties 对象;
3、再用 Session 对象调用 getTransport() 方法获得 Transport 抽象类的具体实现子类对象,如 MimeTransport 类;
4、将 Sesson 对象作为参数创建 MimeMessage 对象,即一封邮件,前面的文章已经有所讲述;
5、使用 MimeTransport 对象调用相关方法将 MimeMessage 对象发送出去。
由于前面的文章已经写了创建各类邮件的代码,所以在这里就直接拿来用而不再编写了,创建邮件的代码放在本文的最后面。我们使用到了上篇文章中的 WithAttachmentMessage 类作为一封邮件,稍稍修改一下 from 和 to 就可以从不同的邮箱发送给不同的邮箱了。
实现代码:
- importjava.util.Properties;
- importjavax.mail.Message;
- importjavax.mail.Session;
- importjavax.mail.Transport;
- importjavax.mail.internet.MimeMessage;
- importcreateMails.WithAttachmentMessage;
- publicclassMessageSender{
- publicSessioncreateSession(Stringprotocol){
- Propertiesproperty=newProperties();
- property.setProperty("mail.transport.protocol",protocol);
- property.setProperty("mail.smtp.auth","true");
- Sessionsession=Session.getInstance(property);
-
- session.setDebug(true);
- returnsession;
- }
- publicvoidsendMail(Sessionsession,MimeMessagemsg)throwsException{
-
- StringsmtpServer="smtp.sina.com";
- Stringuser="test_hao@sina.cn";
- Stringpwd="123456";
- Transporttransport=session.getTransport();
- transport.connect(smtpServer,user,pwd);
- transport.sendMessage(msg,msg.getRecipients(Message.RecipientType.TO));
- transport.close();
- }
- publicstaticvoidmain(String[]args)throwsException{
- MessageSendersender=newMessageSender();
-
- Sessionsession=sender.createSession("smtp");
- MimeMessagemail=newWithAttachmentMessage().createMessage(session);
- sender.sendMail(session,mail);
- }
- }
测试发送结果(猜想:不同的 smtp 服务器对于同一邮件会有不同的解析格式、规范):
1、发送到 163 邮箱
163 将我们的正文部分的HTML 文本和图片都变成附件了,真奇怪,可能是因为正文是 HTML 格式。
2、发送到 sina 邮箱:
比 163 邮箱稍好一些,附件有3个,内嵌在 HTML 正文中的图片被当作附件处理了,正文中的纯文本被解析了,可是内嵌在 HTML 中的图片却显示不了。
3、发送到 QQ 邮箱:
效果与我们预期的完全一致!附件有两个,正文文本、图片全部正确解析并显示出来。
PK结果:
目前浅显的来看,应该是 QQ 邮箱最厉害了,此外,QQ 邮箱接收邮件的速度最快,不行可以试一试。当然,安全性什么的就不能从此处有所了解了。
深入:
由于在代码中开启了 JavaMail API 的调试功能,所以可以从控制台输出的响应信息中了解到更多的信息,特别是关于上面不同 smtp 服务器解析同一封邮件的过程,它可能跟我们传输、发送过去的具体过程有关。
小结:
现在回想起来,前面使用 telnet 程序在控制台中麻烦地手工发送纯文本邮件是多么低效。JavaMail API 将这一切与底层协作的过程、操作都封装掉了,这就是软件开发的目的吧。
本文使用到上一篇文章中的程序代码:
- importjava.io.FileOutputStream;
- importjava.util.Properties;
- importjavax.activation.DataHandler;
- importjavax.activation.FileDataSource;
- importjavax.mail.Message;
- importjavax.mail.Session;
- importjavax.mail.internet.InternetAddress;
- importjavax.mail.internet.MimeBodyPart;
- importjavax.mail.internet.MimeMessage;
- importjavax.mail.internet.MimeMultipart;
- publicclassWithAttachmentMessage{
- publicMimeBodyPartcreateAttachment(StringfileName)throwsException{
- MimeBodyPartattachmentPart=newMimeBodyPart();
- FileDataSourcefds=newFileDataSource(fileName);
- attachmentPart.setDataHandler(newDataHandler(fds));
- attachmentPart.setFileName(fds.getName());
- returnattachmentPart;
- }
- publicMimeBodyPartcreateContent(Stringbody,StringfileName)
- throwsException{
- MimeBodyPartcontentBody=newMimeBodyPart();
- MimeMultipartcontentMulti=newMimeMultipart("related");
- MimeBodyParttextBody=newMimeBodyPart();
- textBody.setContent(body,"text/html;charset=gbk");
- contentMulti.addBodyPart(textBody);
- MimeBodyPartjpgBody=newMimeBodyPart();
- FileDataSourcefds=newFileDataSource(fileName);
- jpgBody.setDataHandler(newDataHandler(fds));
- jpgBody.setContentID("logo_jpg");
- contentMulti.addBodyPart(jpgBody);
- contentBody.setContent(contentMulti);
- returncontentBody;
- }
- publicMimeMessagecreateMessage(Sessionsession)throwsException{
- Stringfrom="test_hao@sina.cn";
- Stringto="test_hao@163.com";
-
- Stringsubject="创建内含附件、图文并茂的邮件!";
- Stringbody="<h4>内含附件、图文并茂的邮件测试!!!</h4></br>"
- +"<ahref=http://haolloyin.blog.51cto.com/>蚂蚁</a></br>"
- +"<imgsrc=\"cid:logo_jpg\"></a>";
- MimeMessagemsg=newMimeMessage(session);
- msg.setFrom(newInternetAddress(from));
- msg.setRecipient(Message.RecipientType.TO,newInternetAddress(to));
- msg.setSubject(subject);
- MimeBodyPartattachment01=createAttachment("F:\\java\\Hello_JavaMail.java");
- MimeBodyPartattachment02=createAttachment("F:\\java\\Hello_JavaMail.7z");
- MimeBodyPartcontent=createContent(body,"F:\\java\\logo.jpg");
- MimeMultipartallPart=newMimeMultipart("mixed");
- allPart.addBodyPart(attachment01);
- allPart.addBodyPart(attachment02);
- allPart.addBodyPart(content);
- msg.setContent(allPart);
- msg.saveChanges();
- returnmsg;
- }
- publicstaticvoidmain(String[]args)throwsException{
- WithAttachmentMessagemail=newWithAttachmentMessage();
- Sessionsession=Session.getDefaultInstance(newProperties());
- MimeMessagemessage=mail.createMessage(session);
- message.writeTo(newFileOutputStream("withAttachmentMail.eml"));
- }
- }
分享到:
相关推荐
javaMail发送邮件 发送成功 收不到邮件 或收到邮件无主题无收件人乱码 查看debug 邮件处理过程发现邮件头没有编译, 内容是base64编码,所以邮箱收不到或者收到的是base64编码后的一堆乱码,
javamail实现的邮件发送功能,内含完整代码和jar包,邮件服务协议smtp,pop3,用javamail发送邮件,支持QQ,163邮件发送。相同邮件(QQ邮箱给QQ邮箱)和不同邮件(QQ邮箱给163邮箱)是不一样的。
很好的邮件处理代码,1.5版本,作为build path放在eclipse里面,就可以用啦! oracle官方推的,很好!jdk1.6版本以上用起来很方便。
javamail发送邮件实例 javamail 发送邮件 文本编辑器 kindeditor
JavaMail实现邮件发送的简单封装(包括文本、图片、html、附件) 详见http://blog.csdn.net/lyisray/article/details/42002215
纯java发送简单邮件的功能,支持嘱性文件的配置,可配多人接收,多个附件,简单。。。
Struts2框架,javamail发送邮件,可以直接用main()调用,也可通过tomcat,在IE上运行,比较简单易懂。
如何用javamail定时发送邮件
此源码是使用javamail发送邮件,可以实现静默发送邮件,可以发送附件资源等。有相应的使用说明,快捷好用
基于javamail1.4实现邮件发送,支持多收件人、抄送人、多附件等
Javamail发送邮件类库,Java发送邮件需要用到该类库
好代码,好用,简单明了,记得导入相应jar包,对初学者非常有帮助
利用JAVAMAIL实现的发送邮件的小例子
javamail实现发送邮件的小例子,简单易会,好用记得给好评哦!
javamail 回执邮件资料
使用JAVAMail代发邮件 资源源于不但搜索,自由源于不但努力
javamail发送邮件小程序,类以及写好,只要放包,下载一个就可以
JavaMail实现邮件发送功能,可发送、抄送、密送多人,支持多附件的发送。配置相关参数后可直接调用发送邮件
使用JavaMail发送邮件,直接导入可以测试
我做了个Javamail发送邮件和java解析pdf,不过目前只会解析纯文本版的pdf,如果换成带图片或者纯图片的pdf就解析不了。解析要用的包都放在lib里,请自行添加。