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(); } }
打开接收邮箱,可看到邮件:
主题:
内容:
附件:
相关推荐
多个附件以,号分开;可抄送、密送等多个抄送、密送以,号分开。详细发送DEMO参考SendMailTest.java类: SendMailInfo mailInfo = new SendMailInfo("mail.china1168.com", true, "标题", "主体内容", "d:\\1.doc,d:\...
封装好了方法, 传入发送邮件的邮箱和收邮件的邮箱即可测试使用
1.普通邮件的发送功能 这里的这个普通邮件的发送功能是指普通的标题正文的形式的邮箱,比较简单,... * 发送邮件,仅限String类型的正文内容,不支持附件发送 */ public class SendMail { public static void sendMai
基于javamail1.4实现邮件发送,支持多收件人、抄送人、多附件等
jsp/servlet 模式的发送邮件系统 可发送多个附件 存在的问题为 subject可能会乱码 有问题可以给我留言
2个小demo,一个是java实现的mail邮件发送,支持群发,多附件发送。另外一个是java生成excel,如果不能运行,你自己新建工程,把我的代码复制粘贴就行了。
项目中要求读取指定邮件未读邮件的内容,在网上查了很多资料发现都不行,不是自己想要的,要么是读取最新的,要么是读取第一封邮件,根本就不能读取未读的旧邮件。...java读取未读邮件内容包括附件包含javamail.jar
其中,邮件发送模块主要负责发送邮件,并且能够实现多附件上传功能,方便用户发送多种类型的文件。邮件接收模块则负责接收邮件,并将邮件内容以列表的方式展示出来,方便用户查看。 系统的设计采用了Javamail技术,...
写了一个可以复用的类,功能就是简单的发送一些邮件,可以含有收信人、抄送人、按送人、邮件主题、邮件正文、附件。 ------------------------------------------------------------ 测试或使用中发现问题,有更多...
NULL 博文链接:https://wisdombrave.iteye.com/blog/546508
javamail 发送邮件的工具类,可以添加多个收件人;可以添加多个附件
一个java的土生的mail发送工具,可以发送附件,和多个附件的内容
javamail 发送邮件源码(含mail.jar) 支持多个收件人、发送多个附件
MailUtil:邮件工具类,包括发送纯文本邮件,带(1个/多个)附件的邮件, 群发邮件 NumberUtil:数字操作工具 包括精准数字运算,数据格式化 PageUtil:分页工具类, POIUtil:poi工具类,excel导出 QrCodeUtil...
//(需要导入两个jar包,一个mail.jar一个activation.jar, //到百度上搜索下载下来,添加到自己的工程中)SMTP和POP邮件协议是什么, //你就理解为一个事发送邮件的协议,一个是接受邮件的协议, //要发送邮件我们...
第三步:在登陆后的界面文本框输入文本,然后发送 可以同时启动多个客户端 实现群聊。 浮动的广告 嵌套在html中 各种EJB之间的调用示例 7个目标文件 摘要:Java源码,初学实例,EJB调用实例 各种EJB之间的调用源码...
第三步:在登陆后的界面文本框输入文本,然后发送 可以同时启动多个客户端 实现群聊。 浮动的广告 嵌套在html中 各种EJB之间的调用示例 7个目标文件 摘要:Java源码,初学实例,EJB调用实例 各种EJB之间的调用源码...
发送带附件的邮件; 给多人发送邮件; 使用pop3接收邮件; 19jsp与servlet 获取客户端的真实ip地址; jsp无刷新聊天室; 设置和读取cookie; 上传文件; 用servlet生成图形验证码; 用servlet实现分页查看数据库;
由于免费邮箱存在邮件发送数量和频率的上限,若发送频繁,可能会被邮件服务商判定为垃圾邮件(554 DT:SPM),因此采用多个免费邮箱轮询发送。 软件环境 JDK1.8+ Maven3.0+ 配置说明 application-dev.properties # ...
2 发送带附件的邮件 18. 3 给多人发送邮件 18. 4 使用POP3接收邮件 第19章 JSP与Servlet 19. 1 获取客户端的真实IP地址 19. 2 设置矛口读取Cookie 19. 3 JSP无刷新聊天室 19. 4 上传...