java发邮件

2023-11-18

1.设置邮箱smtp服务,获取第三方授权码

mailHost=smtp.163.com
mailFrom=xxx@163.com
mailUser=xxx
mailPassword=xxxpassword
//主题            
StringBuffer subject = new StringBuffer();
            subject.append("["+queIdArray+"]"+"问题已受理");
//内容           
 StringBuffer body = new StringBuffer();
            body.append(problemOprService.getEmailInfo(queId));
            log.info(body.toString());
            for(UserContact userContact : userList){
                if(null != userContact.getEMail() && userContact.getEMail().length()>0){
//                    mailAddr.append(userContact.getEMail()+";");
                    boolean is = MailSender.sendOut(subject, body, new StringBuffer(userContact.getEMail()+";"));
                    if(!is){
                        istrue = is;
                    }
                }
            }
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Address;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.Multipart;
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;

import org.apache.log4j.Logger;


public class MailSender {
	
	private static Logger log = Logger.getLogger(MailSender.class);
	
	private static final String MAIL_PROPERTIES_PATH = "mail.properties";

	private MimeMessage mimeMsg; // MIME邮件对象

	private Session session; // 邮件会话对象

	private Properties props; // 系统属性

	private boolean needAuth = false; // smtp是否需要认证

	private String username = ""; // smtp认证用户名和密码

	private String password = "";

	private Multipart mp; // Multipart对象,邮件内容,标题,附件等内容均添加到其中后再生成MimeMessage对象

	/**
	 * 构造函数
	 */

	public MailSender() {
		
		setSmtpHost("");// 如果没有指定邮件服务器,就从getConfig类中获取

		createMimeMessage();
	}

	public MailSender(String smtp) {
		
		setSmtpHost(smtp);

		createMimeMessage();
	}

	/**
	 * 
	 * @param hostName
	 *            String
	 * 
	 */

	public void setSmtpHost(String hostName) {

		log.info("设置系统属性:mail.smtp.host = " + hostName);

		if (props == null)
			props = System.getProperties(); // 获得系统属性对象

		props.put("mail.smtp.host", hostName); // 设置SMTP主机

	}

	/**
	 * 
	 * @return boolean
	 * 
	 */

	public boolean createMimeMessage(){

		try {
			log.info("准备获取邮件会话对象!");

			session = Session.getDefaultInstance(props, null); // 获得邮件会话对象
		}catch (Exception e) {

			log.error("获取邮件会话对象时发生错误!" + e);

			return false;
		}

		log.info("准备创建MIME邮件对象!");

		try {

			mimeMsg = new MimeMessage(session); // 创建MIME邮件对象

			mp = new MimeMultipart();

			return true;
		}catch (Exception e) {

			log.error("创建MIME邮件对象失败!" + e);

			return false;
		}
	}

	/**
	 * 
	 * @param need
	 *            boolean
	 * 
	 */

	public void setNeedAuth(boolean need) {

		log.info("设置smtp身份认证:mail.smtp.auth = " + need);

		if (props == null)
			props = System.getProperties();

		if (need) {
			props.put("mail.smtp.auth", "true");
		} else {
			props.put("mail.smtp.auth", "false");
		}
	}

	/**
	 * 
	 * @param name
	 *            String
	 * 
	 * @param pass
	 *            String
	 * 
	 */

	public void setNamePass(String name, String pass) {

		username = name;

		password = pass;

	}

	/**
	 * 
	 * @param mailSubject
	 *            String
	 * 
	 * @return boolean
	 * 
	 */

	public boolean setSubject(String mailSubject) {

		log.info("设置邮件主题!");

		try {
			mimeMsg.setSubject(mailSubject, "GB2312");
			//mimeMsg.setSubject(mailSubject);

			return true;
		}catch (Exception e) {
			log.error("设置邮件主题发生错误!");

			return false;
		}
	}

	/**
	 * 
	 * @param mailBody
	 *            String
	 * 
	 */

