JavaMail应用--通过javamail API实现在代码中发送邮件功能

JavaMail应用

在日常开发中,可能会引用到发邮件功能,例如在持续集成中,自动化测试运行完毕,自动将测试结果以报表的形式发送邮件给相关人。那么在Java中如何实现发邮件呢?

在java EE   中有个JavaMail插件 是专门解决java收发邮件功能的,下载地址:http://www.oracle.com/technetwork/java/index-138643.html

下载后我们解压压缩包,提取里面的mail.jar,引入到工程中,便可以使用JavaMail API 进行发送邮件了。

下面是我根据JavaMail封装的用于发送邮件的方法,使用简单方便,只要填写SMTP 服务器地址,端口,用户名,密码,发送内容,发送人地址,收件人地址即可发送邮件

package net.hk515.utils;
import java.util.Properties;

import javax.mail.Address;
import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

import java.util.ArrayList;

import com.sun.mail.smtp.*;

public class SendMail {
	private Log log=new Log(SendMail.class);
	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		SendMail sendMail=new SendMail();
		sendMail.sendmessage("[email protected]", "XXX", "smtp.mxhichina.com", "25", "[email protected]", "[email protected],[email protected]", "测试邮件发送函数", "测试邮件发送函数");

	}
      /**
       *
       * @param userName  发送邮箱账号  [email protected]形式
       * @param passWord  发送邮件密码
       * @param smtpHost  stmp服务器地址
       * @param smtpPort  smtp服务器端口
       * @param from      发件人地址
       * @param tos       收件人地址
       * @param title     标题
       * @param content   内容
       */
	 public void sendmessage(String userName,String passWord,String smtpHost,String smtpPort,String from,String tos ,String title,String content)
	 {
		 Properties smtpProper=setSmtp(smtpHost, smtpPort, userName, passWord);
		 Auth authenticator=new Auth(userName, passWord);
		 try {

			    //创建session实例
		        Session session=Session.getInstance(smtpProper, authenticator);
				 MimeMessage message=new MimeMessage(session);
				 session.setDebug(true);

				 //设置from发件人邮箱地址
				 message.setFrom(new InternetAddress(from));
				 //收件人to LIST
				  ArrayList<Address> toList=new ArrayList<Address>();
				  //收件人字符串通过,号分隔收件人
				  String[] toArray=tos.split(",");
				  for (int i = 0; i < toArray.length; i++)
				   {
					String str = toArray[i];
					toList.add(new InternetAddress(str));
				   }
				  //将收件人列表转换为收件人数组
				  Address[] addresses=new Address[toList.size()];
				  addresses=toList.toArray(addresses);
				 //设置to收件人地址
				 message.setRecipients(MimeMessage.RecipientType.TO,addresses);
				 //设置邮件标题
				 message.setSubject(title);
				 //设置邮件内容
				 message.setContent(content, "text/html;charset=UTF-8");
				 //Transport.send(message);
				 Transport transport=session.getTransport();
				 transport.connect(smtpHost,userName, passWord);
				 transport.sendMessage(message,addresses);
				 log.info("发送邮件成功!");

		} catch (Exception e) {
			// TODO: handle exception
			log.error("发送邮件失败!");
			e.printStackTrace();
		}

	 }

	private Properties setSmtp(String smtpHost,String smtpPort,String userName,String passWord)
	{
		//创建邮件配置文件
	    Properties maiProperties=new Properties();
        //配置smtp发件服务器
        maiProperties.put("mail.transport.protocol", "smtp");
         //配置smtp服务器
        maiProperties.put("mail.smtp.host", smtpHost);
        //配置smtp服务器端口
        maiProperties.put("mail.smtp.port", smtpPort);
        //配置smtp用户名
        maiProperties.put("mail.user", userName);
        //配置smtp身份验证
        maiProperties.put("mail.smtp.auth", "true");
        return maiProperties;

	}

}
//smtp 身份验证类
class Auth extends Authenticator
{
	Properties pwdProperties;
	//构造函数

