Java之——Java mail邮件开发实战

出处:http://blog.csdn.net/l1028386804/article/details/51146788

今天,给大家具体讲讲如何利用java mail实现发送邮箱的功能,不多说了,我们直接进入主题。

一、准备环境

 java发送邮件需要3个jar包的支持,分别是activation.jar,additionnal.jar,mail.jar,大家可以到链接http://download.csdn.net/detail/l1028386804/9490320下载这些所需的jar包,将这些jar包放入到自己的java工程中。

二、实现

1、创建邮件信息类MailSenderInfo

这个类是发送邮件的基本信息类,存储了发送邮件的各种信息,包括发送邮件的服务器地址、端口,发送者的邮箱、账号、密码、接收者的邮箱和邮件内容等信息。

具体代码如下:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package com.lyz.utils.email;  
  2.   
  3. import java.util.Properties;  
  4.   
  5. /** 
  6.  * 邮件发送信息类 
  7.  * @author liuyazhuang 
  8.  * 
  9.  */  
  10. public class MailSenderInfo {  
  11.     // 发送邮件的服务器的IP和端口  
  12.     private String mailServerHost;  
  13.     private String mailServerPort = "25";  
  14.   
  15.     // 邮件发送者的地址  
  16.     private String fromAddress;  
  17.     // 邮件接收者的地址  
  18.     private String toAddress;  
  19.     // 登陆邮件发送服务器的用户名和密码  
  20.     private String userName;  
  21.     private String password;  
  22.     // 是否需要身份验证  
  23.     private boolean validate = true;  
  24.     // 邮件主题  
  25.     private String subject;  
  26.     // 邮件的文本内容  
  27.     private String content;  
  28.     // 邮件附件的文件名  
  29.     private String[] attachFileNames;  
  30.   
  31.     /** 
  32.      * 获得邮件会话属性 
  33.      */  
  34.     public Properties getProperties() {  
  35.         Properties p = new Properties();  
  36.         p.put("mail.smtp.host"this.mailServerHost);  
  37.         p.put("mail.smtp.port"this.mailServerPort);  
  38.         p.put("mail.smtp.auth", validate ? "true" : "false");  
  39.           
  40.         p.put("mail.smtp.socketFactory.port""465");    
  41.         p.put("mail.smtp.socketFactory.class","javax.net.ssl.SSLSocketFactory");    
  42.         p.put("mail.smtp.socketFactory.fallback""false");    
  43.         p.setProperty("mail.smtp.quitwait""false");  
  44.         return p;  
  45.     }  
  46.       
  47.     public MailSenderInfo() {  
  48.         super();  
  49.     }  
  50.       
  51.       
  52.     public MailSenderInfo(String mailServerHost, String mailServerPort,  
  53.             String fromAddress, String toAddress, String userName,  
  54.             String password, boolean validate, String subject, String content) {  
  55.         super();  
  56.         this.mailServerHost = mailServerHost;  
  57.         this.mailServerPort = mailServerPort;  
  58.         this.fromAddress = fromAddress;  
  59.         this.toAddress = toAddress;  
  60.         this.userName = userName;  
  61.         this.password = password;  
  62.         this.validate = validate;  
  63.         this.subject = subject;  
  64.         this.content = content;  
  65.     }  
  66.   
  67.     public String getMailServerHost() {  
  68.         return mailServerHost;  
  69.     }  
  70.   
  71.     public void setMailServerHost(String mailServerHost) {  
  72.         this.mailServerHost = mailServerHost;  
  73.     }  
  74.   
  75.     public String getMailServerPort() {  
  76.         return mailServerPort;  
  77.     }  
  78.   
  79.     public void setMailServerPort(String mailServerPort) {  
  80.         this.mailServerPort = mailServerPort;  
  81.     }  
  82.   
  83.     public boolean isValidate() {  
  84.         return validate;  
  85.     }  
  86.   
  87.     public void setValidate(boolean validate) {  
  88.         this.validate = validate;  
  89.     }  
  90.   
  91.     public String[] getAttachFileNames() {  
  92.         return attachFileNames;  
  93.     }  
  94.   
  95.     public void setAttachFileNames(String[] fileNames) {  
  96.         this.attachFileNames = fileNames;  
  97.     }  
  98.   
  99.     public String getFromAddress() {  
  100.         return fromAddress;  
  101.     }  
  102.   
  103.     public void setFromAddress(String fromAddress) {  
  104.         this.fromAddress = fromAddress;  
  105.     }  
  106.   
  107.     public String getPassword() {  
  108.         return password;  
  109.     }  
  110.   
  111.     public void setPassword(String password) {  
  112.         this.password = password;  
  113.     }  
  114.   
  115.     public String getToAddress() {  
  116.         return toAddress;  
  117.     }  
  118.   
  119.     public void setToAddress(String toAddress) {  
  120.         this.toAddress = toAddress;  
  121.     }  
  122.   
  123.     public String getUserName() {  
  124.         return userName;  
  125.     }  
  126.   
  127.     public void setUserName(String userName) {  
  128.         this.userName = userName;  
  129.     }  
  130.   
  131.     public String getSubject() {  
  132.         return subject;  
  133.     }  
  134.   
  135.     public void setSubject(String subject) {  
  136.         this.subject = subject;  
  137.     }  
  138.   
  139.     public String getContent() {  
  140.         return content;  
  141.     }  
  142.   
  143.     public void setContent(String textContent) {  
  144.         this.content = textContent;  
  145.     }  
  146. }  

