package com.csice.utils;  

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.util.Properties; import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.Address;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.Message.RecipientType;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility; /**
* 使用SMTP协议发送电子邮件
*/
public class sendEmailCode { // 邮件发送协议
private final static String PROTOCOL = "smtp"; // SMTP邮件服务器
private final static String HOST = "smtp.163.com"; // SMTP邮件服务器默认端口
private final static String PORT = "25"; // 是否要求身份认证
private final static String IS_AUTH = "true"; // 是否启用调试模式(启用调试模式可打印客户端与服务器交互过程时一问一答的响应消息)
private final static String IS_ENABLED_DEBUG_MOD = "true"; // 发件人
private static String from = "meijiajiang2016@163.com"; // 收件人
private static String to = "mjj19920418@163.com"; // 初始化连接邮件服务器的会话信息
private static Properties props = null; static {
props = new Properties();
props.setProperty("mail.transport.protocol", PROTOCOL);
props.setProperty("mail.smtp.host", HOST);
props.setProperty("mail.smtp.port", PORT);
props.setProperty("mail.smtp.auth", IS_AUTH);
props.setProperty("mail.debug",IS_ENABLED_DEBUG_MOD);
} /**
* 发送简单的文本邮件
*/
public static boolean sendTextEmail(String to,int code) throws Exception {
try {
// 创建Session实例对象
Session session1 = Session.getDefaultInstance(props); // 创建MimeMessage实例对象
MimeMessage message = new MimeMessage(session1);
// 设置发件人
message.setFrom(new InternetAddress(from));
// 设置邮件主题
message.setSubject("内燃机注册验证码");
// 设置收件人
message.setRecipient(RecipientType.TO, new InternetAddress(to));
// 设置发送时间
message.setSentDate(new Date());
// 设置纯文本内容为邮件正文
message.setText("您的验证码是:"+code+"!验证码有效期是10分钟,过期后请重新获取!"
+ "中国内燃机学会");
// 保存并生成最终的邮件内容
message.saveChanges(); // 获得Transport实例对象
Transport transport = session1.getTransport();
// 打开连接
transport.connect("meijiajiang2016", "");
// 将message对象传递给transport对象,将邮件发送出去
transport.sendMessage(message, message.getAllRecipients());
// 关闭连接
transport.close(); return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
} public static void main(String[] args) throws Exception {
sendHtmlEmail("mjj19920418@163.com", 88888);
} /**
* 发送简单的html邮件
*/
public static boolean sendHtmlEmail(String to,int code) throws Exception {
// 创建Session实例对象
Session session1 = Session.getInstance(props, new MyAuthenticator()); // 创建MimeMessage实例对象
MimeMessage message = new MimeMessage(session1);
// 设置邮件主题
message.setSubject("内燃机注册");
// 设置发送人
message.setFrom(new InternetAddress(from));
// 设置发送时间
message.setSentDate(new Date());
// 设置收件人
message.setRecipients(RecipientType.TO, InternetAddress.parse(to));
// 设置html内容为邮件正文,指定MIME类型为text/html类型,并指定字符编码为gbk
message.setContent("<div style='width: 600px;margin: 0 auto'><h3 style='color:#003E64; text-align:center; '>内燃机注册验证码</h3><p style=''>尊敬的用户您好:</p><p style='text-indent: 2em'>您在注册内燃机账号,此次的验证码是:"+code+",有效期10分钟!如果过期请重新获取。</p><p style='text-align: right; color:#003E64; font-size: 20px;'>中国内燃机学会</p></div>","text/html;charset=utf-8"); //设置自定义发件人昵称
String nick="";
try {
nick=javax.mail.internet.MimeUtility.encodeText("中国内燃机学会");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
message.setFrom(new InternetAddress(nick+" <"+from+">"));
// 保存并生成最终的邮件内容
message.saveChanges(); // 发送邮件
try {
Transport.send(message);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
} } /**
* 发送带内嵌图片的HTML邮件
*/
public static void sendHtmlWithInnerImageEmail() throws MessagingException {
// 创建Session实例对象
Session session = Session.getDefaultInstance(props, new MyAuthenticator()); // 创建邮件内容
MimeMessage message = new MimeMessage(session);
// 邮件主题,并指定编码格式
message.setSubject("带内嵌图片的HTML邮件", "utf-8");
// 发件人
message.setFrom(new InternetAddress(from));
// 收件人
message.setRecipients(RecipientType.TO, InternetAddress.parse(to));
// 抄送
message.setRecipient(RecipientType.CC, new InternetAddress("java_test@sohu.com"));
// 密送 (不会在邮件收件人名单中显示出来)
message.setRecipient(RecipientType.BCC, new InternetAddress("417067629@qq.com"));
// 发送时间
message.setSentDate(new Date()); // 创建一个MIME子类型为“related”的MimeMultipart对象
MimeMultipart mp = new MimeMultipart("related");
// 创建一个表示正文的MimeBodyPart对象,并将它加入到前面创建的MimeMultipart对象中
MimeBodyPart htmlPart = new MimeBodyPart();
mp.addBodyPart(htmlPart);
// 创建一个表示图片资源的MimeBodyPart对象,将将它加入到前面创建的MimeMultipart对象中
MimeBodyPart imagePart = new MimeBodyPart();
mp.addBodyPart(imagePart); // 将MimeMultipart对象设置为整个邮件的内容
message.setContent(mp); // 设置内嵌图片邮件体
DataSource ds = new FileDataSource(new File("resource/firefoxlogo.png"));
DataHandler dh = new DataHandler(ds);
imagePart.setDataHandler(dh);
imagePart.setContentID("firefoxlogo.png"); // 设置内容编号,用于其它邮件体引用 // 创建一个MIME子类型为"alternative"的MimeMultipart对象,并作为前面创建的htmlPart对象的邮件内容
MimeMultipart htmlMultipart = new MimeMultipart("alternative");
// 创建一个表示html正文的MimeBodyPart对象
MimeBodyPart htmlBodypart = new MimeBodyPart();
// 其中cid=androidlogo.gif是引用邮件内部的图片,即imagePart.setContentID("androidlogo.gif");方法所保存的图片
htmlBodypart.setContent("<span style='color:red;'>这是带内嵌图片的HTML邮件哦!!!<img src=\"cid:firefoxlogo.png\" /></span>","text/html;charset=utf-8");
htmlMultipart.addBodyPart(htmlBodypart);
htmlPart.setContent(htmlMultipart); // 保存并生成最终的邮件内容
message.saveChanges(); // 发送邮件
Transport.send(message);
} /**
* 发送带内嵌图片、附件、多收件人(显示邮箱姓名)、邮件优先级、阅读回执的完整的HTML邮件
*/
public static void sendMultipleEmail() throws Exception {
String charset = "utf-8"; // 指定中文编码格式
// 创建Session实例对象
Session session = Session.getInstance(props,new MyAuthenticator()); // 创建MimeMessage实例对象
MimeMessage message = new MimeMessage(session);
// 设置主题
message.setSubject("使用JavaMail发送混合组合类型的邮件测试");
// 设置发送人
message.setFrom(new InternetAddress(from,"新浪测试邮箱",charset));
// 设置收件人
message.setRecipients(RecipientType.TO,
new Address[] {
// 参数1:邮箱地址,参数2:姓名(在客户端收件只显示姓名,而不显示邮件地址),参数3:姓名中文字符串编码
new InternetAddress("java_test@sohu.com", "张三_sohu", charset),
new InternetAddress("xyang0917@163.com", "李四_163", charset),
}
);
// 设置抄送
message.setRecipient(RecipientType.CC, new InternetAddress("xyang0917@gmail.com","王五_gmail",charset));
// 设置密送
message.setRecipient(RecipientType.BCC, new InternetAddress("xyang0917@qq.com", "赵六_QQ", charset));
// 设置发送时间
message.setSentDate(new Date());
// 设置回复人(收件人回复此邮件时,默认收件人)
message.setReplyTo(InternetAddress.parse("\"" + MimeUtility.encodeText("田七") + "\" <417067629@qq.com>"));
// 设置优先级(1:紧急 3:普通 5:低)
message.setHeader("X-Priority", "1");
// 要求阅读回执(收件人阅读邮件时会提示回复发件人,表明邮件已收到,并已阅读)
message.setHeader("Disposition-Notification-To", from); // 创建一个MIME子类型为"mixed"的MimeMultipart对象,表示这是一封混合组合类型的邮件
MimeMultipart mailContent = new MimeMultipart("mixed");
message.setContent(mailContent); // 附件
MimeBodyPart attach1 = new MimeBodyPart();
MimeBodyPart attach2 = new MimeBodyPart();
// 内容
MimeBodyPart mailBody = new MimeBodyPart(); // 将附件和内容添加到邮件当中
mailContent.addBodyPart(attach1);
mailContent.addBodyPart(attach2);
mailContent.addBodyPart(mailBody); // 附件1(利用jaf框架读取数据源生成邮件体)
DataSource ds1 = new FileDataSource("resource/Earth.bmp");
DataHandler dh1 = new DataHandler(ds1);
attach1.setFileName(MimeUtility.encodeText("Earth.bmp"));
attach1.setDataHandler(dh1); // 附件2
DataSource ds2 = new FileDataSource("resource/如何学好C语言.txt");
DataHandler dh2 = new DataHandler(ds2);
attach2.setDataHandler(dh2);
attach2.setFileName(MimeUtility.encodeText("如何学好C语言.txt")); // 邮件正文(内嵌图片+html文本)
MimeMultipart body = new MimeMultipart("related"); //邮件正文也是一个组合体,需要指明组合关系
mailBody.setContent(body); // 邮件正文由html和图片构成
MimeBodyPart imgPart = new MimeBodyPart();
MimeBodyPart htmlPart = new MimeBodyPart();
body.addBodyPart(imgPart);
body.addBodyPart(htmlPart); // 正文图片
DataSource ds3 = new FileDataSource("resource/firefoxlogo.png");
DataHandler dh3 = new DataHandler(ds3);
imgPart.setDataHandler(dh3);
imgPart.setContentID("firefoxlogo.png"); // html邮件内容
MimeMultipart htmlMultipart = new MimeMultipart("alternative");
htmlPart.setContent(htmlMultipart);
MimeBodyPart htmlContent = new MimeBodyPart();
htmlContent.setContent(
"<span style='color:red'>这是我自己用java mail发送的邮件哦!" +
"<img src='cid:firefoxlogo.png' /></span>"
, "text/html;charset=gbk");
htmlMultipart.addBodyPart(htmlContent); // 保存邮件内容修改
message.saveChanges(); /*File eml = buildEmlFile(message);
sendMailForEml(eml);*/ // 发送邮件
Transport.send(message);
} /**
* 将邮件内容生成eml文件
* @param message 邮件内容
*/
public static File buildEmlFile(Message message) throws MessagingException, FileNotFoundException, IOException {
File file = new File("c:\\" + MimeUtility.decodeText(message.getSubject())+".eml");
message.writeTo(new FileOutputStream(file));
return file;
} /**
* 发送本地已经生成好的email文件
*/
public static void sendMailForEml(File eml) throws Exception {
// 获得邮件会话
Session session = Session.getInstance(props,new MyAuthenticator());
// 获得邮件内容,即发生前生成的eml文件
InputStream is = new FileInputStream(eml);
MimeMessage message = new MimeMessage(session,is);
//发送邮件
Transport.send(message);
} /**
* 向邮件服务器提交认证信息
*/
static class MyAuthenticator extends Authenticator { private String username = "meijiajiang2016"; private String password = ""; public MyAuthenticator() {
super();
} public MyAuthenticator(String username, String password) {
super();
this.username = username;
this.password = password;
} @Override
protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(username, password);
}
}
}

Java常用工具类之发送邮件的更多相关文章

