一、准备工作

首先你需要已一个发送邮箱,一般的邮箱都有SMTP、POP3服务,比如QQ邮箱,登陆QQ邮箱开启SMTP服务,开启是服务器会提示你设置独立密码,这个密码是跟邮箱正常登陆的密码不同的,这个是SMTP登陆要用的密码,因此这里需记下SMTP独立密码,程序中会有使用。
(准备工作就是这么简单,只需有一个开启SMTP服务的邮箱即可);还需要一个JAR包(javax.mail.jar);java1.6里已经有了,如果没有把jar包加上。下载地址:http://www.oracle.com/technetwork/java/javamail/index-138643.html 
这里贴一下QQ邮箱设置SMTP的位置:登陆邮箱------点击“设置”-------点击“账户”标签页,往下翻就可以看到如下界面

二、一般情况下发送邮件只是中间操作,所以可以使用多线程,开启一个新线程发送邮件,主程序可以继续往下执行。

 import java.util.Properties;

 import javax.mail.Authenticator;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.Message.RecipientType;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage; public class SendMailThread extends Thread{ private String mailAdr;
private String content;
private String subject ; public SendMailThread(String mailAdr, String subject, String content) {
super();
this.mailAdr = mailAdr;
this.content = content;
this.subject = subject;
} @Override
public void run() {
// TODO Auto-generated method stub
super.run();
sendMail(mailAdr,subject,content);
} /*
* mailAdr 收件人地址
* subject 邮件标题
* content 邮件文本内容
*/
public void sendMail(String mailAdr,String subject,String content){
//配置发送邮件的环境属性
final Properties props = new Properties();
// 表示SMTP发送邮件,需要进行身份验证
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.host", "smtp.qq.com");
//smtp登陆的账号、密码 ;需开启smtp登陆
props.put("mail.user", "XXXXX@qq.com");
// 访问SMTP服务时需要提供的密码,不是邮箱登陆密码,一般都有独立smtp的登陆密码
props.put("mail.password", "XXXXX"); // 构建授权信息,用于进行SMTP进行身份验证
Authenticator authenticator = new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
// 用户名、密码
String userName = props.getProperty("mail.user");
String password = props.getProperty("mail.password");
return new PasswordAuthentication(userName, password);
}
}; // 使用环境属性和授权信息,创建邮件会话
Session mailSession = Session.getInstance(props, authenticator);
// 创建邮件消息
MimeMessage message = new MimeMessage(mailSession);
// 设置发件人
try{
InternetAddress form = new InternetAddress(
props.getProperty("mail.user"));
message.setFrom(form); // 设置收件人
InternetAddress to = new InternetAddress(mailAdr);
message.setRecipient(RecipientType.TO, to); // 设置抄送
//InternetAddress cc = new InternetAddress("luo_aaaaa@yeah.net");
//message.setRecipient(RecipientType.CC, cc); // 设置密送,其他的收件人不能看到密送的邮件地址
//InternetAddress bcc = new InternetAddress("aaaaa@163.com");
//message.setRecipient(RecipientType.CC, bcc); // 设置邮件标题
message.setSubject(subject);
// 设置邮件的内容体
message.setContent(content, "text/html;charset=UTF-8");
// 发送邮件
Transport.send(message);
}catch(MessagingException e){
e.printStackTrace();
}
} public static void main(String[] args) {
// TODO Auto-generated method stub
SendMailThread d = new SendMailThread("xxxxxxx@qq.com","测试邮件标题","测试邮件001 <br>内容....");
d.start();
System.out.println("程序继续...");
} }

三、主程序中调用

SendMailThread mail = new SendMailThread("邮件地址","邮件标题","邮件内容");
mail.start();
 
补充01:
上面程序中是单个收件接收人,如果需要群发邮件可自行修改程序,下面贴出群发邮件的方法
//群发方式一,用数组
InternetAddress[] adds = new InternetAddress[2];
adds[0] = new InternetAddress("xxxx@qq.com");
adds[1] = new InternetAddress("xxxx@qq.com");
message.setRecipients(RecipientType.TO, adds);
//群发方式二,直接用String多个地址有逗号隔开
message.setRecipients(RecipientType.TO, "xxxxx@qq.com,xxxxx@qq.com");
 
补充02:
上面程序是演示用QQ邮箱发送,也可以用网易等其他邮箱,修改这句即可:
props.put("mail.smtp.host", "smtp.163.com");