2、创建发送邮件的认证类MyAuthenticator

这个类是发送邮件时的认证类,此类继承自Authenticator。

具体代码如下:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package com.lyz.utils.email;  
  2.   
  3. import javax.mail.Authenticator;  
  4. import javax.mail.PasswordAuthentication;  
  5.   
  6. /** 
  7.  * 发送邮件的认证类 
  8.  * @author liuyazhuang 
  9.  * 
  10.  */  
  11. public class MyAuthenticator extends Authenticator {  
  12.     String userName = null;  
  13.     String password = null;  
  14.   
  15.     public MyAuthenticator() {  
  16.     }  
  17.   
  18.     public MyAuthenticator(String username, String password) {  
  19.         this.userName = username;  
  20.         this.password = password;  
  21.     }  
  22.   
  23.     protected PasswordAuthentication getPasswordAuthentication() {  
  24.         return new PasswordAuthentication(userName, password);  
  25.     }  
  26. }  

3、创建发送邮件的核心类MailSender

这个类是整个项目的核心,是整个项目的邮件发送器。这个类共实现了4个方法:

(1)以文本格式发送邮件,不带附件的sendTextMail方法;

(2)以带附件的方式发送文本格式邮件的sendTextMailWithAttachment方法

(3)以HTML格式发送邮件,带附件的sendHtmlMailWithAttachment方法

(4)以HTML格式发送邮件,不带附件的sendHtmlMail方法

