Java 发送附件邮件

概要:

本实例将演示如何使用Java Mail API发送带有附件的邮件(附件可以是任何形式的文件,而且数量没有限制)。

| |目录

技术要点

发送带附件的邮件的技术要点如下:

  • 发送带附件的邮件时必须使用MimeMultipart类和MimeBodyPart类。MimeMultipart类是Multipart抽象类的子类,也是一个容器类,包含MimeBodyPart类型的对象。MimeBodyPart类表示MIME正文部分,可以存储HTML子内容,也可以存储二进制数据,如图片。

  • MimeMultipart类的addBodyPart(BodyPart part)方法将BodyPart添加到Multipart中。

  • MimeBodyPart的setDataHandler方法将给定的DataHandler对象设置为此AttachmentPart对象的数据处理程序。然后通过FileDataSource的构造方法将文件的File对象作为参数创建文件数据源FileDataSource对象,最后通过DataHandler的构造方法,将FileDataSource对象作为参数,创建DataHandler对象,这样就可以把文件内容设置到邮件消息中,便形成了邮件的附件。

  • MimeBodyPart的setFileName方法给附件设置文件名。

准备工作

    MailAttorney.java 和 Mail_SendProper.java 获取地址 Java 发送邮件 

代码实现

Send_Attachments.java

package net.xsoftlab.baike;
import java.io.File;
import java.util.Date;
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;
/**
 * 发送带附件的邮件
 */
public class Send_Attachments {
	public static boolean sendMail(Mail_SendProper mailSender) {
		MailAttorney authenticator = null;
		if (mailSender.isIsvalidate()) {// 判断是否需要身份认证
			authenticator = new MailAttorney(mailSender.getUserName(),
					mailSender.getPassword());// 如果需要身份认证,则创建一个密码验证器
		}
		Session sendMailSession = Session.getInstance(
				mailSender.getProperties(), authenticator);// 根据邮件发送的属性和密码验证器构造一个发送邮件的session
		try {
			Message mailMessage = new MimeMessage(sendMailSession);// 根据session创建一个邮件消息
			Address from = new InternetAddress(mailSender.getSendAddress());// 创建邮件发送者地址
			mailMessage.setFrom(from); // 设置邮件消息的发送者地址
			Address to = new InternetAddress(mailSender.getReceiveAddress());// 创建邮件的接收者地址
			mailMessage.setRecipient(Message.RecipientType.TO, to);// 设置邮件消息的接收者地址
			mailMessage.setSubject(mailSender.getSubject()); // 设置邮件消息的主题
			mailMessage.setSentDate(new Date()); // 设置邮件消息发送的时间
			Multipart mainPart = new MimeMultipart();// MiniMultipart类是一个容器类,包含MimeBodyPart类型的对象
			BodyPart html = new MimeBodyPart(); // 创建一个包含HTML内容的MimeBodyPart
			html.setContent(mailSender.getContent(), "text/html; charset=utf-8"); // 设置HTML内容
			mainPart.addBodyPart(html);
			String[] attachFileNames = mailSender.getAttachFileNames();// 为邮件添加附件
			if (attachFileNames != null && attachFileNames.length > 0) {
				MimeBodyPart attachment = null;// 存放邮件附件的MimeBodyPart
				File file = null;
				for (int i = 0; i < attachFileNames.length; i++) {
					attachment = new MimeBodyPart();
					file = new File(attachFileNames[i]);// 根据附件文件创建文件数据源
					FileDataSource fds = new FileDataSource(file);
					attachment.setDataHandler(new DataHandler(fds));
					attachment.setFileName(MimeUtility.encodeWord(
							file.getName(), "utf-8", null)); // 为附件设置文件名
					mainPart.addBodyPart(attachment);
				}
			}
			mailMessage.setContent(mainPart);// 将MiniMultipart对象设置为邮件内容
			Transport.send(mailMessage);// 发送邮件
			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}
	public static void main(String[] args) {
		// 创建邮件信息
		Mail_SendProper mailSender = new Mail_SendProper();
		mailSender.setHost("smtp.163.com");
		mailSender.setPort("25");
		mailSender.setIsvalidate(true);
		mailSender.setUserName("xxx@163.com");
		mailSender.setPassword("xxx");
		mailSender.setSendAddress("xxx@163.com");
		mailSender.setReceiveAddress("xxx@163.com");
		mailSender.setSubject("带附件的邮件测试");
		mailSender.setContent("我上传了附件,请注意查收
 测试成功!");
		String[] fileNames = new String[1];
		fileNames[0] = "E:/1.txt";
		mailSender.setAttachFileNames(fileNames);
		Send_Attachments.sendMail(mailSender);
	}
}

程序解读

  1. Send_Mail()构造方法发送带附件的邮件,参数为Mail_SendProper对象,通过Mail_SendProper对象来判断是否需要身份认证。

  2. 发送附件邮件与发送普通邮件一样,首先构造邮件会话Session,然后根据Session创建一个MimeMessage对象并设置相关的信息,如发送者地址、接收者地址、主题、发送时间和文本内容等。

  3. MimeBodyPart保存附件的步骤如下: 

    1. 构造File对象。

    2. 将File构造成FileDataSource对象。

    3. 将FileDataSource对象作为参数构造DataHandler对象。

    4. 调用MimeBodyPart的setDataHandler方法把附件添加到MimeBodyPart中。

    5. 调用MimeBodyPart的setFileName()方法为附件设置文件名。

    6. 调用MimeUtility的encodeWord()方法将文件名用GBK字符集进行编码。目的是使文件名可以支持中文。

    7. 调用MimeMultipart的addBodyPart()方法把构建好的MimeBodyPart对象保存到邮件消息中。

    8. 调用MimeMessage的setContent()方法把MimeMultipart设为邮件内容。


评论关闭
评论 还能输入200
评论关闭
评论 还能输入200
  • 全部评论(0)
资料加载中...
已关注 , 取消