`
Everyday都不同
  • 浏览: 723468 次
  • 性别: Icon_minigender_1
  • 来自: 宇宙
社区版块
存档分类
最新评论

Java Mail发送邮件(带多个附件)

阅读更多

Java Mail是利用已存在的邮箱账号,不必登录如网易邮箱,qq邮箱等官方邮箱网站而使用程序发送邮件。这在web中很常见,比如直接在招聘网站给hr发邮件就是一个典型运用。

利用Java Mail发送邮件的大致步骤:

 

1.首先,构建一个用于登录校验的类,确保你对此邮箱账户有发送邮件的权限。(相当于登录邮箱的过程)

public class MailAuthenticator extends Authenticator {
	
	private String username;
	private String password;
	
	//带参数的构造器,初始化邮箱登录的用户名和密码
	public MailAuthenticator(String username, String password) {
//		super();
		this.username = username;
		this.password = password;
	}
	
//重写该方法,获得	PasswordAuthentication 	对象
	@Override
	protected PasswordAuthentication getPasswordAuthentication() {
		return new PasswordAuthentication(username, password);
	}



	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	
	
}

 

2.简单邮件类,包括主题(subject)和内容(content)。

public class SimpleMail {
	
	private String subject;
	private Object content;
	
	
	public SimpleMail(String subject, Object content) {
		super();
		this.subject = subject;
		this.content = content;
	}
	
	public String getSubject() {
		return subject;
	}
	public void setSubject(String subject) {
		this.subject = subject;
	}
	public Object getContent() {
		return content;
	}
	public void setContent(Object content) {
		this.content = content;
	}
	
	
}

 

 

3.发送邮件的工具类

3.1)一些必备属性 vs 邮件发送初始化(构造器)

//发送邮件的props文件
	private Properties props = System.getProperties();
	//邮件服务器的登录验证
	private MailAuthenticator authenticator;
	//邮箱发送会话
	private Session session;

        public MailSender(String username, String password) {
 
               //根据发送邮箱的账号解析出smtp服务器
		String smtpHostName = "smtp." + username.split("@")[1];
                //初始化props
		props.put("mail.smtp.auth", "true");
		props.put("mail.smtp.host", smtpHostName);
		//发送验证
		authenticator = new MailAuthenticator(username,password);
		//创建邮箱收发会话的session
		session = Session.getInstance(props, authenticator);
	}

 

 

3.2)发送邮件的方法

 

情形一:简单邮件(不含附件)发送

//向一个人发送邮件
	public void send(String recipient, SimpleMail mail) throws AddressException, MessagingException {
		//根据session创建MimeMessage
		MimeMessage message = new MimeMessage(session);
		//发件人
		message.setFrom(new InternetAddress(authenticator.getUsername()));
		//收件人 
		message.setRecipient(RecipientType.TO, new InternetAddress(recipient));
		
		//主题
		message.setSubject(mail.getSubject());
		//内容
		message.setContent(mail.getContent().toString(), "text/html;charset=utf-8");
		//发送
		Transport.send(message);
	}

 

情形二:简单邮件群发

 

只需把收件人改成一个集合,但传入message的recipient应为数组

public void send(List<String> recipients, SimpleMail mail) throws MessagingException {
//.............................		
		//收件人们
		InternetAddress[] addresses = new InternetAddress[recipients.size()];
		for(int i=0; i< addresses.length; i++) {
			addresses[i] = new InternetAddress(recipients.get(i));
		}
		message.setRecipients(RecipientType.TO, addresses);
//..............................		
	}

 

情形三:带多个附件发送

 

//向一个人发送邮件(带多个附件)
		public void send(String recipient, SimpleMail mail, List<File> attachments) throws AddressException, MessagingException, UnsupportedEncodingException {
			//根据session创建MimeMessage
			MimeMessage message = new MimeMessage(session);
			//发件人
			message.setFrom(new InternetAddress(authenticator.getUsername()));
			//收件人
			message.setRecipient(RecipientType.TO, new InternetAddress(recipient));
			
			//主题
			message.setSubject(mail.getSubject());
			
			Multipart multipart = new MimeMultipart(); 
			//邮件正文
			BodyPart contentPart = new MimeBodyPart();
			contentPart.setContent(mail.getContent(), "text/html;charset=utf-8");
			multipart.addBodyPart(contentPart);
			//邮件附件
			if(attachments != null) {
				for(File attachment : attachments) {
					BodyPart attachmentPart = new MimeBodyPart();
					DataSource source = new FileDataSource(attachment);
					attachmentPart.setDataHandler(new DataHandler(source));
					//避免中文乱码的处理
					attachmentPart.setFileName(MimeUtility.encodeWord(attachment.getName()));
					multipart.addBodyPart(attachmentPart);
				}
			}
			message.setContent(multipart);
			//保存邮件
			message.saveChanges();
			Transport.send(message);
		}

 注:带一个附件的写法很简单,就是把方法的形参变为File attachment,而邮件附件里不用for循环即可。同理,带多个附件和一个附件的群发原理大致,此处省略……

 

 

方法小结:

注意带附件和不带附件的写法上的区别——不带附件的简单邮件只需用MimeMessage 对象包装即可,加上设置其subject(主题),content(内容)即可发送;而带附件的邮件对象的正文需用Multipart 包装,其中Multipart 又包括邮件内容(content)和邮件附件,这两个字部分都是用BodyPart 包装的。

 

4.遇到的问题

1)java.lang.NoClassDefFoundError: com/sun/mail/util/LineInputStream

造成这个错误是由于mail.jar包里的javax.mail和javax.activation和java ee包里的javax.mail和javax.activation冲突了,只需到达myeclipse安装目录下找到java ee包里的javax.mail和javax.activation,把这两个目录删除即可——千万不要删除整个javaee.jar包!

2)javax.mail.AuthenticationFailedException: 454 Authentication failed, please open smtp flag first!

确保收发邮箱的SMTP/POP3功能已经开启!

 

5.测试类(以带多个附件的邮件发送为例)

public static void main(String[] args) {
		SimpleMailSender sender = new SimpleMailSender("xxxxx@126.com", "xxxxx");
		String subject = "这是一份测试邮件4";
		Object content = "今天天气真好啊!<br/>注:附件为一封日志文件和图片";
		SimpleMail mail = new SimpleMail(subject, content);
		try {
//			List<String> recipients = new ArrayList<String>();
//			recipients.add("xxxx@sohu.com");
//			recipients.add("xxxx@yean.net");
//			sender.send(recipients, mail);
			List<File> attaches = new ArrayList<File>();
			File attach1 = new File("C:\\Users\\xxxx\\Desktop\\log.txt");
			File attach2 = new File("C:\\Users\\xxx\\Desktop\\彩虹.jpg");
			attaches.add(attach1);
			attaches.add(attach2);
			sender.send("yyyyy@sohu.com", mail, attaches);
			System.out.println("发送成功!");
		} catch (AddressException e) {
			System.out.println("未找到接收邮箱");
			e.printStackTrace();
		} catch (MessagingException e) {
			System.out.println("发送失败"); 
			e.printStackTrace();
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

打开接收邮箱,可看到邮件:

 


   主题:         

 

内容

 

附件

 

 

 

 

  • 大小: 1.5 KB
  • 大小: 3.4 KB
  • 大小: 7.9 KB
分享到:
评论

相关推荐

    java 发送附件mail

    在Java编程中,发送带有附件的邮件是一项常见的任务,尤其在企业级应用或者自动化脚本中。这个场景通常涉及到JavaMail API的使用,一个强大的库,可以用来处理SMTP(简单邮件传输协议)邮件服务。接下来,我们将深入...

    javaemail发送邮件(带附件)

    4. 使用addAttachfile方法来添加附件,支持多个附件的发送。 5. 使用setIfAuth方法来开启发送账户验证,确保邮件发送的安全性。 6. 使用send方法来发送邮件,返回发送结果的HashMap对象。 7. 使用Exception类来捕获...

    java 邮件发送 可带附件

    下面是一个简单的Java邮件发送带附件的示例: ```java import javax.mail.*; import javax.mail.internet.*; import java.util.Properties; public class EmailSender { public static void main(String[] args) ...

    java mail 发送邮件

    在Java应用程序中,我们通常使用JavaMail API来实现邮件的自动化操作,比如发送带有附件的邮件、群发邮件等。下面将详细介绍如何使用Java Mail进行邮件发送,并结合提供的文件名称,提供相关的代码实例。 首先,要...

    JAVA MAIL发送邮件带附件和图片

    总结来说,发送带有附件和图片的Java邮件涉及多个步骤,包括设置邮件服务器参数、创建MimeMessage、添加不同类型的MimeBodyPart以及发送邮件。`TemplateMailMessage.java`和`MailTemplateHelper.java`则可能提供了更...

    Java实现发送邮件内容+附件

    以上就是使用Java实现发送带有内容和附件的邮件的基本过程。在实际项目中,你可能需要根据具体需求进行更复杂的定制,例如处理HTML格式的正文、添加抄送和密送收件人、设置邮件头信息等。在提供的压缩包文件“发送...

    java mail 发送邮件代码与架包

    Java Mail 是一个用于处理电子邮件的开源API,它允许开发者通过编程方式发送、接收和操作邮件。这个API提供了广泛的协议支持,包括SMTP(简单邮件传输协议)用于发送邮件,POP3和IMAP4用于接收邮件。在Java Mail中,...

    java实现给多人发送邮件多个附件

    在Java编程环境中,发送邮件并附带多个附件是一项常见的任务,尤其在自动化处理、通知服务或者数据共享等场景中。本篇文章将详细讲解如何利用JavaMail API来实现这个功能。 首先,我们需要理解JavaMail API的基本...

    java发邮件 带附件 多媒体邮件

    以上就是利用Java Mail API发送带有附件及多媒体内容的邮件的主要步骤。这种方法非常灵活,可以根据不同的需求定制邮件内容。在实际应用中,还需要注意错误处理及安全性问题,确保邮件发送过程的稳定性和安全性。

    java 发送邮件 spring发送邮件Mail

    Spring框架提供了一种优雅的方式来处理这个任务,它整合了JavaMailSender接口和JavaMail API,使得在Java应用程序中发送邮件变得更加简单。让我们深入探讨这个主题。 首先,JavaMail API是Java用来处理邮件收发的...

    java mail 发送QQ邮件

    Java Mail 是一个用于处理电子邮件的开源API,它允许开发者通过编程方式发送、接收和管理邮件。在Java中,使用Java Mail API发送QQ邮件是常见的需求,尤其对于自动化通知或者服务端消息传递非常实用。以下是对这个...

    springboot发送邮件(含带附件的邮件,定时任务等功能)

    为了发送带附件的邮件,我们需要使用`MimeMessage`接口,它可以更灵活地处理邮件内容和附件。创建一个`sendEmailWithAttachment`方法: ```java import org.springframework.mail.MailException; import org.spring...

    java 发送多人邮件+多附件工具类

    这个"发送多人邮件+多附件工具类"是为了解决这个问题而设计的,它可以帮助开发者便捷地向多个收件人发送带有多个附件的邮件。下面将详细讲解其中涉及的关键知识点。 1. JavaMail API: JavaMail API是Java中用于...

    使用 java mail 发送邮件

    Java Mail API包括了多个组件,主要的有 javax.mail 和 javax.mail.internet 包,它们提供了创建、配置、发送邮件以及处理邮件服务器交互的类和接口。要使用Java Mail发送邮件,首先需要添加相应的依赖库到项目中。...

    Java发送outlook邮件

    总之,Java发送Outlook邮件主要涉及JavaMail API的使用,包括配置SMTP服务器、创建邮件对象、设置邮件属性、添加附件和发送邮件。对于Notes邮件,可能需要使用IBM Domino Java API。理解这些概念和技术是Java开发者...

    发送邮件及邮件附件java代码实例(支持多附件,群发送).pdf

    这个`Mail.java`类的实现提供了一种基础的邮件发送功能,但请注意,对于大多数生产环境,使用成熟的库如JavaMail API会更加方便和稳定,因为它包含了更全面的错误处理、SSL/TLS支持以及自动处理SMTP细节。然而,这个...

    JavaMail(3)——发送带附件的邮件.docx

    在JavaMail中,发送带有附件的邮件涉及到对MIME(Multipurpose Internet Mail Extensions)标准的理解和使用。MIME扩展了邮件协议,允许在邮件中包含多媒体内容,如图片、文档、音频或视频文件等。 在JavaMail中,`...

    java实现发送邮件(普通邮件和带附件)功能

    `javax.mail.internet.Multipart`是邮件的容器,可以包含多个部分,例如文本和附件。`MimeBodyPart`用于表示邮件的一个单独部分,无论是纯文本、HTML还是文件附件。创建`MimeBodyPart`实例,设置其内容后,将其添加...

    java开发实现163邮件发送(支持附件

    接着,创建一个`MimeMultipart`对象,将多个`MimeBodyPart`添加到其中。最后,将`MimeMultipart`对象设置为`MimeMessage`的正文。 7. **发送邮件** 通过`Transport`类的`send`方法发送已准备好的`Message`。发送前...

    java发送邮件相关jar包

    这里提到的两个jar包——`spring-context-support-4.1.7.RELEASE.jar`和`mail-1.4.1.jar`,都是Java邮件发送的重要组成部分。 `spring-context-support-4.1.7.RELEASE.jar`是Spring框架的一个扩展模块,主要提供了...

Global site tag (gtag.js) - Google Analytics