背景
很多web应用在开发的时候都需要集成邮件发送功能;例如新用户注册欢迎邮件;
邮件简介
学习目标:
邮件服务器:邮局;
邮件的发送过程:
邮件的协议(重点):
SMTP:Simple Message Transfer Protocal 简单消息传输协议(邮件发送协议)
默认用的端口:25
POP:Post Office Protocal 邮局协议(接收邮件协议)
默认用的端口:110
手工发送邮件:
前提:a、使用telnet发送,必须有telnet客户端
b、准备两个邮箱:itheimacloud@163.com iamsorry
itheima14@163.com iamsorry
发送邮件的邮箱账户名和密码需要进行Base64编码:
itheimacloud aXRoZWltYWNsb3Vk
iamsorry aWFtc29ycnk=
c、知道使用的发送服务器和接收服务器的地址
POP3服务器:pop.163.com SMTP服务器:smtp.163.com
SMTP协议:
ehlo XXX 向发送服务器打招呼
auth login 向发送服务器请求身份认证
mail from:<itheimacloud@163.com> 发件人
rcpt to:<itheima14@163.com> 收件人
data 邮件内容开始标记
--------------
邮件内容:要符合规范RFC822规范
from:itheimacloud@163.com(发件人)
to:itheima14@163.com(收件人)
subject:this is my first email(标题)
(正文内容)
aaaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbb
--------------
. 邮件内容结束
POP协议:
邮件发送过程:
JavaMail发送邮件:
1、简介:
JavaMail是一套发送邮件的规范,属于JavaEE技术之一。
2、JavaMail环境的搭建
mail.jar
jaf.jar(JDK5-):Java Activation Framework JavaMail中用它读取磁盘文件
3、JavaMail中的核心类
Message:代表着一封邮件,实现类MimeMessage
Properties(配置文件内容或此类的实例对象属性设定)
mail.smtp.host 指定连接的邮件服务器主机名
mail.transport.protocol 指定采用的邮件发送协议
mail.store.protocol 指定采用的邮件接收协议
mail.smtp.auth 指定客户端是否向邮件服务器提交认证
1 import java.io.FileOutputStream; 2 import java.util.Properties; 3 4 import javax.mail.Message; 5 import javax.mail.Session; 6 import javax.mail.internet.InternetAddress; 7 import javax.mail.internet.MimeMessage; 8 9 //利用JavaMailAPI创建一封只有文本内容的邮件 10 public class MailDemo1 { 11 12 public static void main(String[] args) throws Exception { 13 Properties props = new Properties();//不设置任何配置,发送时需要 14 Session session = Session.getInstance(props); 15 MimeMessage msg = new MimeMessage(session); 16 //设置发件人 17 msg.setFrom(new InternetAddress("itheimacloud@163.com")); 18 //设置收件人:正常送(TO)、抄送(CC)、密送(BCC) 19 msg.setRecipients(Message.RecipientType.TO, "itheima14@163.com"); 20 //设置主题 21 msg.setSubject("JavaMail发送的邮件"); 22 //设置邮件正文内容 23 msg.setText("hello"); 24 msg.saveChanges(); 25 //存到磁盘上:邮件文件的扩展名*.eml 26 msg.writeTo(new FileOutputStream("d:/1.eml")); 27 28 } 29 30 }
1 import java.util.Properties; 2 3 import javax.mail.Message; 4 import javax.mail.Session; 5 import javax.mail.Transport; 6 import javax.mail.internet.InternetAddress; 7 import javax.mail.internet.MimeMessage; 8 9 public class SendMail1 { 10 11 public static void main(String[] args) throws Exception { 12 Properties props = new Properties();//不设置任何配置,发送时需要 13 props.setProperty("mail.host", "smtp.163.com"); 14 props.setProperty("mail.transport.protocol", "smtp"); 15 props.setProperty("mail.smtp.auth", "true");//请求认证,与JavaMail的实现有关 16 Session session = Session.getInstance(props); 17 session.setDebug(true);//调试模式 18 MimeMessage msg = new MimeMessage(session); 19 //设置发件人 20 msg.setFrom(new InternetAddress("itheimacloud@163.com")); 21 //设置收件人:正常送(TO)、抄送(CC)、密送(BCC) 22 msg.setRecipients(Message.RecipientType.TO, "itheima14@163.com"); 23 //设置主题 24 msg.setSubject("JavaMail发送的邮件"); 25 //设置邮件正文内容 26 msg.setText("hello"); 27 msg.saveChanges(); 28 //发送邮件 29 Transport ts = session.getTransport(); 30 ts.connect("itheimacloud", "iamsorry"); 31 ts.sendMessage(msg, msg.getAllRecipients()); 32 } 33 34 }
3.1只有文本的邮件
3.2文本中内嵌图片的邮件
1 import java.io.FileOutputStream; 2 import java.util.Properties; 3 4 import javax.activation.DataHandler; 5 import javax.activation.FileDataSource; 6 import javax.mail.Message; 7 import javax.mail.Session; 8 import javax.mail.Transport; 9 import javax.mail.internet.InternetAddress; 10 import javax.mail.internet.MimeBodyPart; 11 import javax.mail.internet.MimeMessage; 12 import javax.mail.internet.MimeMultipart; 13 14 //文本中内嵌图片的邮件 15 //两部分组成:文本;图片。MIME协议描述的 16 17 /* 18 文件上传:多部分组成,用的也是MIME协议 19 --------------------234u3240932 20 Content-Type:text/html 21 22 aaa<img src='cid:mm'/>aaa 23 --------------------234u3240932 24 Content-Type:image/jpeg 25 Content-Id:mm 26 27 图片的内容:采用Base64编码 28 --------------------234u3240932-- 29 */ 30 public class MailDemo2 { 31 32 public static void main(String[] args) throws Exception { 33 Properties props = new Properties();//不设置任何配置,发送时需要 34 props.setProperty("mail.host", "smtp.163.com"); 35 props.setProperty("mail.transport.protocol", "smtp"); 36 props.setProperty("mail.smtp.auth", "true");//请求认证,与JavaMail的实现有关 37 Session session = Session.getInstance(props); 38 session.setDebug(true); 39 MimeMessage msg = new MimeMessage(session); 40 msg.setFrom(new InternetAddress("itheimacloud@163.com")); 41 msg.setRecipients(Message.RecipientType.TO, "itheima14@163.com"); 42 msg.setSubject("JavaMail发送的邮件"); 43 44 //邮件主体内容:组装过程 45 //文本部分 46 MimeBodyPart textPart = new MimeBodyPart(); 47 textPart.setContent("aaa<img src='cid:mm'/>aaa", "text/html"); 48 49 //图片部分 50 MimeBodyPart imagePart = new MimeBodyPart(); 51 //搞数据进来需要用到JAF的API 52 DataHandler dh = new DataHandler(new FileDataSource("src/1.jpg"));//自动探测文件的MIME类型 53 imagePart.setDataHandler(dh); 54 imagePart.setContentID("mm"); 55 56 //描述关系: 57 MimeMultipart mmpart = new MimeMultipart(); 58 mmpart.addBodyPart(textPart); 59 mmpart.addBodyPart(imagePart); 60 mmpart.setSubType("related");//有关系的 61 62 msg.setContent(mmpart); 63 64 msg.saveChanges(); 65 // msg.writeTo(new FileOutputStream("d:/2.eml")); 66 //发送邮件 67 Transport ts = session.getTransport(); 68 ts.connect("itheimacloud", "iamsorry"); 69 ts.sendMessage(msg, msg.getAllRecipients()); 70 } 71 72 }
3.3文本中内嵌图片还有附件的邮件
1 import java.io.FileOutputStream; 2 import java.util.Properties; 3 4 import javax.activation.DataHandler; 5 import javax.activation.FileDataSource; 6 import javax.mail.Message; 7 import javax.mail.Session; 8 import javax.mail.Transport; 9 import javax.mail.internet.InternetAddress; 10 import javax.mail.internet.MimeBodyPart; 11 import javax.mail.internet.MimeMessage; 12 import javax.mail.internet.MimeMultipart; 13 import javax.mail.internet.MimeUtility; 14 15 //文本中内嵌图片的邮件,还有附件的邮件 16 17 public class MailDemo3 { 18 19 public static void main(String[] args) throws Exception { 20 Properties props = new Properties();//不设置任何配置,发送时需要 21 props.setProperty("mail.host", "smtp.163.com"); 22 props.setProperty("mail.transport.protocol", "smtp"); 23 props.setProperty("mail.smtp.auth", "true");//请求认证,与JavaMail的实现有关 24 Session session = Session.getInstance(props); 25 session.setDebug(true); 26 MimeMessage msg = new MimeMessage(session); 27 msg.setFrom(new InternetAddress("itheimacloud@163.com")); 28 msg.setRecipients(Message.RecipientType.TO, "itheima14@163.com"); 29 msg.setSubject("JavaMail发送的邮件"); 30 31 //邮件主体内容:组装过程 32 //文本部分 33 MimeBodyPart textPart = new MimeBodyPart(); 34 textPart.setContent("美女aaa<img src='cid:mm'/>aaa", "text/html;charset=UTF-8"); 35 36 //图片部分 37 MimeBodyPart imagePart = new MimeBodyPart(); 38 //搞数据进来需要用到JAF的API 39 DataHandler dh = new DataHandler(new FileDataSource("src/1.jpg"));//自动探测文件的MIME类型 40 imagePart.setDataHandler(dh); 41 imagePart.setContentID("mm"); 42 43 //附件部分 44 MimeBodyPart attachmentPart = new MimeBodyPart(); 45 DataHandler dh1 = new DataHandler(new FileDataSource("src/姓名.zip"));//自动探测文件的MIME类型 46 String name = dh1.getName(); 47 System.out.println(name); 48 attachmentPart.setDataHandler(dh1); 49 //手工设置附件的名称 50 attachmentPart.setFileName(MimeUtility.encodeText(name)); 51 52 //描述关系: 53 MimeMultipart mmpart = new MimeMultipart(); 54 mmpart.addBodyPart(textPart); 55 mmpart.addBodyPart(imagePart); 56 mmpart.setSubType("related");//有关系的 57 58 59 //把文本图片当做一个部分 60 MimeBodyPart textImagePart = new MimeBodyPart(); 61 textImagePart.setContent(mmpart); 62 63 MimeMultipart multipart = new MimeMultipart(); 64 multipart.addBodyPart(textImagePart); 65 multipart.addBodyPart(attachmentPart); 66 multipart.setSubType("mixed");//复杂关系 67 68 69 msg.setContent(multipart); 70 71 msg.saveChanges(); 72 // msg.writeTo(new FileOutputStream("d:/3.eml")); 73 //发送邮件 74 Transport ts = session.getTransport(); 75 ts.connect("itheimacloud", "iamsorry"); 76 ts.sendMessage(msg, msg.getAllRecipients()); 77 } 78 79 }
邮件中的编码问题
a、附件的名称不对
b、中文乱码问题
1.主题:一般没有问题
2.文本内容:
3.附件名称:
利用Tomcat的JNDI容器管理JavaMail中的session:
第一步:把javamail的jar包拷贝到Tomcatlib目录下
第二步:在引用的META-INF目录下,建立一个context.xml的配置文件,内容如下
第三步:在web环境下通过JNDI获取JavaMail的Session
字节码冲突:javax.mail.Session.class有两处。干掉一处即可(只有干掉自己应用中的mail.jar)
报错异常
报错原因:
系统检测到您正在尝试使用IMAP协议访问您的邮箱,为了确保您的帐户安全,该服
务尚未开启。
解决方法:
登入邮箱开启即可