	public boolean setBody(String mailBody) {

		try {

			BodyPart bp = new MimeBodyPart();
			bp.setHeader("Content-Transfer-Encoding", "base64"); 
			bp.setContent(mailBody, "text/html;charset=GB2312");

			mp.addBodyPart(bp);

			return true;
		}catch (Exception e) {

			log.error("设置邮件正文时发生错误!" + e);

			return false;
		}
	}

	/**
	 * 
	 * @param name
	 *            String
	 * 
	 * @param pass
	 *            String
	 * 
	 */

	public boolean addFileAffix(String filename) {

		log.info("增加邮件附件:" + filename);

		try {

			BodyPart bp = new MimeBodyPart();

			FileDataSource fileds = new FileDataSource(filename);

			bp.setDataHandler(new DataHandler(fileds));

			bp.setFileName(fileds.getName());

			mp.addBodyPart(bp);

			return true;

		}catch (Exception e) {

			log.error("增加邮件附件:" + filename + "发生错误!" + e);

			return false;
		}
	}

	/**
	 * 
	 * @param name
	 *            String
	 * 
	 * @param pass
	 *            String
	 * 
	 */

	public boolean setFrom(String from) {

		log.info("设置发信人!");

		try {
			//mimeMsg.setFrom(new InternetAddress(from)); // 设置发信人
			mimeMsg.setFrom(new InternetAddress("\"" + MimeUtility.encodeText(from) + "\"<" + from + ">"));
			return true;
		}catch (Exception e){
			
			return false;
		}
	}

	/**
	 * 
	 * @param name
	 *            String
	 * 
	 * @param pass
	 *            String
	 * 
	 */

	public boolean setTo(String to) {

		if (to == null || to.equals(""))
			return false;

		try {

			mimeMsg.setRecipients(Message.RecipientType.TO, InternetAddress
					.parse(to));

			return true;
		}catch (Exception e){
			return false;
		}
	}

	/**
	 * 
	 * @param name
	 *            String
	 * 
	 * @param pass
	 *            String
	 * 
	 */

	public boolean setCopyTo(String copyto){
		if (copyto == null)
			return false;
		try {
			mimeMsg.setRecipients(Message.RecipientType.CC,
					(Address[]) InternetAddress.parse(copyto));

			return true;

		}catch (Exception e){
			return false;
		}
	}

	/**
	 * 
	 * @param name
	 *            String
	 * 
	 * @param pass
	 *            String
	 * 
	 */

	public boolean sendOut(){
		try {

			mimeMsg.setContent(mp);

			mimeMsg.saveChanges();

			log.info("正在发送邮件....");

			Session mailSession = Session.getInstance(props, null);

			Transport transport = mailSession.getTransport("smtp");

			transport.connect((String) props.get("mail.smtp.host"), username,
					password);

			//transport.sendMessage(mimeMsg, mimeMsg.getAllRecipients());
			transport.sendMessage(mimeMsg, mimeMsg.getRecipients(Message.RecipientType.TO));
			
			// transport.send(mimeMsg);

			log.info("发送邮件成功!");

			transport.close();

			return true;

		}catch (Exception e){

			log.error("邮件发送失败!" + e);

			return false;
		}
	}
	
	/**
	 * 
	 * @param name
	 *            String
	 * 
	 * @param pass
	 *            String
	 * 
	 */

