一、javaMail概念:
JavaMail是由Sun定义的一套收发电子邮件的API,不同的厂商可以提供自己的实现类。但它并没有包含在JDK中,而是作为JavaEE的一部分。
javaMail常见的邮件协议包括:
SMTP:简单的邮件传输协议,用于发送电子邮件协议;
POP3:用于接收电子邮件的标准邮件协议;
IMAP:互联网消息协议,是POP3的代替协议
这三种协议都有对应SSL加密传输的协议,分别是SMTPS,POP3S和IMAPS。
二、搭建James邮件服务器
James是Apache的一个开源项目,纯Java实现
搭建James服务器
① 下载apache-james-2.3.2.zip解压
② 运行bin目录下的run.bat即可启动服务器[Telnet localhost 4555]
③ 通过appsjamesSAR-INFconfig.xml配置服务器
注:先到bin下run一道。 放如非中文目录, 得再控制面板开启Telnet客户端
三、安装OutLook[邮件客户端]
产品秘钥:PQDV9-GPDV4-CRM4D-PHDTH-4M2MT
创建用户账号
一、使用telnet连接James的Remote Administration Tool
二、以管理员身份登录
三、使用adduser命令添加用户
四、配置outlook邮件客户端
为了方便查看,可以配置Microsoft Outlook邮件客户端,保证James邮件服务器是启动状态,启动Microsoft Outlook.
选择“工具”->“选项”,打开“选项”面板。选择“邮件设置”并点击“电子邮件账户”,打开“账号设置”面板。在“电子邮件”选项卡下新建邮件账户
五、案例[搭建James邮件服务器]
需求说明:
在本机搭建James邮件服务器,自定义服务器的名称。
创建两个测试用户。
在Microsoft Outlook中配置其中一个测试用户为Outlook邮件账户
六、使用JavaMail发送电子邮件(案例)
首先定义一个EmailAuthenticator类 extend Authenticator
1 public class EmailAuthenticator extends Authenticator { 2 private String username; 3 4 private String userpass; 5 6 public void setUsername(String username) { 7 this.username = username; 8 } 9 10 public void setUserpass(String userpass) { 11 this.userpass = userpass; 12 } 13 14 public EmailAuthenticator() { 15 } 16 17 public EmailAuthenticator(String username, String userpass) { 18 this.username = username; 19 this.userpass = userpass; 20 } 21 public PasswordAuthentication getPasswordAuthentication(){ 22 return new PasswordAuthentication(username,userpass); 23 }
创建Mail类设置邮件信息:
1 public class Mail { 2 private String mailServer,from,to,mailSubject,mailContent; 3 private String username,password; 4 public Mail(){ 5 //设置邮件信息 6 //进行认证登录的用户名 7 username="hq@mail.com"; 8 //认证密码 9 password="hq"; 10 //认证的邮箱对应的邮件服务器 11 mailServer="192.168.17.176"; 12 //发件人信息 13 from="wj"; 14 //收件人信息 15 to="wj@mail.com"; 16 //邮件标题 17 mailSubject="我们都是好孩子333"; 18 //邮件内容 19 mailContent="这是一封测试邮件!如有雷同,纯属不可能"; 20 } 21 //设置邮件服务器 22 @SuppressWarnings("static-access") 23 public void send(){ 24 Properties prop=System.getProperties(); 25 //指定邮件server 26 prop.put("mail.smtp.host", mailServer); 27 28 //是否开启认证 29 prop.put("mail.smtp.auth", "true"); 30 31 //smtp协议的 32 prop.put("mail.smtp.port", "25"); 33 //产生Session服务 34 EmailAuthenticator mailauth=new EmailAuthenticator(username, password); 35 Session mailSession=Session.getInstance(prop,(Authenticator)mailauth); 36 try { 37 //封装Message对象 38 Message message=new MimeMessage(mailSession); 39 40 message.setFrom(new InternetAddress(from)); //发件人 41 message.setRecipient(Message.RecipientType.TO, new InternetAddress(to));//收件人 42 message.setSubject(mailSubject); 43 //设置内容(设置字符集处理乱码问题) 44 message.setContent(mailContent,"text/html;charset=gbk"); 45 message.setSentDate(new Date()); 46 //创建Transport实例,发送邮件 47 Transport tran=mailSession.getTransport("smtp"); 48 tran.send(message,message.getAllRecipients()); 49 tran.close(); 50 51 } catch (Exception e) { 52 e.printStackTrace(); 53 } 54 }
测试类:
1 public class MyTest { 2 public static void main(String[] args) { 3 Mail mail=new Mail(); 4 mail.send(); 5 System.out.println("success!"); 6 } 7 8 }
七、发送带附件的Mail
1 public class MailWithAttachment { 2 private JavaMailSender mailSender; //必须使用 JavaMailSender 3 public void setMailSender(JavaMailSender mailSender) { 4 this.mailSender = mailSender; 5 } 6 7 public void send() throws MessagingException,IOException{ 8 MimeMessage mimeMessage = mailSender.createMimeMessage(); 9 MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true, "UTF-8"); 10 helper.setFrom("hq@mail.com"); 11 helper.setTo("wj@mail.com"); 12 13 helper.setSubject("哈哈哈"); 14 helper.setText("每日一笑,开开心心!!!"); 15 //添加附件1 16 ClassPathResource file1 = new ClassPathResource( 17 "/cn/bdqn/attachfiles/test.doc"); 18 helper.addAttachment(file1.getFilename(), file1.getFile()); 19 //添加附件2:附件的文件名为中文时,需要对文件名进行编码转换,解决乱码问题 20 ClassPathResource file2 = new ClassPathResource( 21 "/cn/bdqn/attachfiles/附件测试文件.doc"); 22 helper.addAttachment(MimeUtility.encodeWord(file2.getFilename()),file2.getFile()); 23 mailSender.send(mimeMessage); 24 } 25 }
测试类:
1 public class MailTest { 2 public static void main(String[] args){ 3 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); 4 5 /*测试带附件的邮件*/ 6 try{ 7 MailWithAttachment mailWithAttach = (MailWithAttachment)context.getBean("mailWithAttachment"); 8 mailWithAttach.send(); 9 }catch(Exception e){ 10 System.out.print(e.toString()); 11 } 12 } 13 }
applicationContext.xml:配置
八、 Transport和Store:传输和存储
邮件操作只有发送或接收两种处理方法,javaMail将两个不同的操作描述传输(javax.mail.Transport)和存储(javax.mail.Store),传输对应邮件的发送,而存储对应邮件的接收。
Session提供了几个用于创建Transport和Store实例的方法,在具体讲解这些方法之前,我们事先了解一下Session创建Transport和Store的内部机制。我们知道提供者在javamail.providers配置文件中为每一种支持的邮件协议定义了实现类,Session根据协议类型(stmp、pop3等)和邮件操作方式(传输和存储)这两个信息就可以定位到一个实例类上。比如,指定stmp协议和transport类型后,Session就会使用com.sun.mail.smtp.SMTPTransport实现类创建一个Transport实例,而指定pop3协议和store类型时,则会使用com.sun.mail.pop3.POP3Store实例类创建一个Store实例。Session提供了多个重载的getTransport()和getStore()方法,这些方法将根据Session中Properties属性设置情况进行工作,影响这两套方法工作的属性包括:
属性名 |
说明 |
mail.transport.protocol |
默认的邮件传输协议,例如,smtp |
mail.store.protocol |
默认的存储邮件协议,例如:pop3 |
mail.host |
默认的邮件服务地址,例如:192.168.67.1 |
mail.user |
默认的登陆用户名,例如:zapldy |