  1. JavaEE-实验一 Java常用工具类编程

    该博客仅专为我的小伙伴提供参考而附加,没空加上代码具体解析,望各位谅解 1.  使用类String类的分割split 将字符串  “Solutions to selected exercises ca ...

  2. 项目经验分享——Java常用工具类集合 转

    http://blog.csdn.net/xyw591238/article/details/51678525 写在前面     本文涉及的工具类部分是自己编写,另一部分是在项目里收集的.工具类涉及数 ...

  3. JAVA常用工具类汇总

    一.功能方法目录清单: 1.getString(String sSource)的功能是判断参数是否为空,为空返回"",否则返回其值: 2.getString(int iSource ...

  4. Java常用工具类---XML工具类、数据验证工具类

    package com.jarvis.base.util; import java.io.File;import java.io.FileWriter;import java.io.IOExcepti ...

  5. [转]Java常用工具类集合

    转自:http://blog.csdn.net/justdb/article/details/8653166 数据库连接工具类——仅仅获得连接对象 ConnDB.java package com.ut ...

  6. java常用工具类(java技术交流群57388149)

    package com.itjh.javaUtil;   import java.util.ArrayList; import java.util.List;   /** * * String工具类. ...

  7. java 常用工具类

    1. org.apache.commons.collections4包提供CollectionUtils.MapUtils.ListUtils.SetUtils等工具类: 2. org.apache. ...

  8. Java常用工具类之Excel导出

    package com.wazn.learn.util; import java.util.List; import java.util.Map; import org.apache.poi.hssf ...

  9. Java常用工具类之删除文件

    package com.wazn.learn.util; import java.io.File; /** * 删除文件工具类 * @author yangzhenyu * */ public cla ...

随机推荐

  1. 「LibreOJ β Round #4」多项式 (广义欧拉数论定理)

    https://loj.ac/problem/525 题目描述 给定一个正整数 kkk,你需要寻找一个系数均为 0 到 k−1之间的非零多项式 f(x),满足对于任意整数 x 均有 f(x)modk= ...

  2. HDU 6206 青岛网络赛1001 高精度 简单几何

    给出的数据1e12规模,常规判点是否在圆范围内肯定要用到半径,求得过程中无法避免溢出,因此用JAVA自带的浮点大数运算,和个ZZ一样比赛中eclipse出现问题,而且太久没写JAVA语法都不清楚变量忘 ...

  3. CF757 C hash

    一种数字可以变成另一种数,要求每组中变换前后各种数字数量不变,问方案数 对现有每组中的每个数字构造出现在各个组情况的序列,如2 出现在第一组和第二组各一次那么就要加入组别的标号1,2,出现重复次仍要加 ...

  4. Python学习笔记(四十八)POP3收取邮件

    收取邮件就是编写一个MUA作为客户端,从MDA把邮件获取到用户的电脑或者手机上.收取邮件最常用的协议是POP协议,目前版本号是3,俗称POP3. Python内置一个poplib模块,实现了POP3协 ...

  5. 十二步创建你的第一个JavaScript库

    是否曾对Mootools的魔力感到惊奇?是否有想知道Dojo如何做到那样的?是否对jQuery感到好奇?在这个教程中,我们将了解它们背后的东西并且动手创建一个超级简单的你最喜欢的库. 我们其乎每天都在 ...

  6. iOS静态库 ---iOS-Apple苹果官方文档翻译

    iOS静态库 ---iOS-Apple苹果官方文档翻译 •什么是库? 库是共享程序代码的方式,一般分为静态库和动态库.静态库与动态库的区别? 静态库:链接时完整地拷贝至可执行文件中,被多次使⽤用就为什 ...

  7. 在Unity中实现屏幕空间反射Screen Space Reflection(2)

    traceRay函数 在上一篇中,我们有如下签名的traceRay函数 bool traceRay(float3 start, float3 direction, out float2 hitPixe ...

  8. 面向过程编程(OPP) 和面向对象编程(OOP)的关系

    面向过程编程(OPP) 和面向对象编程(OOP)的关系 原文链接:http://blog.csdn.net/phphot/article/details/3985480 关于面向过程的编程(OPP)和 ...

  9. 网易android开发面试题及心得

    前几天面试网易android开发,总体感觉问题难度一般.怪我自己没有好好梳理知识,尤其是基础,后面就没消息了... 笔试: 1.描述Activity 生命周期 2.什么是ANR,如何规避? 3.描述a ...

  10. Ubuntu之镜像iso安装系统

    ubuntu的安装 官网下载iso文件,网址:http://releases.ubuntu.com/16.04.4/, 选择:ubuntu-16.04.4-server-amd64.iso: 下载完毕 ...