具体代码如下:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package com.lyz.utils.email;  
  2.   
  3. import java.util.Date;  
  4. import java.util.Properties;  
  5.   
  6. import javax.activation.CommandMap;  
  7. import javax.activation.DataHandler;  
  8. import javax.activation.FileDataSource;  
  9. import javax.activation.MailcapCommandMap;  
  10. import javax.mail.Address;  
  11. import javax.mail.BodyPart;  
  12. import javax.mail.Message;  
  13. import javax.mail.MessagingException;  
  14. import javax.mail.Multipart;  
  15. import javax.mail.Session;  
  16. import javax.mail.Transport;  
  17. import javax.mail.internet.InternetAddress;  
  18. import javax.mail.internet.MimeBodyPart;  
  19. import javax.mail.internet.MimeMessage;  
  20. import javax.mail.internet.MimeMultipart;  
  21.   
  22. /** 
  23.  * @author liuyazhuang 
  24.  * 邮件发送器 
  25.  */  
  26. public class MailSender {  
  27.       
  28.       
  29.     /** 
  30.      * 以文本格式发送邮件,不带附件 
  31.      * @param mailInfo 
  32.      *            待发送的邮件的信息 
  33.      */  
  34.     public static boolean sendTextMail(MailSenderInfo mailInfo) {  
  35.         // 判断是否需要身份认证  
  36.         MyAuthenticator authenticator = null;  
  37.         Properties pro = mailInfo.getProperties();  
  38.         if (mailInfo.isValidate()) {  
  39.             // 如果需要身份认证,则创建一个密码验证器  
  40.             authenticator = new MyAuthenticator(mailInfo.getUserName(), mailInfo.getPassword());  
  41.         }  
  42.         // 根据邮件会话属性和密码验证器构造一个发送邮件的session  
  43.         Session sendMailSession = Session.getDefaultInstance(pro, authenticator);  
  44.         try {  
  45.             // 根据session创建一个邮件消息  
  46.             Message mailMessage = new MimeMessage(sendMailSession);  
  47.             // 创建邮件发送者地址  
  48.             Address from = new InternetAddress(mailInfo.getFromAddress());  
  49.             // 设置邮件消息的发送者  
  50.             mailMessage.setFrom(from);  
  51.             // 创建邮件的接收者地址,并设置到邮件消息中  
  52.             Address to = new InternetAddress(mailInfo.getToAddress());  
  53.             mailMessage.setRecipient(Message.RecipientType.TO, to);  
  54.             // 设置邮件消息的主题  
  55.             mailMessage.setSubject(mailInfo.getSubject());  
  56.             // 设置邮件消息发送的时间  
  57.             mailMessage.setSentDate(new Date());  
  58.             // 设置邮件消息的主要内容  
  59.             String mailContent = mailInfo.getContent();  
  60.             mailMessage.setText(mailContent);  
  61.             MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap();  
  62.             mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html");  
  63.             mc.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml");  
  64.             mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain");  
  65.             mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed");  
  66.             mc.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822");  
  67.             CommandMap.setDefaultCommandMap(mc);  
  68.             // 发送邮件  
  69.             Transport.send(mailMessage);  
  70.             return true;  
  71.         } catch (MessagingException ex) {  
  72.             ex.printStackTrace();  
  73.         }  
  74.         return false;  
  75.     }  
  76.       
  77.       
  78.     /**  
  79.      * 以带附件的方式发送文本格式邮件  
  80.      * @param mailInfo 待发送的邮件的信息  
  81.      * @param filenames 附件的磁盘绝对路径  
  82.      */  
  83.     public static boolean sendTextMailWithAttachment(MailSenderInfo mailInfo, String ... filenames) {  
  84.         // 判断是否需要身份认证  
  85.         MyAuthenticator authenticator = null;  
  86.         Properties pro = mailInfo.getProperties();  
  87.         if (mailInfo.isValidate()) {  
  88.             // 如果需要身份认证,则创建一个密码验证器  
  89.             authenticator = new MyAuthenticator(mailInfo.getUserName(), mailInfo.getPassword());  
  90.         }  
  91.         // 根据邮件会话属性和密码验证器构造一个发送邮件的session  
  92.         Session sendMailSession = Session.getDefaultInstance(pro, authenticator);  
  93.         try {  
  94.             // 根据session创建一个邮件消息  
  95.             Message mailMessage = new MimeMessage(sendMailSession);  
  96.             // 创建邮件发送者地址  
  97.             Address from = new InternetAddress(mailInfo.getFromAddress());  
  98.             // 设置邮件消息的发送者  
  99.             mailMessage.setFrom(from);  
  100.             // 创建邮件的接收者地址,并设置到邮件消息中  
  101.             Address to = new InternetAddress(mailInfo.getToAddress());  
  102.             mailMessage.setRecipient(Message.RecipientType.TO, to);  
  103.             // 设置邮件消息的主题  
  104.             mailMessage.setSubject(mailInfo.getSubject());  
  105.             // 设置邮件消息发送的时间  
  106.             mailMessage.setSentDate(new Date());  
  107.             //实例化Multipart  
  108.             Multipart mp = new MimeMultipart();  
  109.             //实例化发送文本的MimeBodyPart  
  110.             MimeBodyPart textFile = new MimeBodyPart();  
  111.             //设置文本信息  
  112.             textFile.setText(mailInfo.getContent(), "UTF-8");  
  113.             mp.addBodyPart(textFile);  
  114.             //是否添加了附件  
  115.             if(filenames != null && filenames.length > 0){  
  116.                 for(int i = 0; i < filenames.length; i++){  
  117.                     String fileName = filenames[i];  
  118.                     //文件名为空,跳过本次循环  
  119.                     if(fileName == null || "".equals(fileName.trim())){  
  120.                         continue;  
  121.                     }  
  122.                     MimeBodyPart mbpFile = new MimeBodyPart();  
  123.                     FileDataSource fds = new FileDataSource(fileName);  
  124.                     mbpFile.setDataHandler(new DataHandler(fds));  
  125.                     mbpFile.setFileName(fileName);  
  126.                     mp.addBodyPart(mbpFile);  
  127.                 }  
  128.             }  
  129.             mailMessage.setContent(mp);  
  130.             MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap();  
  131.             mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html");  
  132.             mc.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml");  
  133.             mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain");  
  134.             mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed");  
  135.             mc.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822");  
  136.             CommandMap.setDefaultCommandMap(mc);  
  137.             // 发送邮件  
  138.             Transport.send(mailMessage);  
  139.             return true;  
  140.         } catch (MessagingException ex) {  
  141.             ex.printStackTrace();  
  142.         }  
  143.         return false;  
  144.     }  
  145.   
  146.     /**  
  147.      * 以HTML格式发送邮件,带附件  
  148.      * @param mailInfo  
  149.      *            待发送的邮件信息  
  150.      *  @param filenames:附件在磁盘上的绝对路径  
  151.      */  
  152.     public static boolean sendHtmlMailWithAttachment(MailSenderInfo mailInfo, String... filenames) {  
  153.         // 判断是否需要身份认证  
  154.         MyAuthenticator authenticator = null;  
  155.         Properties pro = mailInfo.getProperties();  
  156.         // 如果需要身份认证,则创建一个密码验证器  
  157.         if (mailInfo.isValidate()) {  
  158.             authenticator = new MyAuthenticator(mailInfo.getUserName(), mailInfo.getPassword());  
  159.         }  
  160.         // 根据邮件会话属性和密码验证器构造一个发送邮件的session  
  161.         Session sendMailSession = Session.getDefaultInstance(pro, authenticator);  
  162.         try {  
  163.             // 根据session创建一个邮件消息  
  164.             Message mailMessage = new MimeMessage(sendMailSession);  
  165.             // 创建邮件发送者地址  
  166.             Address from = new InternetAddress(mailInfo.getFromAddress());  
  167.             // 设置邮件消息的发送者  
  168.             mailMessage.setFrom(from);  
  169.             // 创建邮件的接收者地址,并设置到邮件消息中  
  170.             Address to = new InternetAddress(mailInfo.getToAddress());  
  171.             // Message.RecipientType.TO属性表示接收者的类型为TO  
  172.             mailMessage.setRecipient(Message.RecipientType.TO, to);  
  173.             // 设置邮件消息的主题  
  174.             mailMessage.setSubject(mailInfo.getSubject());  
  175.             // 设置邮件消息发送的时间  
  176.             mailMessage.setSentDate(new Date());  
  177.             // MiniMultipart类是一个容器类,包含MimeBodyPart类型的对象  
  178.             Multipart mainPart = new MimeMultipart();  
  179.             // 创建一个包含HTML内容的MimeBodyPart  
  180.             BodyPart html = new MimeBodyPart();  
  181.             // 设置HTML内容  
  182.             html.setContent(mailInfo.getContent(), "text/html; charset=utf-8");  
  183.             mainPart.addBodyPart(html);  
  184.             //是否添加了附件  
  185.             if(filenames != null && filenames.length > 0){  
  186.                 for(int i = 0; i < filenames.length; i++){  
  187.                     String fileName = filenames[i];  
  188.                     //文件名为空,跳过本次循环  
  189.                     if(fileName == null || "".equals(fileName.trim())){  
  190.                         continue;  
  191.                     }  
  192.                     MimeBodyPart mbpFile = new MimeBodyPart();  
  193.                     FileDataSource fds = new FileDataSource(fileName);  
  194.                     mbpFile.setDataHandler(new DataHandler(fds));  
  195.                     mbpFile.setFileName(fileName);  
  196.                     mainPart.addBodyPart(mbpFile);  
  197.                 }  
  198.             }  
  199.             // 将MiniMultipart对象设置为邮件内容  
  200.             mailMessage.setContent(mainPart);  
  201.             MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap();  
  202.             mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html");  
  203.             mc.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml");  
  204.             mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain");  
  205.             mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed");  
  206.             mc.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822");  
  207.             CommandMap.setDefaultCommandMap(mc);  
  208.             // 发送邮件  
  209.             Transport.send(mailMessage);  
  210.             return true;  
  211.         } catch (MessagingException ex) {  
  212.             ex.printStackTrace();  
  213.         }  
  214.         return false;  
  215.     }  
  216.     /**  
  217.      * 以HTML格式发送邮件  
  218.      * @param mailInfo  
  219.      *            待发送的邮件信息  
  220.      */  
  221.     public static boolean sendHtmlMail(MailSenderInfo mailInfo) {  
  222.         // 判断是否需要身份认证  
  223.         MyAuthenticator authenticator = null;  
  224.         Properties pro = mailInfo.getProperties();  
  225.         // 如果需要身份认证,则创建一个密码验证器  
  226.         if (mailInfo.isValidate()) {  
  227.             authenticator = new MyAuthenticator(mailInfo.getUserName(), mailInfo.getPassword());  
  228.         }  
  229.         // 根据邮件会话属性和密码验证器构造一个发送邮件的session  
  230.         Session sendMailSession = Session.getDefaultInstance(pro, authenticator);  
  231.         try {  
  232.             // 根据session创建一个邮件消息  
  233.             Message mailMessage = new MimeMessage(sendMailSession);  
  234.             // 创建邮件发送者地址  
  235.             Address from = new InternetAddress(mailInfo.getFromAddress());  
  236.             // 设置邮件消息的发送者  
  237.             mailMessage.setFrom(from);  
  238.             // 创建邮件的接收者地址,并设置到邮件消息中  
  239.             Address to = new InternetAddress(mailInfo.getToAddress());  
  240.             // Message.RecipientType.TO属性表示接收者的类型为TO  
  241.             mailMessage.setRecipient(Message.RecipientType.TO, to);  
  242.             // 设置邮件消息的主题  
  243.             mailMessage.setSubject(mailInfo.getSubject());  
  244.             // 设置邮件消息发送的时间  
  245.             mailMessage.setSentDate(new Date());  
  246.             // MiniMultipart类是一个容器类,包含MimeBodyPart类型的对象  
  247.             Multipart mainPart = new MimeMultipart();  
  248.             // 创建一个包含HTML内容的MimeBodyPart  
  249.             BodyPart html = new MimeBodyPart();  
  250.             // 设置HTML内容  
  251.             html.setContent(mailInfo.getContent(), "text/html; charset=utf-8");  
  252.             mainPart.addBodyPart(html);  
  253.             // 将MiniMultipart对象设置为邮件内容  
  254.             mailMessage.setContent(mainPart);  
  255.             MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap();  
  256.             mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html");  
  257.             mc.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml");  
  258.             mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain");  
  259.             mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed");  
  260.             mc.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822");  
  261.             CommandMap.setDefaultCommandMap(mc);  
  262.             // 发送邮件  
  263.             Transport.send(mailMessage);  
  264.             return true;  
  265.         } catch (MessagingException ex) {  
  266.             ex.printStackTrace();  
  267.         }  
  268.         return false;  
  269.     }  
  270. }  

