0


JAVA Email——利用java完成发送电子邮件(包括附件)

考虑这个问题之前我们先来看一下传统的邮件是如何发送的。传统的邮件是通过邮局投递,然后从一个邮局到另一个邮局,最终到达用户的邮箱。电子邮件的发送过程也是类似 的,只不过是电子邮件是从用户电脑的邮件软件,发送到邮件服务器上,可能经过若干个邮件服务器的中转,最终到达对方邮件服务器上,收件方就可以用软件接收邮件。感觉也就是将传统的邮件发送模型,转换到了电子网络上。

我们把邮件软件称为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

加入至当前项目中。

准备SMTP登录信息

发送邮件前,我们首先要确定作为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

  1. // 服务器地址:String smtp ="smtp.126.com";// 登录用户名:String username ="billgogoogooo@126.com";// 登录口令:String password ="P*****************I";// 连接到SMTP服务器587端口:Properties props =newProperties();
  2. props.put("mail.smtp.host", smtp);// SMTP主机名
  3. props.put("mail.smtp.port","25");// 主机端口号
  4. props.put("mail.smtp.auth","true");// 是否需要用户认证
  5. props.put("mail.smtp.starttls.enable","true");// 启用TLS加密// 获取Session实例:Session session =Session.getInstance(props,newAuthenticator(){protectedPasswordAuthenticationgetPasswordAuthentication(){returnnewPasswordAuthentication(username, password);}});// 设置debug模式便于调试:
  6. session.setDebug(true);

创建Session对象

为了后面的方便我们创造一个Session对象:
这里使用了一个静态方法来调用创建

  1. publicstaticSessioncreateSession(){//SMTP服务器地址String smtp ="smtp.126.com";String userName ="ent********k@126.com";String passWord ="L************W";//邮箱账号和密码(授权密码)Properties pros=newProperties();//SMTOP服务器的连接信息
  2. pros.put("mail.smtp.host", smtp);
  3. pros.put("mail.smtp.prot","25");
  4. pros.put("mail.smtp.auth","true");
  5. pros.put("mail.smtp.starttls.enable","true");//创建session//参数1:SMTP服务器的连接对象//参数2:用户认证对象(Authenticator)接口的匿名实现类Session session =Session.getInstance(pros,newAuthenticator(){@OverrideprotectedPasswordAuthenticationgetPasswordAuthentication(){// TODO Auto-generated method stubreturnnewPasswordAuthentication(userName,passWord);}});//开启调试模式
  6. session.setDebug(true);return session;}

发送邮件

在发送邮件的时候我们需要一个Message对象,调入我们的Transport.send()方法,就可以发送

  1. //用try-catch块来解决程序运行时可能会抛出的(Address,Message)异常try{//创建Message对象MimeMessage message =newMimeMessage(session);// 设置发送方地址:
  2. message.setFrom(newInternetAddress("xxxxxxxxxx@126.com"));// 设置接收方地址:
  3. message.setRecipient(Message.RecipientType.TO,neInternetAddress("xxxx@qq.com"));// 设置邮件主题://使用utf-8的编码格式
  4. message.setSubject("Hello","UTF-8");// 设置邮件正文:
  5. message.setText("Hi Xiaoming...","UTF-8");// 发送:Transport.send(message);}catch(AddressException e){
  6. e.printStackTrace();}catch(MessagingException e){
  7. e.printStackTrace();}

如果控制文本的文字格式和字体大小

