JAVA实现的电子邮件发送器

       由于项目中需要用到利用JAVA发送电子邮件。于是找了些样例,然后找到网友写的一个类,实现过程中发现由于网易等国内的主流邮箱为了杜绝垃圾短信的群发,都需要用户名和密码的验证。然后就加了一个校验发件人权限的类MyAuthenticator。      
       JAVA发送电子邮件主要依靠的是 javamail这个项目中的mail.jar包,上面项目链接里有对应jar包以及开发文档的下载。

       以下是Mail的类

/**
 * @function Java实现的邮件发送
 * @author zhangchaoxu@bjtu.edu.cn
 * @version 1.0 2011-08-30
 */
import java.io.File;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Date;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Address;
import javax.mail.MessagingException;
import javax.mail.NoSuchProviderException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
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;

public class Mail {
	/** 发件方式 - 普通发送 */
	final public static int TO = 0;
	/** 发件方式 - 抄送 */
	final public static int CC = 1;
	/** 发件方式 - 密件抄送 */
	final public static int BCC = 2;

	/** 邮件相关信息 - SMTP 服务器 */
	private String mailSMTPHost = null;
	/** 邮件相关信息 - 邮件用户名 */
	private String mailUser = null;
	/** 邮件相关信息 - 密码 */
	private String mailPassword = null;
	/** 邮件相关信息 - 发件人邮件地址 */
	private String mailFromAddress = null;
	/** 邮件相关信息 - 邮件主题 */
	private String mailSubject = "";
	/** 邮件相关信息 - 邮件发送地址 */
	private Address[] mailTOAddress = null;
	/** 邮件相关信息 - 邮件抄送地址 */
	private Address[] mailCCAddress = null;
	/** 邮件相关信息 - 邮件密件抄送地址 */
	private Address[] mailBCCAddress = null;
	/** 邮件相关信息 - 邮件正文(复合结构) */
	private MimeMultipart mailBody = null;

	public Mail() {
		mailBody = new MimeMultipart();
	}

	/**
	 * 设置 SMTP 服务器
	 * @param strSMTPHost 邮件服务器名称或 IP
	 * @param strUser 邮件用户名
	 * @param strPassword 密码
	 */
	public void setSMTPHost(String strSMTPHost, String strUser, String strPassword) {
		this.mailSMTPHost = strSMTPHost;
		this.mailUser = strUser;
		this.mailPassword = strPassword;
	}

	/**
	 * 设置邮件发送地址
	 * @param strFromAddress  邮件发送地址
	 */
	public void setFromAddress(String strFromAddress) {
		this.mailFromAddress = strFromAddress;
	}

	/**
	 * 设置邮件目的地址
	 * @param strAddress 邮件目的地址列表, 不同的地址可用;号分隔
	 * @param iAddressType 邮件发送方式 (TO 0, CC 1, BCC 2) 常量已在本类定义
	 */
	public void setAddress(String strAddress, int iAddressType) {
		switch (iAddressType) {
		case Mail.TO: {
			String[] alAddress = StringHelper.split(strAddress, ";");
			mailTOAddress = new Address[alAddress.length];
			for (int i = 0; i < alAddress.length; i++) {
				try {
					mailTOAddress[i] = new InternetAddress((String) alAddress[i]);
				} catch (AddressException e) {
					System.out.println("收件箱地址错误!");
					e.printStackTrace();
				}
			}
			break;
		}
		case Mail.CC: {
			String[] alAddress = StringHelper.split(strAddress, ";");
			mailCCAddress = new Address[alAddress.length];
			for (int i = 0; i < alAddress.length; i++) {
				try {
					mailCCAddress[i] = new InternetAddress((String) alAddress[i]);
				} catch (AddressException e) {
					System.out.println("抄送地址错误!");
					e.printStackTrace();
				}
			}
			break;
		}
		case Mail.BCC: {
			String[] alAddress = StringHelper.split(strAddress, ";");
			mailBCCAddress = new Address[alAddress.length];
			for (int i = 0; i < alAddress.length; i++) {
				try {
					mailBCCAddress[i] = new InternetAddress((String) alAddress[i]);
				} catch (AddressException e) {
					System.out.println("密件抄送地址错误!");
					e.printStackTrace();
				}
			}
			break;
		}
		}
	}

	/**
	 * 设置邮件主题
	 * @param strSubject 邮件主题
	 */
	public void setSubject(String strSubject) {
		this.mailSubject = strSubject;
	}

	/**
	 * 设置邮件文本正文
	 * @param strTextBody 邮件文本正文
	 */
	public void setTextBody(String strTextBody) {
		MimeBodyPart mimebodypart = new MimeBodyPart();
		try {
			mimebodypart.setText(strTextBody, "GBK");
		} catch (MessagingException e) {
			System.out.println("邮件文本正文设置错误!");
			e.printStackTrace();
		}
		try {
			mailBody.addBodyPart(mimebodypart);
		} catch (MessagingException e) {
			System.out.println("邮件文本正文增加错误!");
			e.printStackTrace();
		}
	}