	public synchronized static boolean sendOut(StringBuffer subject, StringBuffer body, StringBuffer sendTo){
		MailSender mSender = new MailSender();

		try{
			String mailHost = DataParamReader.getDataParam("mailHost");
			String mailFrom = DataParamReader.getDataParam("mailFrom");
			String mailUser = DataParamReader.getDataParam("mailUser");
			String mailPwd	= DataParamReader.getDataParam("mailPassword");
			String sendTouser = "";
			if(sendTo!=null && !"".equals(sendTo.toString().trim()) && ";".equals(sendTo.substring(sendTo.toString().trim().length()-1))){
				sendTouser = sendTo.substring(0,sendTo.toString().trim().length()-1);
			}
			log.info("host = " + mailHost + ", from = " + mailFrom + ", user = " + mailUser + ", password = " + mailPwd + ",sendTo= "+sendTouser);
			
			if (subject != null && body != null && sendTo != null && !"".equals(sendTo.toString().trim())){
				mSender.setSmtpHost(mailHost);
				mSender.setNeedAuth(true);
				mSender.setFrom(mailFrom);
				mSender.setNamePass(mailUser, mailPwd);
				mSender.setSubject(subject.toString());
				mSender.setBody(body.toString());
				mSender.setTo(sendTouser);
				//mSender.setCopyTo(mailFrom);
				return mSender.sendOut();
			}
		}catch (Exception e){
			log.error(e);
			return false;
		}
		return false;
	}
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java发邮件 的相关文章

  • maven工程编译生成source包

    开发Java服务端项目的时候 经常需要开发SDK作为依赖包提供给目标工程引用 但是目标工程在运行的调试的时候断点到依赖包里面的代码 由于依赖包的代码是编译后端class类 和源码有不少差异 不方便阅读 所以在开发的时候最好生成源码形式的依赖
  • Linux下Android Studio的安装步骤及关键点【整理】

    2013年google公司发布了一个新的Android集成开发环境 Android Studio 它为Android开发者提供了更多便利 而google慢慢地已经把重心放到Android Studio的开发上了 所以对于Android工程师
  • Allegro输出带等长规则的Excel操作指导

    Allegro输出带等长规则的Excel操作指导 Allegro可以输出带等长规则的Excel文件 方便检查和查阅 具体操作如下 打开规则管理器 选择Relative Propagation Delay 选择需要输出的match group
  • 如何清除SQL Server Management Studio的最近服务器列表

    SQL Server Management Studio SSMS 的 连接到服务器 对话框会记录用户所有访问过的服务器名称 这个功能对于经常连接多个数据库的人来说确实挺方便的 不过使用了一段时间之后 这个列表会变得很长 里面还有很多服务器
  • 利用原生js实现随机颜色画布

    这几天复习了一下js的DOM 文档对象模型 部分 看到鼠标事件的时候想到可以试着写一个js画布的案例 一 实现思路 1 利用js绑定鼠标按下事件 鼠标放开事件 在通过鼠标移动事件 获取鼠标所在位置 2 通过鼠标移动事件动态创建节点挂载到页面

随机推荐

  • 家庭实验室系列文章-电脑如何配置网络唤醒 (WOL)?

    前言 其实这个专题很久很久之前就想写了 但是一直因为各种原因拖着没动笔 因为没有资格 也没有钱在一线城市买房 但是在要结婚之前 婚房又是刚需 我和太太最终一起在一线城市周边的某二线城市买了房 再之后 一起装修 她负责非电相关 我负责电 网相
  • 字符串与数组的相互转换

    一 数组转字符串 arr join 指定符号 用指定符号把数组元素连接起来 返回连接好的字符串 let arr 1 2 3 4 arr join 1 2 3 4 arr join 1 2 3 4 二 字符串转数组 多个元素 str spli
  • Android NDK开发-环境搭建(一)

    一 概念 Android NDK Android Native Development Kit 简称NDK Android NDK 是一组允许您将 C 或 C 原生代码 嵌入到 Android 应用中的工具 能够在 Android 应用中使
  • python多进程原理及其实现

    文章目录 1 进程的基本概念 2 父进程和子进程 2 1 父子进程如何区分 2 2 子进程如何回收 3 Python进程模块 3 1 fork 3 2 Process进程 3 3 进程池POOL 多个进程 4 进程间通信方式 5 多进程实现
  • SOLOv2 学习笔记

    博客原文 https blog csdn net weixin 44270815 article details 105283301 模型下载教程 https blog csdn net weixin 44270815 article de
  • Win64安装cx_Oracle过程

    学习python过程中 因需要连接oracle数据库 所以要安装cx Oracle 我的电脑是WIN64 python是2 7版本 本地oracle client是32位的 安装过cx Oracle 5 2 1 11g win amd64
  • js实现word转化为html