不过,经测试发现网易的好像只能发送到网易邮箱,其他邮箱发不到,QQ邮箱就可以发送到其他任何邮箱去。

补充03:
程序调试时可打印发送信息用于查找问题;
创建邮件回话session后加上这条语句:
// 可以从控制台中看一下服务器的响应信息
mailSession.setDebug(true);

补充04:

上面群发的邮件是指邮件内容是相同的,群发给多个人。

另外一种情况是,多份不同的邮件群发,项目中就有遇到这种情况,群发给员工角色的邮件格式与群发给管理层角色邮件格式不同,所以自然会想到每种邮件启动一个上面代码中的线程,但是发送2种邮件还好,只需要启动两个线程,如果是100种邮件呢,会直接把JVM内存占满导致tomcat挂掉,所以应该考虑把循环都写到一个线程里面,这样只需要建立一个线程就可以完成,也节约了系统资源的占用。

在线程外面先把邮件封装好,每个邮件用一个Map来装,然后把Map再装到List里面,然后在发送邮件线程里遍历发送。

修改之后的线程如下:

 package com.linwei.util;

 import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties; import javax.mail.Authenticator;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.Message.RecipientType;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage; import org.apache.log4j.Logger; public class SendMailThread extends Thread{ /*
* @param list
* 存放邮件地址、标题、内容的list集合
* key: mailAdr,subject,content
*/
private List<Map<String,String>> list ;
private static final Logger log = Logger.getLogger(SendMailThread.class); public SendMailThread(List<Map<String,String>> list){
super();
this.list = list ;
}
public SendMailThread(List<Map<String,String>> list,int days){
super();
this.list = list ;
} @Override
public void run() {
// TODO Auto-generated method stub
super.run();
if(list!=null && list.size()>0){
sendMail(list);
}
} /*
* mailAdr 收件人地址,多个收件地址用,隔开
* content 邮件文本内容
*/
public void sendMail(List<Map<String,String>> list){
final Properties props = new Properties();
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.host", "smtp.sina.com");
//smtp登陆
props.put("mail.user", "test@sina.com");
props.put("mail.password", "test123456"); // 构建授权信息,用于进行SMTP进行身份验证
Authenticator authenticator = new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
// 用户名、密码
String userName = props.getProperty("mail.user");
String password = props.getProperty("mail.password");
return new PasswordAuthentication(userName, password);
}
}; // 使用环境属性和授权信息,创建邮件会话
Session mailSession = Session.getInstance(props, authenticator);
//mailSession.setDebug(true); try{
MimeMessage message = null ; // 创建邮件消息
InternetAddress form = null ; //发件邮箱 log.error("***************邮件发送线程开始****************"+list.size());
for(Map<String,String> map : list){ //开始遍历
message = new MimeMessage(mailSession);
form = new InternetAddress(props.getProperty("mail.user"));
message.setFrom(form);
// 设置收件人
message.setRecipients(RecipientType.TO, map.get("mailAdr")); // 支持群发,多地址用逗号分隔
// 设置邮件标题
message.setSubject(map.get("subject"));
// 设置邮件的内容体
message.setContent(map.get("content"), "text/html;charset=UTF-8");
// 发送邮件
Transport.send(message);
}
}catch(MessagingException e){
log.error("发送邮件出现异常!"+e.toString());
e.printStackTrace();
}
} public static void main(String[] args) { Map<String,String> map01 = new HashMap<String,String>();
map01.put("mailAdr", "xxx@qq.com");
map01.put("subject", "发送邮件方式修改测试001");
map01.put("content", "abcfajglejgle");
Map<String,String> map02 = new HashMap<String,String>();
map02.put("mailAdr", "xxxxx@qq.com,wewe@qq.com");
map02.put("subject", "发送邮件方式修改测试002");
map02.put("content", "zzzzzzzzzzzzzzzzzzz"); List<Map<String,String>> list = new ArrayList<Map<String,String>>();
list.add(map01);
list.add(map02);
new SendMailThread(list).start();
System.out.println("程序继续...");
} }
以上内容参考来自网络,自己整理如上。