	/**
	 * 设置邮件超文本正文
	 * @param strHtmlBody 邮件超文本正文
	 */
	public void setHtmlBody(String strHtmlBody) {
		MimeBodyPart mimebodypart = new MimeBodyPart();
		try {
			mimebodypart.setDataHandler(new DataHandler(strHtmlBody,"text/html;charset=GBK"));
		} catch (MessagingException e) {
			System.out.println("邮件超文本正文设置错误!");
			e.printStackTrace();
		}
		try {
			mailBody.addBodyPart(mimebodypart);
		} catch (MessagingException e) {
			System.out.println("邮件超文本正文增加错误!");
			e.printStackTrace();
		}
	}

	/**
	 * 设置邮件正文外部链接 URL, 信体中将包含链接所指向的内容
	 * @param strURLAttachment 邮件正文外部链接 URL
	 */
	public void setURLAttachment(String strURLAttachment) {
		MimeBodyPart mimebodypart = new MimeBodyPart();
		try {
			mimebodypart.setDataHandler(new DataHandler(new URL(strURLAttachment)));
			mailBody.addBodyPart(mimebodypart);
		} catch (MalformedURLException e) {
			System.out.println("邮件正文外部链接 URL错误!");
			e.printStackTrace();
		} catch (MessagingException e) {
			System.out.println("邮件正文外部链接 URLMessage错误!");
			e.printStackTrace();
		}
	}

	/**
	 * 设置邮件附件
	 * @param strFileAttachment 文件的全路径
	 */
	public void setFileAttachment(String strFileAttachment) {
		File path = new File(strFileAttachment);
		if (!path.exists() || path.isDirectory()) {
			return;
		}
		String strFileName = path.getName();
		MimeBodyPart mimebodypart = new MimeBodyPart();
		try {
			mimebodypart.setDataHandler(new DataHandler(new FileDataSource(strFileAttachment)));
			mimebodypart.setFileName(MimeUtility.encodeText(strFileName));
			mailBody.addBodyPart(mimebodypart);
		} catch (MessagingException e) {
			System.out.println("附件设置错误");
			e.printStackTrace();
		} catch (UnsupportedEncodingException e) {
			System.out.println("附件设置编码错误");
			e.printStackTrace();
		}

	}

	/**
	 * 邮件发送(一次发送多个地址, 优点速度快, 但是有非法邮件地址时将中断发送操作)
	 */
	public boolean sendBatch() {
		Properties properties = new Properties();
		properties.put("mail.smtp.host", this.mailSMTPHost);
		// 由于国内许多邮箱如网易等需要验证,因此增加验证
		// Session session = Session.getInstance(properties, null);
		properties.put("mail.smtp.auth", "true");
		MyAuthenticator myauth = new MyAuthenticator(this.mailUser,this.mailPassword);
		Session session = Session.getDefaultInstance(properties, myauth);
		MimeMessage mimemessage = new MimeMessage(session);
		try {
			mimemessage.setFrom(new InternetAddress(this.mailFromAddress));
		} catch (AddressException e) {
			System.out.println("发送邮箱Address异常!");
			e.printStackTrace();
			return false;
		} catch (MessagingException e) {
			System.out.println("发送邮箱Messaging异常!");
			e.printStackTrace();
			return false;
		}
		try {
			if (mailTOAddress != null) {
				mimemessage.addRecipients(javax.mail.Message.RecipientType.TO,this.mailTOAddress);
			}
			if (mailCCAddress != null) {
				mimemessage.addRecipients(javax.mail.Message.RecipientType.CC,this.mailCCAddress);
			}
			if (mailBCCAddress != null) {
				mimemessage.addRecipients(javax.mail.Message.RecipientType.BCC,this.mailBCCAddress);
			}
		} catch (MessagingException e) {
			System.out.println("接受邮箱Messaging异常!");
			e.printStackTrace();
			return false;
		}
		try {
			mimemessage.setSubject(this.mailSubject);
		} catch (MessagingException e) {
			System.out.println("设置主题Messaging异常!");
			e.printStackTrace();
			return false;
		}
		try {
			mimemessage.setContent(this.mailBody);
		} catch (MessagingException e) {
			System.out.println("设置内容Messaging异常!");
			e.printStackTrace();
			return false;
		}
		try {
			mimemessage.setSentDate(new Date());
		} catch (MessagingException e) {
			System.out.println("设置发送日期Messaging异常!");
			e.printStackTrace();
			return false;
		}
		Transport transport;
		try {
			transport = session.getTransport("smtp");
			transport.connect(this.mailSMTPHost, this.mailUser,this.mailPassword);
		} catch (NoSuchProviderException e) {
			System.out.println("获取SMTP时NoSuchProvider异常!");
			e.printStackTrace();
			return false;
		} catch (MessagingException e) {
			System.out.println("连接发送邮箱服务器Messaging异常!");
			e.printStackTrace();
			return false;
		}
		try {
			Transport.send(mimemessage);
		} catch (MessagingException e) {
			System.out.println("邮件发送Messaging异常!");
			e.printStackTrace();
			return false;
		}
		System.out.println("已向下列邮箱发送了邮件");
		if (mailTOAddress != null) {
			for (int i = 0; i < mailTOAddress.length; i++) {
				System.out.println(mailTOAddress[i]);
			}
		}
		if (mailCCAddress != null) {
			for (int i = 0; i < mailTOAddress.length; i++) {
				System.out.println(mailCCAddress[i]);
			}
		}
		if (mailBCCAddress != null) {
			for (int i = 0; i < mailTOAddress.length; i++) {
				System.out.println(mailBCCAddress[i]);
			}
		}
		return true;
	}
}