  • windows8.1 vs2015 dlib库cpu 版本编译以及应用 library is 90, caller expects 80

    近期由于要做一个关于人脸计数的项目 因此对dlib库进行了编译和使用 其中遇到了不少问题 下面请听我一一道来 第一步 从dlib官网下载dlib源码 链接地址 https github com davisking dlib 第二步 采用cm
  • PrimeTime中的DMSA

    第一次尝试使用PT的DMSA 步骤存在太多的弯弯绕绕了 这里记录一下 一 什么是DMSA 在PT中 我们将一种operating mode 如FUNC DFT等 和一种operating condition 如WC WCZ AVS等 的组合
  • SQLDEVELOPER启动警告 - 无法安装某些模块: oracle.jewt_core - org.netbeans.InvalidException: Netigso

    https bbs csdn net topics 390721236 page 1 SQL Developer第一次启动后没问题 但是第二次启动后就报错 根据如下步骤可以解决 1 Go to C Users USERNAME AppDat
  • C#操作MongoDB,看我这一篇就够了!

    一 准备工作 工欲善其事必先利其器 首先呢咱们得下载好C 程序里面可以驱动mongodb的组件 走起官网 C 操作mongodb组件下载 菜鸟教程也上一上 mongodb菜鸟教程 dll下载下来之后有这几个 都引用上 不要省 哈哈 个人还是
  • 算法学习(四)查找问题

    一 查找问题通常有2类 1 查找有无 元素a是否存在 set 集合 2 查找对应关系 键值对应 元素a出现了几次 map 字典 leetcode349 两个数组的交集 给定两个数组 编写一个函数来计算它们的交集 输出结果中的每个元素一定是唯
  • 11-矩阵(matrix)_方阵_对称阵_单位阵_对角阵

    矩阵 向量是对数的拓展 一个向量表示一组数 矩阵是对向量的拓展 一个矩阵表示一组向量 1 2
  • win10+pytorch(gpu)下载安装中踩的坑,下载安装全流程

    整个下载安装的流程如下 1 查看自己的电脑显卡是否支持gpu 具体查看方式可以参考我的这一篇文章 CUDA cuDNN下载安装 配备GPU环境 九九19496的博客 CSDN博客 但先不要下载cuda和cudnn 2 确定自己想要的pyto
  • TCP流式服务的粘包问题及解决方法

    TCP流式服务的粘包问题 有可能将两次send的内容合并在一起被接受端收到 解决方法 发送定长包 包层加入 r n标记 FTP协议就是这么做的 但这种方案存在的问题就是 如果数据正文存在同样的字符 就会被误判为消息的边界 包头加上包体长度
  • requery与ajax,总结一下query中ajax的几种方法

    1 a中比需抖接朋功要朋插jax ajax type POST 提交数据的类型 POST GET url testLogin aspx 提交的网址 提交的数据 data Name sanmao Password sanmaoword 返回数
  • 职高计算机班主任工作计划,教学工作计划:高职班主任工作计划

    作为高职院校各专业的班主任 面临着教学理念和班级管理双重压力 高职班主任工作计划不仅要从学生学习上进行合理计划 更要从学生思想教育上进行计划 以下是小编整理的高职班主任工作计划 欢迎大家参阅 高职班主任工作计划 装潢专业 经过一年半的锻炼与
  • java对list集合进行分页

    1 计算页数 List
  • CAN总线之错误检测以及错误状态简介

    CAN总线之错误检测以及错误状态简介 1 CAN错误检测特点简介 1 1错误检测机制 2 错误 2 1错误状态的种类 本文参考瑞萨的 CAN总线入门 周立功的 现场总线CANopen设计与应用 1 CAN错误检测特点简介 错误检测是CAN的
  • java发邮件

    1 设置邮箱smtp服务 获取第三方授权码 mailHost smtp 163 com mailFrom xxx 163 com mailUser xxx mailPassword xxxpassword 主题 StringBuffer s