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(); } }
打开接收邮箱,可看到邮件:
主题:
内容:
附件:
相关推荐
在Java编程中,发送带有附件的邮件是一项常见的任务,尤其在企业级应用或者自动化脚本中。这个场景通常涉及到JavaMail API的使用,一个强大的库,可以用来处理SMTP(简单邮件传输协议)邮件服务。接下来,我们将深入...
4. 使用addAttachfile方法来添加附件,支持多个附件的发送。 5. 使用setIfAuth方法来开启发送账户验证,确保邮件发送的安全性。 6. 使用send方法来发送邮件,返回发送结果的HashMap对象。 7. 使用Exception类来捕获...
下面是一个简单的Java邮件发送带附件的示例: ```java import javax.mail.*; import javax.mail.internet.*; import java.util.Properties; public class EmailSender { public static void main(String[] args) ...
在Java应用程序中,我们通常使用JavaMail API来实现邮件的自动化操作,比如发送带有附件的邮件、群发邮件等。下面将详细介绍如何使用Java Mail进行邮件发送,并结合提供的文件名称,提供相关的代码实例。 首先,要...
总结来说,发送带有附件和图片的Java邮件涉及多个步骤,包括设置邮件服务器参数、创建MimeMessage、添加不同类型的MimeBodyPart以及发送邮件。`TemplateMailMessage.java`和`MailTemplateHelper.java`则可能提供了更...
以上就是使用Java实现发送带有内容和附件的邮件的基本过程。在实际项目中,你可能需要根据具体需求进行更复杂的定制,例如处理HTML格式的正文、添加抄送和密送收件人、设置邮件头信息等。在提供的压缩包文件“发送...
Java Mail 是一个用于处理电子邮件的开源API,它允许开发者通过编程方式发送、接收和操作邮件。这个API提供了广泛的协议支持,包括SMTP(简单邮件传输协议)用于发送邮件,POP3和IMAP4用于接收邮件。在Java Mail中,...
在Java编程环境中,发送邮件并附带多个附件是一项常见的任务,尤其在自动化处理、通知服务或者数据共享等场景中。本篇文章将详细讲解如何利用JavaMail API来实现这个功能。 首先,我们需要理解JavaMail API的基本...
以上就是利用Java Mail API发送带有附件及多媒体内容的邮件的主要步骤。这种方法非常灵活,可以根据不同的需求定制邮件内容。在实际应用中,还需要注意错误处理及安全性问题,确保邮件发送过程的稳定性和安全性。
Spring框架提供了一种优雅的方式来处理这个任务,它整合了JavaMailSender接口和JavaMail API,使得在Java应用程序中发送邮件变得更加简单。让我们深入探讨这个主题。 首先,JavaMail API是Java用来处理邮件收发的...
Java Mail 是一个用于处理电子邮件的开源API,它允许开发者通过编程方式发送、接收和管理邮件。在Java中,使用Java Mail API发送QQ邮件是常见的需求,尤其对于自动化通知或者服务端消息传递非常实用。以下是对这个...
为了发送带附件的邮件,我们需要使用`MimeMessage`接口,它可以更灵活地处理邮件内容和附件。创建一个`sendEmailWithAttachment`方法: ```java import org.springframework.mail.MailException; import org.spring...
这个"发送多人邮件+多附件工具类"是为了解决这个问题而设计的,它可以帮助开发者便捷地向多个收件人发送带有多个附件的邮件。下面将详细讲解其中涉及的关键知识点。 1. JavaMail API: JavaMail API是Java中用于...
Java Mail API包括了多个组件,主要的有 javax.mail 和 javax.mail.internet 包,它们提供了创建、配置、发送邮件以及处理邮件服务器交互的类和接口。要使用Java Mail发送邮件,首先需要添加相应的依赖库到项目中。...
总之,Java发送Outlook邮件主要涉及JavaMail API的使用,包括配置SMTP服务器、创建邮件对象、设置邮件属性、添加附件和发送邮件。对于Notes邮件,可能需要使用IBM Domino Java API。理解这些概念和技术是Java开发者...
这个`Mail.java`类的实现提供了一种基础的邮件发送功能,但请注意,对于大多数生产环境,使用成熟的库如JavaMail API会更加方便和稳定,因为它包含了更全面的错误处理、SSL/TLS支持以及自动处理SMTP细节。然而,这个...
在JavaMail中,发送带有附件的邮件涉及到对MIME(Multipurpose Internet Mail Extensions)标准的理解和使用。MIME扩展了邮件协议,允许在邮件中包含多媒体内容,如图片、文档、音频或视频文件等。 在JavaMail中,`...
`javax.mail.internet.Multipart`是邮件的容器,可以包含多个部分,例如文本和附件。`MimeBodyPart`用于表示邮件的一个单独部分,无论是纯文本、HTML还是文件附件。创建`MimeBodyPart`实例,设置其内容后,将其添加...
接着,创建一个`MimeMultipart`对象,将多个`MimeBodyPart`添加到其中。最后,将`MimeMultipart`对象设置为`MimeMessage`的正文。 7. **发送邮件** 通过`Transport`类的`send`方法发送已准备好的`Message`。发送前...
这里提到的两个jar包——`spring-context-support-4.1.7.RELEASE.jar`和`mail-1.4.1.jar`,都是Java邮件发送的重要组成部分。 `spring-context-support-4.1.7.RELEASE.jar`是Spring框架的一个扩展模块,主要提供了...