赞
踩
考虑这个问题之前我们先来看一下传统的邮件是如何发送的。传统的邮件是通过邮局投递,然后从一个邮局到另一个邮局,最终到达用户的邮箱。电子邮件的发送过程也是类似 的,只不过是电子邮件是从用户电脑的邮件软件,发送到邮件服务器上,可能经过若干个邮件服务器的中转,最终到达对方邮件服务器上,收件方就可以用软件接收邮件。感觉也就是将传统的邮件发送模型,转换到了电子网络上。
我们把邮件软件称为MUA: Mail user Agent。
邮件服务器则称为MTA : Mail Transfer Agent。
最终到达的邮件服务器称为MDA: Mail Delivery Agent,
电子邮件一旦到达MDA,就不再动了。实际上,电子邮件通常就存储在MDA服务器的硬盘上,然后等收件人通过软件或者登陆浏览器查看邮件。
MTA和MDA这样的服务器软件通常是现成的,我们不关心这些服务器内部是如何运行的。要发送邮件,我们关心的是如何编写一个MUA的软件,把邮件发送到MTA 上。MUA到MTA发送邮件的协议就是SMTP 协议。SMTP协议是一个建立在TC之上的协议,任何程序发送邮件都必须遵守SMTP协议。使用Java程序发送邮件时,我们无需关心SMTP协议的底层原理,只需要使用JavaMail这个标准API就可以直接发送邮件。
包的准备:
由于JDK没有给我们提供相应的类,所有我们需要去下载一个JavaMail相关的依赖包
javax.mail-1.6.2.jar
加入至当前项目中。
发送邮件前,我们首先要确定作为MTA的邮件服务器地址和端口号。邮件服务器地址通常是smtp.example.com,端口号由邮件服务商确定使用25、465、587。
常用邮件服务商的SMTP信息:
qq邮箱:SMTP服务器是:smtp.qq.com、端口是465/587
163邮箱:SMTP服务器是:smtp.163.com、端口是465
126邮箱:SMTP服务器是:smtp.126.com、端口是465/994
// 服务器地址: String smtp = "smtp.126.com"; // 登录用户名: String username = "billgogoogooo@126.com"; // 登录口令: String password = "P*****************I"; // 连接到SMTP服务器587端口: Properties props = new Properties(); props.put("mail.smtp.host", smtp); // SMTP主机名 props.put("mail.smtp.port", "25"); // 主机端口号 props.put("mail.smtp.auth", "true"); // 是否需要用户认证 props.put("mail.smtp.starttls.enable", "true"); // 启用TLS加密 // 获取Session实例: Session session = Session.getInstance(props, new Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(username, password); } }); // 设置debug模式便于调试: session.setDebug(true);
为了后面的方便我们创造一个Session对象:
这里使用了一个静态方法来调用创建
public static Session createSession() { //SMTP服务器地址 String smtp = "smtp.126.com"; String userName = "ent********k@126.com"; String passWord = "L************W"; //邮箱账号和密码(授权密码) Properties pros=new Properties(); //SMTOP服务器的连接信息 pros.put("mail.smtp.host", smtp); pros.put("mail.smtp.prot", "25"); pros.put("mail.smtp.auth", "true"); pros.put("mail.smtp.starttls.enable", "true"); //创建session //参数1:SMTP服务器的连接对象 //参数2:用户认证对象(Authenticator)接口的匿名实现类 Session session = Session.getInstance(pros,new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { // TODO Auto-generated method stub return new PasswordAuthentication(userName,passWord); } }); //开启调试模式 session.setDebug(true); return session; }
在发送邮件的时候我们需要一个Message对象,调入我们的Transport.send()方法,就可以发送
//用try-catch块来解决程序运行时可能会抛出的(Address,Message)异常 try { //创建Message对象 MimeMessage message = new MimeMessage(session); // 设置发送方地址: message.setFrom(new InternetAddress("xxxxxxxxxx@126.com")); // 设置接收方地址: message.setRecipient(Message.RecipientType.TO, neInternetAddress("xxxx@qq.com")); // 设置邮件主题: //使用utf-8的编码格式 message.setSubject("Hello", "UTF-8"); // 设置邮件正文: message.setText("Hi Xiaoming...", "UTF-8"); // 发送: Transport.send(message); } catch (AddressException e) { e.printStackTrace(); } catch (MessagingException e) { e.printStackTrace(); }
如果控制文本的文字格式和字体大小
public static void main(String[] args) {
try { Session session = Emailutils.createSession(); MimeMessage msg=new MimeMessage(session); msg.setFrom(new InternetAddress("exxxxxxxck@126.com")); msg.setRecipient(RecipientType.TO,new InternetAddress("1xxxxxxx98@qq.com")); msg.setSubject("孤勇者","utf-8"); //邮件正文中中包含有"html"标签(控制文本的格式) msg.setText("爱你孤身走暗巷,<b>爱你不变的模样</b>","utf-8","html"); Transport.send(msg); } catch (MessagingException e) { // TODO Auto-generated catch block e.printStackTrace(); }
在之前的基础上,使用了Multipart类:
Multipart multiPart =new MimeMultipart();
在Multipart这个类中有addBodyPart()方法,它可以将多个,bodyPart对象加载到一起。将文字图片等放在BodyPart()中
BodyPart imageBodyPart=new MimeBodyPart();
imageBodyPart.setFileName("zzz.jpg");
imageBodyPart.setDataHandler(
new DataHandler(
new ByteArrayDataSource(Files.readAllBytes(Paths.get("C:\\Users\\zero\\Pictures\\Saved Pictures\\我的爱.jpg")), "application/octet-stream")));
imageBodyPart.setHeader("Content", "<hello>");
完整代码如下:
public static void main(String[] args) { try { // TODO Auto-generated method stub Session session = Emailutils.createSession(); MimeMessage mag = new MimeMessage(session); mag.setFrom(new InternetAddress("***********k@126.com")); mag.setRecipient(RecipientType.TO,new InternetAddress("1***********8@qq.com")); mag.setSubject("来自朋友的一封信","utf-8"); Multipart multiPart =new MimeMultipart(); BodyPart textpart =new MimeBodyPart(); StringBuilder body =new StringBuilder(); body.append("<h1>adadad</h1>"); body.append("<img src=\"cid:hello.jpg\"/>"); textpart.setContent(body.toString(),"text/html;charset=utf-8"); BodyPart imageBodyPart=new MimeBodyPart(); imageBodyPart.setFileName("zzz.jpg"); imageBodyPart.setDataHandler( new DataHandler( new ByteArrayDataSource(Files.readAllBytes(Paths.get("C:\\Users\\zero\\Pictures\\Saved Pictures\\我的爱.jpg")), "application/octet-stream"))); imageBodyPart.setHeader("Content", "<hello>"); multiPart.addBodyPart(imageBodyPart); multiPart.addBodyPart(textpart); mag.setContent(multiPart); Transport.send(mag); BodyPart timagepart =new MimeBodyPart(); } catch (MessagingException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
一对多发送邮件:
我们也可以用Java来实现把一封邮件同时发送给多个人。只需要在发送对象的基础上,添加抄写者,抄写者可以添加多个人。
try { //创建Session会话 Session session = Demo01.create(); //创建邮件对象(Message抽象类的子类对象) //发送给多个人 MimeMessage msg = new MimeMessage(session); msg.setFrom(new InternetAddress("**************3@163.com")); //发送给一个人 msg.setRecipient(RecipientType.TO, new InternetAddress("xxxxx0@qq.com")); //通过setRecipients中的抄写者。来实现同时发送给多个人 //把网络邮件地址设置成一个集合,存放多个邮箱地址 msg.setRecipients(RecipientType.CC, new InternetAddress[] { new InternetAddress("xxxxx@qq.com"), new InternetAddress("xxxxxxx@qq.com"), new InternetAddress("xxxxx@qq.com"), }); msg.setSubject("正文标题","UTF-8"); //邮件正文 BodyPart textBodyPart = new MimeBodyPart(); StringBuilder body = new StringBuilder(); body.append("<h1>TM</h1>"); body.append("<img src=\"cid:tiezi\">/"); textBodyPart.setContent(body.toString(),"text/html;charset=utf-8"); //邮件附件部分 BodyPart imageBodyPart = new MimeBodyPart(); imageBodyPart.setFileName("TMD.jpg");//附件名称 imageBodyPart.setDataHandler(new DataHandler( //读取附件内容 new ByteArrayDataSource( Files.readAllBytes( Paths.get("C:\\Users\\lenovo\\Pictures\\magick.jpg")), "application/octet-stream"))); //设置内容ID imageBodyPart.setHeader("Content-ID", "<tiezi>"); //组合正文和附件 Multipart multiPart = new MimeMultipart(); multiPart.addBodyPart(textBodyPart);//正文内容 multiPart.addBodyPart(imageBodyPart);//附件内容 msg.setContent(multiPart); Transport.send(msg); } catch (MessagingException | IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。