java实现smtp邮件发送的更多相关文章

  1. python学习笔记(SMTP邮件发送:带附件)

    博主有段时间没有更新博客了 先整理一个之前整理过的SMTP邮件发送,这次是带附件的功能 #!/usr/bin/env python # -*- coding: utf_8 -*- from email ...

  2. pyqt5实现SMTP邮件发送

    # -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'SMTP.ui' # # Created b ...

  3. python学习笔记(SMTP邮件发送)

    想着给框架添加邮件发送功能.所以整理下python下邮件发送功能 首先python是支持邮件的发送.内置smtp库.支持发送纯文本.HTML及添加附件的邮件 之后是邮箱.像163.qq.新浪等邮箱默认 ...

  4. Spring进阶—如何用Java代码实现邮件发送(一)

    相关文章: <Spring进阶—如何用Java代码实现邮件发送(二)> 在一些项目里面如进销存系统,对一些库存不足发出预警提示消息,招聘网站注册用户验证email地址等都需要用到邮件发送技 ...

  5. Java实现多线程邮件发送

    利用java多线程技术配合线程池实现多任务邮件发送. 1.基本邮件发送MailSender package hk.buttonwood.ops.email; import java.io.File; ...

  6. JavaUtil smtp 邮件发送

    需要用到的jar包:javax.mail.jar package com.lee.util; import java.io.UnsupportedEncodingException; import j ...

  7. java简单的邮件发送

    java实现简单的邮件发送案例,学会了这个你就可以利用这个来整你的好友了,不断地给他进行邮箱轰炸(当然个人不建议瞎搞),最重要的是明白其中的原理最好了.话不多说,直接看代码案例了.首先需要导入的jar ...

  8. Java实现QQ邮件发送

    首先我们需要两个jar包,点击下面即可下载这两个包: JavaMail mail.jar 1.4.5 JAF(版本 1.1.1) activation.jar 我们这里采用QQ邮箱发送邮件为例,代码如 ...

  9. Java实现QQ邮件发送客户端

    目录 一.前言:QQ邮件发送程序 二.封装SMTP操作 三.实现多线程接收 四.QQ邮件客户端界面设计 1.连接按钮 2.发送按钮 五.QQ邮件发送效果演示 六.总结 一.前言:QQ邮件发送程序 在上 ...

随机推荐

  1. 装饰模式(Decorate Pattern)

    在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象. (1) 装饰对象和真实对象有相同的接口.这样客户端对象就能以和真实对象相同的方式 ...

  2. IntelliJ Idea 常用快捷键 列表(实战终极总结!!!!)

    IntelliJ Idea 常用快捷键 列表(实战终极总结!!!!) 1. -----------自动代码-------- 常用的有fori/sout/psvm+Tab即可生成循环.System.ou ...

  3. Maven学习3-使用Maven构建项目

    转自:http://www.cnblogs.com/xdp-gacl/p/4240930.html maven作为一个高度自动化构建工具,本身提供了构建项目的功能,下面就来体验一下使用maven构建项 ...

  4. winform基本控件----按钮

    这次来引用一个我们上课时候老师给的一个实验内容,来说一下winform程序设计中的按钮控件的使用.下面是我们老师给的实验内容. 实验目的: 掌握Winform的开发环境. 掌握窗体的创建和基本方法. ...

  5. 安装jessie记录

    // */ // ]]>   安装jessie记录 Table of Contents 1 引言 2 目标 3 usb安装 4 无线网卡 5 代理上网 6 rabbitvcs 7 locale ...

  6. ruby中rsa加签解签方法

    # coding:utf-8require 'openssl'require 'base64'# rsa签名,文本内容和私钥路径def rsa_sign(data,private_key_path) ...

  7. ASP.NET MVC+EF5 开发常用代码

      Asp.Net Mvc,EF 技术常用点总结 1.Asp.Net MVC a)获得当前控制器名和当前操作的名称(action) 1.Action 中 RouteData.Values[" ...

  8. BP(back propagation)反向传播

    转自:http://www.zhihu.com/question/27239198/answer/89853077 机器学习可以看做是数理统计的一个应用,在数理统计中一个常见的任务就是拟合,也就是给定 ...

  9. BOM与DOM

    通常情况下,页面中的JavaScript代码都有一系列可以访问的对象,它们可以分为两组: 当前载入页面所拥有的对象(页面有时也可以叫做文档). 页面以外的事物所拥有的对象(即浏览器窗口和桌面屏幕). ...

  10. HTC Vive开发笔记之手柄震动

    手柄震动的代码SteamVR_Controller脚本的最上面的注释里面就有说明,其实也很简单 // Example usage: //这个栗子是左手柄震动 右手震动只需把Leftmost换成Righ ...