一分钟学会JavaMail(假)__手动滑稽
因为公司内部办公系统(OA)需要增加一个发送邮件的功能,所以学习了这个感觉比较冷门的JavaMail
1、先上成功截图 :
2、准备事项:Java Mail虽然是官方写的,但是没有集成到jdk里面,所以需要自己下jar包
首先去官网下载,或者去CSDN 下(http://download.csdn.net/download/itsonglin/8632453)
ps:老版本的api似乎不支持开启加密,建议去官网下最新jar包
3、这里贴一个封装好了的工具类代码,可以直接copy不用看,使用这个就能很方便的使用 javamail 而不用了解什么是javamail
ps:以前在学校学东西都是一步步的稳打稳扎,现在工作就是会用就行,赶快把功能做出来 , 唉,希望能有时间补起来
- import com.sun.mail.util.MailSSLSocketFactory;
- import java.io.*;
- import java.security.GeneralSecurityException;
- import java.util.*;
- import javax.activation.*;
- import javax.mail.*;
- import javax.mail.internet.*;
- public class SendMail {
- private String username = null;
- private String password = null;
- private Authenticator auth = null;
- private MimeMessage mimeMessage =null;
- private Properties pros = null;
- private Multipart multipart = null;
- private BodyPart bodypart= null;
- /**
- * 初始化账号密码并验证
- * 创建MimeMessage对象
- * 发送邮件必须的步骤:1
- * @param username
- * @param password
- */
- public SendMail(String username,String password){
- this.username = username;
- this.password = password;
- }
- /**
- * 设置email系统参数
- * 接收一个map集合key为string类型,值为String
- * 发送邮件必须的步骤:2
- * @param map
- */
- public void setPros(Map<String,String> map){
- pros = new Properties();
- for(Map.Entry<String,String> entry:map.entrySet()){
- pros.setProperty(entry.getKey(), entry.getValue());
- }
- }
- /**
- * 初始化MimeMessage对象
- * 发送邮件必须的步骤:3
- */
- public void initMessage(){
- this.auth = new Email_Autherticator();
- Session session = Session.getDefaultInstance(pros,auth);
- mimeMessage = new MimeMessage(session);
- }
- /**
- * 验证账号密码
- * 发送邮件必须的步骤
- * @author Administrator
- *
- */
- public class Email_Autherticator extends Authenticator
- {
- public PasswordAuthentication getPasswordAuthentication()
- {
- return new PasswordAuthentication(username, password);
- }
- }
- /**
- * 设置发送邮件的基本参数(去除繁琐的邮件设置)
- * @param sub 设置邮件主题
- * @param text 设置邮件文本内容
- * @param rec 设置邮件接收人
- * @throws MessagingException
- * @throws UnsupportedEncodingException
- */
- public void setDefaultMessagePros(String sub,String text,String rec) throws MessagingException, UnsupportedEncodingException{
- mimeMessage.setSubject(sub);
- mimeMessage.setText(text);
- mimeMessage.setRecipient(Message.RecipientType.TO, new InternetAddress(rec));
- mimeMessage.setSentDate(new Date());
- mimeMessage.setFrom(new InternetAddress(username,username));
- }
- /**
- * 设置主题
- * @param subject
- * @throws MessagingException
- */
- public void setSubject(String subject) throws MessagingException{
- mimeMessage.setSubject(subject);
- }
- /**
- * 设置日期
- * @param date
- * @throws MessagingException
- */
- public void setDate(Date date) throws MessagingException{
- mimeMessage.setSentDate(new Date());
- }
- /**
- * 设置邮件文本内容
- * @param text
- * @throws MessagingException
- */
- public void setText(String text) throws MessagingException{
- mimeMessage.setText(text);
- }
- /**
- * 设置邮件头部
- * @param arg0
- * @param arg1
- * @throws MessagingException
- */
- public void setHeader(String arg0,String arg1) throws MessagingException{
- mimeMessage.setHeader(arg0, arg1);
- }
- /**
- * 设置邮件接收人地址 <单人发送>
- * @param recipient
- * @throws MessagingException
- */
- public void setRecipient(String recipient) throws MessagingException{
- mimeMessage.setRecipient(Message.RecipientType.TO, new InternetAddress(recipient));
- }
- /**
- * 设置邮件接收人地址 <多人发送>
- * @param list
- * @throws MessagingException
- * @throws AddressException
- */
- public String setRecipients(List<String> recs) throws AddressException, MessagingException{
- if(recs.isEmpty()){
- return "接收人地址为空!";
- }
- for(String str:recs){
- mimeMessage.addRecipient(Message.RecipientType.TO, new InternetAddress(str));
- }
- return "加入接收人地址成功!";
- }
- /**
- * 设置邮件接收人地址 <多人发送>
- * @param StringBuffer<parms,parms2,parms.....>
- * @throws MessagingException
- * @throws AddressException
- */
- @SuppressWarnings("static-access")
- public String setRecipients(StringBuffer sb) throws AddressException, MessagingException{
- if(sb==null||"".equals(sb)){
- return "字符串数据为空!";
- }
- Address []address = new InternetAddress().parse(sb.toString());
- mimeMessage.addRecipients(Message.RecipientType.TO, address);
- return "收件人加入成功";
- }
- /**
- * 设置邮件发送人的名字
- * @param from
- * @throws UnsupportedEncodingException
- * @throws MessagingException
- */
- public void setFrom(String from) throws UnsupportedEncodingException, MessagingException{
- mimeMessage.setFrom(new InternetAddress(username,from));
- }
- /**
- * 发送邮件<单人发送>
- * return 是否发送成功
- * @throws MessagingException
- */
- public String sendMessage() throws MessagingException{
- Transport.send(mimeMessage);
- return "success";
- }
- /**
- * 设置附件
- * @param file 发送文件的路径
- */
- public void setMultipart(String file) throws MessagingException, IOException{
- if(multipart==null){
- multipart = new MimeMultipart();
- }
- multipart.addBodyPart(writeFiles(file));
- mimeMessage.setContent(multipart);
- }
- /**
- * 设置附件<添加多附件>
- * @param fileList<接收List集合>
- * @throws MessagingException
- * @throws IOException
- */
- public void setMultiparts(List<String> fileList) throws MessagingException, IOException{
- if(multipart==null){
- multipart = new MimeMultipart();
- }
- for(String s:fileList){
- multipart.addBodyPart(writeFiles(s));
- }
- mimeMessage.setContent(multipart);
- }
- /**
- * 发送文本内容,设置编码方式
- * <方法与发送附件配套使用>
- * <发送普通的文本内容请使用setText()方法>
- * @param s
- * @param type
- * @throws MessagingException
- */
- public void setContent(String s,String type) throws MessagingException{
- if(multipart==null){
- multipart = new MimeMultipart();
- }
- bodypart = new MimeBodyPart();
- bodypart.setContent(s, type);
- multipart.addBodyPart(bodypart);
- mimeMessage.setContent(multipart);
- mimeMessage.saveChanges();
- }
- /**
- * 读取附件
- * @param filePath
- * @return
- * @throws IOException
- * @throws MessagingException
- */
- public BodyPart writeFiles(String filePath)throws IOException, MessagingException{
- File file = new File(filePath);
- if(!file.exists()){
- throw new IOException("文件不存在!请确定文件路径是否正确");
- }
- bodypart = new MimeBodyPart();
- DataSource dataSource = new FileDataSource(file);
- bodypart.setDataHandler(new DataHandler(dataSource));
- //文件名要加入编码,不然出现乱码
- bodypart.setFileName(MimeUtility.encodeText(file.getName()));
- return bodypart;
- }
- /**
- * 使用SSL登录
- * @throws GeneralSecurityException
- */
- public void openSSL() throws GeneralSecurityException {
- MailSSLSocketFactory sf =new MailSSLSocketFactory();
- sf.setTrustAllHosts(true);
- pros.put("mail.smtp.ssl.enable", "true");
- pros.put("mail.smtp.ssl.socketFactory", sf);
- }
- }
ps:代码来自http://blog.csdn.net/Coding_One/article/details/51354456
4、把代码copy到位后(记得加你的包名),直接可以使用这个工具类了,下面就贴我写的demo了
- public void sendMailTest() throws IOException, MessagingException {
- //首先创建一个sendMail对象,它是把发送邮件这件事情封装成对象,当然需要先告诉它你的用户名和密码
- SendMail sendMail=new SendMail("你的邮箱地址","你的邮箱密码");
- //这个是告诉它一些配置信息,就像框架的配置文件
- Map<String,String> map=new HashMap<String, String>();
- map.put("mail.host","smtp.qq.com");//设置邮箱服务器的地址 我这里填的是qq邮箱的,假如你不知道你使用邮箱的服务器地址,百度下就好了,一般都是这样格式的,比如163就是smtp.163.com
- map.put("mail.smtp.auth", "true");//开启验证,不确认怎么发呢,对吧
- sendMail.setPros(map);//然后把你写好的信息告诉它
- //初始化并验证下你密码对不对
- sendMail.initMessage();
- sendMail.setSubject("这里填邮件的标题");
- sendMail.setText("这里填正文");
- sendMail.setRecipient("这个填你要发给谁");
- sendMail.setFrom("这个填你的昵称,告诉人家你是谁");
- //填了一堆乱七八糟的东西,终于可以发送拉
- sendMail.sendMessage();
- }
这只是一个简单的demo,更多的群发,添加附件,添加多个附件等等, 工具类里面都有支持
---------------------------------------------一个 我还没完 的分割线---------------------------------------------
有个重要的事情就是,如果使用qq邮箱,密码不填你的qq密码,而是填所谓的授权码(需要在qq邮箱里面申请,设置-账户-开启SMTP服务)
然后还要开启ssl ,代码如下:
- //使用ssl登录
- sendMail.openSSL();
这个加哪都可以(除了发送之后。。),最好放在:
然后就可以用循环骚扰你的基友了 嘿嘿嘿
本demo只要加上开启ssl和使用授权码就可以使用,非常简单!
本文禁止一切形式转载!
一分钟学会JavaMail(假)__手动滑稽的更多相关文章
- 5分钟学会使用Less预编译器
5分钟学会使用Less预编译器 Less是什么? LESS CSS是一种动态样式语言,属于CSS预处理语言的一种,它使用类似CSS的语法为CSS赋予了动态语言的特性,如变量.继承.运算.函数等,更方便 ...
- 【grunt第二弹】30分钟学会使用grunt打包前端代码(02)
前言 上一篇博客,我们简单的介绍了grunt的使用,一些基础点没能覆盖,我们今天有必要看看一些基础知识 [grunt第一弹]30分钟学会使用grunt打包前端代码 配置任务/grunt.initCon ...
- 《量化投资:以MATLAB为工具》连载(2)基础篇-N分钟学会MATLAB(中)
http://www.matlabsky.com/thread-43937-1-1.html <量化投资:以MATLAB为工具>连载(3)基础篇-N分钟学会MATLAB(下) ...
- 《量化投资:以MATLAB为工具》连载(1)基础篇-N分钟学会MATLAB(上)
http://blog.sina.com.cn/s/blog_4cf8aad30102uylf.html <量化投资:以MATLAB为工具>连载(1)基础篇-N分钟学会MATLAB(上) ...
- [分享] 史上最简单的封装教程,五分钟学会封装系统(以封装Windows 7为例)
[分享] 史上最简单的封装教程,五分钟学会封装系统(以封装Windows 7为例) 踏雁寻花 发表于 2015-8-23 23:31:28 https://www.itsk.com/thread-35 ...
- 50分钟学会Laravel 50个小技巧
50分钟学会Laravel 50个小技巧 时间 2015-12-09 17:13:45 Yuansir-web菜鸟 原文 http://www.yuansir-web.com/2015/12/09 ...
- 10分钟学会Linux
10分钟学会Linux有点夸张,可是能够让一个新手初步熟悉Linux中最重要最主要的知识,本文翻译的英文网页在众多Linux入门学习的资料中还是很不错的. 英文地址:http://freeengine ...
- PHP学习过程_Symfony_(3)_整理_十分钟学会Symfony
这篇文章主要介绍了Symfony学习十分钟入门教程,详细介绍了Symfony的安装配置,项目初始化,建立Bundle,设计实体,添加约束,增删改查等基本操作技巧,需要的朋友可以参考下 (此文章已被多人 ...
- 30分钟学会使用Spring Web Services基础开发
时隔一年终于又推出了一篇30分钟系列,上一篇<30分钟学会反向Ajax>是2016年7月的事情了.时光荏苒,岁月穿梭.虽然一直还在从事Java方面的开发工作,但是私下其实更喜欢使用C++. ...
随机推荐
- git push origin与git push -u origin master的区别
$ git push origin 上面命令表示,将当前分支推送到origin主机的对应分支. 如果当前分支只有一个追踪分支,那么主机名都可以省略. $ git push 如果当前分支与多个主机存在追 ...
- 【20190228】JavaScript-获取子元素
在写JavaScript的时候发现了一个获取子节点的坑,如以下的html结构 <div id="parent"> <div>1</div> &l ...
- ABP大型项目实战(1) - 目录
前面我写了<如何用ABP框架快速完成项目>系列文章,讲述了如何用ABP快速完成项目. 然后我收到很多反馈,其中一个被经常问到的问题就是,“看了你的课程,发现ABP的优势是快速开发,那么 ...
- Arcgis for Javascript 对接iServer发布的Mapserver服务
测试说明 webgis开发流程一般是: 数据处理 ---发布服务---SDK开发.除了开源的服务以外,一般各GIS厂商都是自己的服务自己的SDK才能对接. SuperMap iServer 提供了将 ...
- Redis保证事务一致性,以及常用的数据结构
reids命令可以参考中文官网:http://redis.cn/commands.html 关于reids的使用,可以封装到工具类进行调用: Redis的工具类:JedisAdapter 除了数据结构 ...
- nginx配置静态项目
当nignx可以加载下面的这个service时 server { listen 8085; server_name 1.192.60.82; location / { root /etc/nginx ...
- TreeView 节点拖拽
public Form1() { InitializeComponent(); treeView1.AllowDrop = true; treeView1.ItemDrag += new ItemDr ...
- python实例七
https://www.cnblogs.com/evablogs/p/6791548.html 题目:将一个列表的数据复制到另一个列表中. 程序分析:打算利用for循环和append函数来复制到另一个 ...
- 进程命令(taskkill)
taskkill 命令: // 描述: 结束一个或多个任务或流程. // 语法: taskkill [/s <computer> [/u [<Domain>\]<User ...
- LeetCode算法题-Design HashSet(Java实现)
这是悦乐书的第298次更新,第317篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第166题(顺位题号是705).不使用任何内建的hash表库设计一个hash集合,应包含 ...