Javaweb邮件发送
凌晨的路灯 人气:0发送邮件使用的是SMTP协议:一般是smtp.xxx.com ,比如smtp.qq.com
接收邮件:POP3协议
附件:MIME
使用Java发送邮件需要准备JavaMail API 和 Java Activation Framework
得到两个jar包
mail.jar
activation.jar
import com.sun.mail.util.MailSSLSocketFactory; import javax.mail.*; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import java.security.GeneralSecurityException; import java.util.Properties; public class Email { public static void main(String[] args) throws GeneralSecurityException, MessagingException { Properties prop = new Properties(); //设置qq邮件服务器 prop.setProperty("mail.host", "smtp.qq.com"); //邮件发送协议 prop.setProperty("mail.transport.protocol", "smtp"); //需要验证用户名和密码 prop.setProperty("mail.smtp.auth", "true"); //关于QQ邮箱,还要设置SSL加密,加上以下代码即可 MailSSLSocketFactory sf = new MailSSLSocketFactory(); sf.setTrustAllHosts(true); prop.put("mail.smtp.ssl.enable", "true"); prop.put("mail.smtp.ssl.socketFactory", sf); //使用JavaMail发送邮件的5个步骤 //1,创建定义整个应用程序所需的环境信息的Session对象 //qq才有,其他邮箱就不用 Session session = Session.getDefaultInstance(prop, new Authenticator() { public PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication("920367321@qq.com", "hnjwzkfilnnnbbig"); } }); //开启session的debug模式,可以看到程序发送Email的运行状态 /*session.setDebug(true);*/ //2,通过session得到transport对象 Transport ts = session.getTransport(); //3,使用邮箱的用户名和授权码连接上邮件服务器 ts.connect("smtp.qq.com", "920367321@qq.com", "hnjwzkfilnnnbbig"); //4,创建邮件 MimeMessage message = new MimeMessage(session); //指明邮件的发件人 message.setFrom(new InternetAddress("920367321@qq.com")); //指明邮件的收件人,现在发件人和收件人是一样的,就是自己给自己发 message.setRecipient(Message.RecipientType.TO, new InternetAddress("920367321@qq.com")); //邮件的标题 message.setSubject("只包含文本的简单邮件"); //邮件的文本内容 message.setContent("你好啊","text/html;charset=UTF-8"); //5,发送邮件 ts.sendMessage(message,message.getAllRecipients()); //6,关闭连接 ts.close(); } }
关于在邮件中添加附件 MIME(多用途互联网邮件扩展类型)
MimeBodyPart类
javax.mail.internet.MimeBodyPart类表示的是一个MIME消息,它和MimeMesssage类一样都是从Part接口结成过来
MimeMultipart类
javax.mail.internet.MimeMultipart是抽象类Multipart的实现子类,它用来组合多个MIME消息,一个MimeMultipart对象可以包含多个代表MIME消息的MimeBodyPart对象
带图片的邮件,其他的代码与上面一样,只需要更改邮件的内容即可
//邮件的标题 message.setSubject("只包含图片的简单邮件"); //准备邮件数据 //准备图片数据 MimeBodyPart image = new MimeBodyPart(); //图片需要数据处理,DataHandler就是这样的一个类 DataHandler dh = new DataHandler(new FileDataSource("src/main/resources/01.png")); image.setDataHandler(dh);//在我们的body中放入这个处理的图片数据 image.setContentID("01.png"); //准备正文数据 MimeBodyPart text = new MimeBodyPart(); text.setContent("这是一封带图片<img src='cid:01.png/>'的邮件", "text/html;charset=UTF-8"); //描述数据关系 MimeMultipart mm = new MimeMultipart(); mm.addBodyPart(text); mm.addBodyPart(image); mm.setSubType("related"); //设置到消息中,保存修改 message.setContent(mm);//把最后编辑好的邮件放到消息当中 message.saveChanges();//保存修改 //5,发送邮件 ts.sendMessage(message,message.getAllRecipients());
带附件的邮件,操作基本没差,只需要创建一个附件的MimeBodyPart再添加到消息中即可
//准备图片数据 MimeBodyPart image = new MimeBodyPart(); //图片需要数据处理,DataHandler就是这样的一个类 DataHandler dh = new DataHandler(new FileDataSource("src/main/resources/01.png")); image.setDataHandler(dh);//在我们的body中放入这个处理的图片数据 image.setContentID("01.png"); //附件 MimeBodyPart accessory = new MimeBodyPart(); accessory.setDataHandler(new DataHandler(new FileDataSource("src/main/resources/hello.txt"))); accessory.setFileName("hello.txt");//设置附件的名字 //准备正文数据 MimeBodyPart text = new MimeBodyPart(); text.setContent("这是一封带图片<img src='cid:01.png'/>的邮件", "text/html;charset=UTF-8"); //描述数据关系 MimeMultipart mm = new MimeMultipart(); mm.addBodyPart(text); mm.addBodyPart(image); mm.setSubType("related"); //将图片和文本封装为一个MimeMultipart MimeBodyPart contentText = new MimeBodyPart(); contentText.setContent(mm); //拼接附件 MimeMultipart allFile = new MimeMultipart(); allFile.addBodyPart(accessory);//附件 allFile.addBodyPart(contentText); allFile.setSubType("mixed");//正文和附件都存在邮件中,所有类型设置为mixed //设置到消息中,保存修改 message.setContent(allFile);//把最后编辑好的邮件放到消息当中 message.saveChanges();//保存修改 //5,发送邮件 ts.sendMessage(message,message.getAllRecipients());
注意点:
在一个web项目中:例如实现一个用户注册就给用户发一封邮件的功能,但通过之前的代码我们可以发现,发送一封邮件是需要时间的,这个时候考虑到用户体验我们不应该让用户等待,所以可以考虑使用多线程,为邮件发送单独设置为一条线程,而不影响主线程的操作!
加载全部内容