public static void main(String[] args) {

  1. try {
  2. Session session = Emailutils.createSession();
  3. MimeMessage msg=new MimeMessage(session);
  4. msg.setFrom(new InternetAddress("exxxxxxxck@126.com"));
  5. msg.setRecipient(RecipientType.TO,new InternetAddress("1xxxxxxx98@qq.com"));
  6. msg.setSubject("孤勇者","utf-8");
  7. //邮件正文中中包含有"html"标签(控制文本的格式)
  8. msg.setText("爱你孤身走暗巷,<b>爱你不变的模样</b>","utf-8","html");
  9. Transport.send(msg);
  10. } catch (MessagingException e) {
  11. // TODO Auto-generated catch block
  12. e.printStackTrace();
  13. }

发送带有图片的,和附带图片的(以图片为附件)的邮件

在之前的基础上,使用了Multipart类:

  1. Multipart multiPart =newMimeMultipart();

在Multipart这个类中有addBodyPart()方法,它可以将多个,bodyPart对象加载到一起。将文字图片等放在BodyPart()中

  1. BodyPart imageBodyPart=new MimeBodyPart();
  2. imageBodyPart.setFileName("zzz.jpg");
  3. imageBodyPart.setDataHandler(
  4. new DataHandler(
  5. new ByteArrayDataSource(Files.readAllBytes(Paths.get("C:\\Users\\zero\\Pictures\\Saved Pictures\\我的爱.jpg")), "application/octet-stream")));
  6. imageBodyPart.setHeader("Content", "<hello>");

完整代码如下:

  1. publicstaticvoidmain(String[] args){try{// TODO Auto-generated method stubSession session =Emailutils.createSession();MimeMessage mag =newMimeMessage(session);
  2. mag.setFrom(newInternetAddress("***********k@126.com"));
  3. mag.setRecipient(RecipientType.TO,newInternetAddress("1***********8@qq.com"));
  4. mag.setSubject("来自朋友的一封信","utf-8");Multipart multiPart =newMimeMultipart();BodyPart textpart =newMimeBodyPart();StringBuilder body =newStringBuilder();
  5. body.append("<h1>adadad</h1>");
  6. body.append("<img src=\"cid:hello.jpg\"/>");
  7. textpart.setContent(body.toString(),"text/html;charset=utf-8");BodyPart imageBodyPart=newMimeBodyPart();
  8. imageBodyPart.setFileName("zzz.jpg");
  9. imageBodyPart.setDataHandler(newDataHandler(newByteArrayDataSource(Files.readAllBytes(Paths.get("C:\\Users\\zero\\Pictures\\Saved Pictures\\我的爱.jpg")),"application/octet-stream")));
  10. imageBodyPart.setHeader("Content","<hello>");
  11. multiPart.addBodyPart(imageBodyPart);
  12. multiPart.addBodyPart(textpart);
  13. mag.setContent(multiPart);Transport.send(mag);BodyPart timagepart =newMimeBodyPart();}catch(MessagingException e){// TODO Auto-generated catch block
  14. e.printStackTrace();}catch(IOException e){// TODO Auto-generated catch block
  15. e.printStackTrace();}}

一对多发送邮件:
我们也可以用Java来实现把一封邮件同时发送给多个人。只需要在发送对象的基础上,添加抄写者,抄写者可以添加多个人。

  1. try{//创建Session会话Session session =Demo01.create();//创建邮件对象(Message抽象类的子类对象)//发送给多个人MimeMessage msg =newMimeMessage(session);
  2. msg.setFrom(newInternetAddress("**************3@163.com"));//发送给一个人
  3. msg.setRecipient(RecipientType.TO,newInternetAddress("xxxxx0@qq.com"));//通过setRecipients中的抄写者。来实现同时发送给多个人//把网络邮件地址设置成一个集合,存放多个邮箱地址
  4. msg.setRecipients(RecipientType.CC,newInternetAddress[]{newInternetAddress("xxxxx@qq.com"),newInternetAddress("xxxxxxx@qq.com"),newInternetAddress("xxxxx@qq.com"),});
  5. msg.setSubject("正文标题","UTF-8");//邮件正文BodyPart textBodyPart =newMimeBodyPart();StringBuilder body =newStringBuilder();
  6. body.append("<h1>TM</h1>");
  7. body.append("<img src=\"cid:tiezi\">/");
  8. textBodyPart.setContent(body.toString(),"text/html;charset=utf-8");//邮件附件部分BodyPart imageBodyPart =newMimeBodyPart();
  9. imageBodyPart.setFileName("TMD.jpg");//附件名称
  10. imageBodyPart.setDataHandler(newDataHandler(//读取附件内容newByteArrayDataSource(Files.readAllBytes(Paths.get("C:\\Users\\lenovo\\Pictures\\magick.jpg")),"application/octet-stream")));//设置内容ID
  11. imageBodyPart.setHeader("Content-ID","<tiezi>");//组合正文和附件Multipart multiPart =newMimeMultipart();
  12. multiPart.addBodyPart(textBodyPart);//正文内容
  13. multiPart.addBodyPart(imageBodyPart);//附件内容
  14. msg.setContent(multiPart);Transport.send(msg);}catch(MessagingException|IOException e){// TODO Auto-generated catch block
  15. e.printStackTrace();}
标签: java 开发语言

本文转载自: https://blog.csdn.net/wusjwjs/article/details/125836458
版权归原作者 Legend_Never.Die 所有, 如有侵权,请联系我们删除。

“JAVA Email&mdash;&mdash;利用java完成发送电子邮件(包括附件)”的评论:

还没有评论