4、创建配置文件email.properties

为了更加符合编程的规范,这里我们将发送邮件必须要用到的一些信息放到一个配置文件中,在项目的classpath目录下建立email.properties文件。

具体代码如下:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. mail_server_host = smtp.qq.com  
  2. mail_server_port = 995  
  3. mail_user_name = your username  
  4. mail_password = your password  
  5. mail_from_address = your email where send email  
注:大家要将文件中的用户名、密码、和发送邮件的邮箱替换为自己的用户名、密码和发送邮件的邮箱。

5、创建测试类SendTest

这个类是整个项目的测试类,测试是否能够实现发送邮件的功能

具体代码如下:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package com.lyz.utils.test;  
  2.   
  3. import java.io.InputStream;  
  4. import java.util.Properties;  
  5.   
  6. import com.lyz.utils.email.MailSender;  
  7. import com.lyz.utils.email.MailSenderInfo;  
  8.   
  9. /** 
  10.  * 测试发送邮件 
  11.  * @author liuyazhuang 
  12.  * 
  13.  */  
  14. public class SendTest {  
  15.   
  16.     /** 
  17.      *  
  18.      *  QQ邮箱 POP3 和 SMTP 服务器地址设置如下:邮箱POP3服务器(端口110)SMTP服务器(端口25)qq.com pop.qq.com smtp.qq.comSMTP服务器需要身份验证。 
  19.         如果是设置POP3和SMTP的SSL加密方式,则端口如下: 
  20.         POP3服务器(端口995) 
  21.         SMTP服务器(端口465或587)。 
  22.      * @param args 
  23.      */  
  24.     public static void main(String[] args) throws Exception{  
  25.         Properties prop = new Properties();  
  26.         InputStream in = SendTest.class.getResourceAsStream("/email.properties");  
  27.         prop.load(in);  
  28.           
  29.         MailSenderInfo mailInfo = new MailSenderInfo();  
  30.         mailInfo.setMailServerHost(prop.getProperty("mail_server_host"));  
  31.         mailInfo.setMailServerPort(prop.getProperty("mail_server_port"));  
  32.         mailInfo.setUserName(prop.getProperty("mail_user_name"));  
  33.         mailInfo.setPassword(prop.getProperty("mail_password"));  
  34.         mailInfo.setFromAddress(prop.getProperty("mail_from_address"));  
  35.           
  36.         mailInfo.setValidate(true);  
  37.         mailInfo.setToAddress("你要发送邮件的目标邮箱");  
  38.         mailInfo.setSubject("你好");  
  39.         mailInfo.setContent("我叫刘亚壮");  
  40.           
  41.         // 这个类主要来发送邮件  
  42.         MailSender.sendTextMailWithAttachment(mailInfo);// 发送文体格式  
  43.     }  
  44.   
  45. }  

三、运行效果

四、附录

大家可以到链接http://download.csdn.net/detail/l1028386804/9490320下载开发邮件程序所需要的jar包,到链接http://download.csdn.net/detail/l1028386804/9490326下载java发送邮件的完整源代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值