设为首页
优惠IDC
收藏本站
六狼博客
六狼论坛
开启辅助访问
切换到窄版
用户名
Email
自动登录
找回密码
密码
登录
立即注册
只需一步,快速开始
只需一步,快速开始
快捷导航
门户
首页
BBS
云计算
大数据
手机
移动开发android,ios,windows phone,windows mobile
编程
编程技术java,php,python,delphi,ruby,c,c++
前端
WEB前端htmlcss,javascript,jquery,html5
数据库
数据库开发Access,mysql,oracle,sql server,MongoDB
系统
操作系统windows,linux,unix,os,RedHat,tomcat
架构
项目管理
软件设计,架构设计,面向对象,设计模式,项目管理
企业
服务
运维实战
神马
搜索
搜索
热搜:
php
java
python
ruby
hadoop
sphinx
solr
ios
android
windows
centos
本版
帖子
用户
六狼论坛
»
首页
›
WEB前端
›
Html/Css
›
(转)JavaMail:邮件发送以及sina、163、QQ服务器不同 ...
返回列表
查看:
127
|
回复:
0
(转)JavaMail:邮件发送以及sina、163、QQ服务器不同的解析结果(附图)
[复制链接]
wahahappy
wahahappy
当前离线
积分
15
窥视卡
雷达卡
升级
30%
当前用户组为
童生
当前积分为
15
, 升到下一级还需要 35 点。
3
主题
3
主题
3
主题
童生
童生, 积分 15, 距离下一级还需 35 积分
童生, 积分 15, 距离下一级还需 35 积分
积分
15
发消息
楼主
|
发表于 2013-2-7 19:09:41
|
显示全部楼层
|
阅读模式
<div class="showContent"><span style="font-size: 14px;"> 呼…前面的准备终于为真正实用的 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 就可以从不同的邮箱发送给不同的邮箱了。
实现代码:
import java.util.Properties; import javax.mail.Message; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.MimeMessage; import createMails.WithAttachmentMessage; /** * 邮件发送程序 * @author haolloyin */ public class MessageSender { /** * 创建Session对象,此时需要配置传输的协议,是否身份认证 */ public Session createSession(String protocol) { Properties property = new Properties(); property.setProperty("mail.transport.protocol", protocol); property.setProperty("mail.smtp.auth", "true"); Session session = Session.getInstance(property); // 启动JavaMail调试功能,可以返回与SMTP服务器交互的命令信息 // 可以从控制台中看一下服务器的响应信息 session.setDebug(true); return session; } /** * 传入Session、MimeMessage对象,创建 Transport 对象发送邮件 */ public void sendMail(Session session, MimeMessage msg) throws Exception { // 设置发件人使用的SMTP服务器、用户名、密码 String smtpServer = "smtp.sina.com"; String user = "test_hao@sina.cn"; String pwd = "123456"; // 由 Session 对象获得 Transport 对象 Transport transport = session.getTransport(); // 发送用户名、密码连接到指定的 smtp 服务器 transport.connect(smtpServer, user, pwd); transport.sendMessage(msg, msg.getRecipients(Message.RecipientType.TO)); transport.close(); } // 测试:发送邮件 public static void main(String[] args) throws Exception { MessageSender sender = new MessageSender(); // 指定使用SMTP协议来创建Session对象 Session session = sender.createSession("smtp"); // 使用前面文章所完成的邮件创建类获得 Message 对象 MimeMessage mail = new WithAttachmentMessage().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 将这一切与底层协作的过程、操作都封装掉了,这就是软件开发的目的吧。
本文使用到上一篇文章中的程序代码:
<span style="font-size: 14px;"><div class="quote_title">写道
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
千斤顶
显身卡
返回列表
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
本版积分规则
发表回复
回帖后跳转到最后一页
Copyright © 2008-2020
六狼论坛
(https://it.6wolf.com) 版权所有 All Rights Reserved.
Powered by
Discuz!
X3.4
京ICP备14020293号-2
本网站内容均收集于互联网,如有问题请联系
QQ:389897944
予以删除
快速回复
返回顶部
返回列表