	public Auth(String userName,String passWord)
	 {
		pwdProperties=new Properties();
		try {
			pwdProperties.put(userName,passWord);
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	 }
	//必须实现 PasswordAuthentication 方法
	 public PasswordAuthentication passwordAuthentication()
	  {
		String userName=getDefaultUserName();
		//当前用户在密码表里
		if (pwdProperties.containsKey(userName)) {
			//取出密码,封装好后返回
			return new PasswordAuthentication(userName, pwdProperties.getProperty(userName).toString());

		}
		else {
			//如果当前用户不在密码表里就返回Null
			System.out.println("当前用户不存在");
			return null;

		 }

	 }

 }

  

时间: 2024-10-15 22:09:50

JavaMail应用--通过javamail API实现在代码中发送邮件功能的相关文章

使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 选择调用的进程为 24 i386 getuid sys_getuid1647 i386 getgid sys_getgid16 使用库函数API方式 使用C代码中嵌入汇编代码方式

实验--使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用(杨光)

使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 攥写人:杨光  学号:20135233 ( *原创作品转载请注明出处*) ( 学习课程:<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验要求: 选择一个系统调用(13号系统调用time除外),系统调用列表参见http://codelab.shiyanlou.com/xref/linux-3.18.6/arch/x86/syscalls/sys

ArcGIS API for Silverlight代码中使用Template模板

原文:ArcGIS API for Silverlight代码中使用Template模板 在项目开发中,会遇到点选中聚焦闪烁效果,但是因为在使用Symbol的时候,会设置一定的OffSetX和OffSetY,所以聚焦闪烁的时候,有些情况下,会出现闪烁点的位置和Symbol的位置不重叠现象,下面的方法就是解决这个问题的. 1.在Silverlight项目中新建一个文件夹Template,新建一个DefaultMarkerSymbol.xaml的Silverlight资源字典文件,如下图: 2.打开

通过库函数API和C代码中嵌入汇编代码剖析系统调用的工作机制

作者:吴乐 山东师范大学<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 本次实验的主要内容就是分别采用API和gcc嵌入汇编的方式调用system_call.系统调用其实就是操作系统提供的服务.我们平时编写的程序,如果仅仅是数值计算,那么所有的过程都是在用户态完成的,但是我们想将变量打印在屏幕上,就必须调用printf,而printf这个函数内部就使用了write这个系统调用.操作系统之所以以system ca

用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

姓名:王晨光 学号:20133232 王晨光 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 本周的实验相比较前面3次实验较为容易理解,这次实验的浅析了系统调用的工作过程,通过用库函数API和C代码嵌入汇编代码两种方式使用同一个系统调用. 我这次实验选择了20号系统调用getpid来获取进程ID.首先我先在网上查阅了getpid函数是用来获取目前进程的ID,许多程序利用取到的此值

linux内核分析第四周-使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

本周作业的主要内容就是采用gcc嵌入汇编的方式调用system call.系统调用其实就是操作系统提供的服务.我们平时编写的程序,如果仅仅是数值计算,那么所有的过程都是在用户态完成的,但是我们想将变量打印在屏幕上,就必须调用printf,而printf这个函数内部就使用了write这个系统调用.操作系统之所以以system call的方式提供服务,是因为如果程序员能够任意操作OS所有的资源,那么将无比危险,所以OS设计出了内核态和用户态. 我们平时编程都是在用户态下,如果我们想要调用系统资源,那

实验四:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

/* getpid.c */ #include <unistd.h> #include <stdio.h> int main() { pid_t pid; pid = getpid(); printf("pid = %d \n",pid); return 0; } 上面是使用函数库API 运行结果: 下面是嵌入汇编代码: /* getpid_asm.c */ #include <unistd.h> #include <stdio.h> i

lab4:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

李俊锋 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.实验原理 1.1系统调用的意义 (1)把用户从底层的硬件编程中解放出来 (2)极大的提高了系统的安全性 (3)使用户程序具有可移植性 1.2系统调用过程 (1)当用户态进程调用一个系统调用时,CPU切换到内核态并开始执行一个内核函数. (2)在Linux中是通过执行int $0x80来执行系统调用的,这条汇编指令产生向量

20135239 益西拉姆 linux内核分析 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

https://drive.wps.cn/preview#l/759e32d65654419cb765da932cdf5cdc 本次直接在wps上写的,因为不能连同图片一起粘贴过来,一个一个粘比较费时,所以弄了个wps链接,只能下载之后观看,但是很快就好啦,不要介意,嘿嘿.