/**
 * @function 校验发信人权限
 */
class MyAuthenticator extends javax.mail.Authenticator {
	private String strUser;
	private String strPwd;
	public MyAuthenticator(String user, String password) {
		this.strUser = user;
		this.strPwd = password;
	}
	protected PasswordAuthentication getPasswordAuthentication() {
		return new PasswordAuthentication(strUser, strPwd);
	}
}
     其中为了分割字符串,还用到了一个StringHelper类,下载地址 http://code.google.com/p/esp4u/downloads/list

    再附上一个jUnit的测试类

/**
 * Mail类测试发送电子邮件
 */
import junit.framework.TestCase;

public class MailSenderTest extends TestCase {
	public void testMail(){
		Mail mail = new Mail();
		mail.setAddress("xx@163.com;yy@qq.com;zz@126.com", Mail.TO);
                // 设置发送邮箱
		mail.setFromAddress("dd@dd.com");
		mail.setSMTPHost("smtp.163.com", "您的邮件用户名", "密码");
		mail.setSubject("主题测试");
		//mail.setTextBody("testBody");
		mail.setHtmlBody("<B>内容测试</B>");
		mail.setFileAttachment("C:/测试附件.docx");
	
		assertTrue(mail.sendBatch());
	}
}



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Java中发送电子邮件可以使用JavaMail API。以下是一个简单的示例代码,演示如何使用JavaMail发送电子邮件: 首先,需要导入JavaMail和相关的依赖库。你可以从JavaMail官方网站下载它们,或者使用Maven/Gradle等构建工具进行引入。 ```java import javax.mail.*; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import java.util.Properties; public class EmailSender { public static void main(String[] args) { // 邮件发送者的邮箱账号和密码 String senderEmail = "your_sender_email@example.com"; String senderPassword = "your_sender_password"; // 邮件接收者的邮箱地址 String recipientEmail = "recipient@example.com"; // 邮件主题和内容 String emailSubject = "Hello from JavaMail"; String emailContent = "This is a test email sent from JavaMail."; // 配置发送邮件的属性 Properties props = new Properties(); props.put("mail.smtp.auth", "true"); props.put("mail.smtp.starttls.enable", "true"); props.put("mail.smtp.host", "smtp.example.com"); // 邮件服务主机名 props.put("mail.smtp.port", "587"); // 邮件服务端口号 // 创建Session对象,并根据配置信息创建认证 Session session = Session.getInstance(props, new Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(senderEmail, senderPassword); } }); try { // 创建MimeMessage对象 Message message = new MimeMessage(session); // 设置发件人 message.setFrom(new InternetAddress(senderEmail)); // 设置收件人 message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(recipientEmail)); // 设置邮件主题 message.setSubject(emailSubject); // 设置邮件正文 message.setText(emailContent); // 发送邮件 Transport.send(message); System.out.println("Email sent successfully."); } catch (MessagingException e) { e.printStackTrace(); } } } ``` 在代码中,你需要替换以下内容: - `your_sender_email@example.com`:发送者的电子邮箱地址。 - `your_sender_password`:发送者的电子邮箱密码。 - `recipient@example.com`:接收者的电子邮箱地址。 - `smtp.example.com`:SMTP服务主机名。根据你使用的电子邮箱提供商不同,主机名可能会有所不同。 请确保已经安装并正确配置了JavaMail API,以及正确填写了邮件发送和接收的相关信息。运行代码后,如果一切正常,你将看到输出信息"Email sent successfully.",表示邮件已成功发送。 这只是一个简单的示例,实际使用中可能需要更多的配置和处理,例如添加附件、HTML格式的邮件内容等。你可以根据自己的需求进行扩展和修改。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值