java Mail收发邮件带附件

java Mail发送邮件带附件 <1>


package snowrain.javaMail;

import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Address;
import javax.mail.Authenticator;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

/**
*
*
* @author yaor
* @version 1.0
* @created 2010-7-16 下午04:53:05
* 邮件发送测试 mail.jar与activation.jar
*/

public class MailConstructor {
// private String EnvelopeFrom;//邮件发送地址
// private String MailHost;//邮件服务器
private String UserName;// 用户名

private String PassWord;// 用户密码

private MimeMessage mimeMsg; // MIME邮件对象

private Session session; // 邮件会话对象

private Properties props; // 系统属性

// private boolean needAuth = false; //smtp 是否需要认证

private Multipart mp; // Multipart对象,邮件内容,标题,附件等内容均添加到其中后再生成MimeMessage对象

Authenticator auth;

public MailConstructor() {
}

/**
* public void sendMail() {
* setSmtpHost(getConfig.mailHost);// 如果没有指定邮件服务器,就从getConfig类中获取
* createMimeMessage(); }
*/
public MailConstructor(String smtp) {
setSmtpHost(smtp);
createMimeMessage();

}

/**
* @param hostName
* String
*/
public void setSmtpHost(String hostName) {
System.out.println(" 设置系统属性:mail.smtp.host = " + hostName);
if (props == null)
props = System.getProperties(); // 获得系统属性对象
props.put("mail.smtp.host", hostName); // 设置SMTP主机

auth = new Email_Autherticator();//进行邮件服务器用户认证
props.put("mail.smtp.auth", "true");

}

/**
* @return boolean
*/
public boolean createMimeMessage() {
try {
System.out.println(" 准备获取邮件会话对象!");
session = Session.getDefaultInstance(props, null); // 获得邮件会话对象
} catch (Exception e) {
System.err.println("获取邮件会话对象时发生错误!" + e);
return false;
}
System.out.println(" 准备创建MIME邮件对象!");
try {
mimeMsg = new MimeMessage(session); // 创建MIME邮件对象
mp = new MimeMultipart();
return true;
} catch (Exception e) {
System.err.println(" 创建MIME邮件对象失败!" + e);
return false;
}
}

/**
* @param need
* boolean
*/
public void setNeedAuth(boolean need) {
System.out.println(" 设置smtp身份认证:mail.smtp.auth = " + need);
if (props == null)
props = System.getProperties();
if (need) {
props.put("mail.smtp.auth", "true");
} else {
props.put("mail.smtp.auth", "false");
}
}

/**
* @param name
* String
* @param pass
* String
*/
public void setNamePass(String name, String pass) {
UserName = name;
PassWord = pass;
}

/**
* @param mailSubject
* String
* @return boolean
*/
public boolean setSubject(String mailSubject) {
System.out.println("设置邮件主题!");
try {
mimeMsg.setSubject(mailSubject);
return true;
} catch (Exception e) {
System.err.println(" 设置邮件主题发生错误!");
return false;
}
}

/**
* @param mailBody
* String
*/
public boolean setBody(String mailBody) {
try {
BodyPart bp = new MimeBodyPart();
bp.setContent(
" <meta http-equiv=Content-Type content=text/html; charset=gb2312>"
+ mailBody, "text/html;charset=GB2312");
mp.addBodyPart(bp);
return true;
} catch (Exception e) {
System.err.println(" 设置邮件正文时发生错误!" + e);
return false;
}
}

public boolean addFileAffix(String filename) {
System.out.println(" 增加邮件附件:" + filename);
try {
BodyPart bp = new MimeBodyPart();
FileDataSource fileds = new FileDataSource(filename);
bp.setDataHandler(new DataHandler(fileds));
bp.setFileName(fileds.getName());
mp.addBodyPart(bp);
return true;
} catch (Exception e) {
System.err.println("增加邮件附件:" + filename + "发生错误!" + e);
return false;
}
}

public boolean setFrom(String from) {
System.out.println("设置发信人!");
try {
mimeMsg.setFrom(new InternetAddress(from)); // 设置发信人
return true;
} catch (Exception e) {
return false;
}
}

public boolean setTo(String to) {
if (to == null)
return false;
try {
mimeMsg.setRecipients(Message.RecipientType.TO, InternetAddress
.parse(to));
return true;
} catch (Exception e) {
return false;
}
}

public boolean setCopyTo(String copyto) {
if (copyto == null)
return false;
try {
mimeMsg.setRecipients(Message.RecipientType.CC,
(Address[]) InternetAddress.parse(copyto));
return true;
} catch (Exception e) {
return false;
}
}

public boolean sendout() {
try {
mimeMsg.setContent(mp);
mimeMsg.saveChanges();
System.out.println(" 正在发送邮件....");
Session mailSession = Session.getInstance(props, auth);
Transport transport = mailSession.getTransport("smtp");
transport.connect((String) props.get("mail.smtp.host"), UserName,
PassWord);

transport.sendMessage(mimeMsg, mimeMsg
.getRecipients(Message.RecipientType.TO));
// transport.send(mimeMsg);
System.out.println("发送邮件成功!");
transport.close();
return true;
} catch (Exception e) {
System.err.println("邮件发送失败!" + e);
return false;
}
}

/**
* Just do it as this
*/
public static void main(String[] args) {
String mailbody = " <meta http-equiv=Content-Type content=text/html; charset=gb2312>"
+ " <div align=center><a href=http://www.baidu.com> 恭喜你,中奖啦! </a> </div>";
MailConstructor themail = new MailConstructor("smtp.163.com");
themail.setNeedAuth(true);
if (themail.setSubject("标题") == false)
return;
if (themail.setBody(mailbody) == false)
return;
if (themail.setFrom("yr512656630@163.com") == false)//接收者
return;
if (themail.setTo("326299987@qq.com") == false)//发送者
return;

if (themail.setBody("二孩,你的肚子饿了没有哦!!!") == false)
return;
if (themail.addFileAffix("c:/send.txt") == false)
return;
// if(themail.addFileAffix("c:\\boot.ini") == false) return;
themail.setNamePass("yr512656630@163.com", "******");
if (themail.sendout() == false)
return;
}

public class Email_Autherticator extends Authenticator {//此段代码用来进行服务器对用户的认证
public Email_Autherticator() {
super();
}

public PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(UserName, PassWord);
}
}

}



所需JAR包如下:mail.jar与activation.jar


下面是发送和接收的一个DEMO


=======================================接收
package snowrain.javaMail;

/**
*
*
* @author yaor
* @version 1.0
* @created 2010-7-16 下午05:24:43
* 接收邮件测试
*/

import java.io.*;
import java.text.*;
import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;

public class ReceiveMail {

private MimeMessage mimeMessage = null;

private String saveAttachPath = ""; // 附件下载后的存放目录

private StringBuffer bodytext = new StringBuffer();

// 存放邮件内容的StringBuffer对象
private String dateformat = "yy-MM-dd HH:mm"; // 默认的日前显示格式

/**
* 构造函数,初始化一个MimeMessage对象
*/
public ReceiveMail() {
}

public ReceiveMail(MimeMessage mimeMessage) {
this.mimeMessage = mimeMessage;
System.out.println("create a ReceiveMail object........");
}

public void setMimeMessage(MimeMessage mimeMessage) {
this.mimeMessage = mimeMessage;
}

/**
* * 获得发件人的地址和姓名
*/
public String getFrom() throws Exception {
InternetAddress address[] = (InternetAddress[]) mimeMessage.getFrom();
String from = address[0].getAddress();
if (from == null)
from = "";
String personal = address[0].getPersonal();
if (personal == null)
personal = "";
String fromaddr = personal + "<" + from + ">";
return fromaddr;
}

/**
* * 获得邮件的收件人,抄送,和密送的地址和姓名,根据所传递的参数的不同 * "to"----收件人 "cc"---抄送人
*
* 地址 "bcc"---密送人地址
*/

public String getMailAddress(String type) throws Exception {
String mailaddr = "";
String addtype = type.toUpperCase();
InternetAddress[] address = null;
if (addtype.equals("TO") || addtype.equals("CC")
|| addtype.equals("BCC")) {
if (addtype.equals("TO")) {
address = (InternetAddress[]) mimeMessage
.getRecipients(Message.RecipientType.TO);
} else if (addtype.equals("CC")) {
address = (InternetAddress[]) mimeMessage
.getRecipients(Message.RecipientType.CC);
} else {
address = (InternetAddress[]) mimeMessage
.getRecipients(Message.RecipientType.BCC);
}
if (address != null) {
for (int i = 0; i < address.length; i++) {
String email = address[i].getAddress();
if (email == null)
email = "";
else {
email = MimeUtility.decodeText(email);
}
String personal = address[i].getPersonal();
if (personal == null)
personal = "";
else {
personal = MimeUtility.decodeText(personal);
}
String compositeto = personal + "<" + email + ">";
mailaddr += "," + compositeto;
}
mailaddr = mailaddr.substring(1);
}
} else {
throw new Exception("Error emailaddr type!");
}
return mailaddr;
}

/**
* * 获得邮件主题
*/

public String getSubject() throws MessagingException {
String subject = "";
try {
subject = MimeUtility.decodeText(mimeMessage.getSubject());
if (subject == null)
subject = "";
} catch (Exception exce) {
}
return subject;
}

/**
* * 获得邮件发送日期
*/

public String getSentDate() throws Exception {
Date sentdate = mimeMessage.getSentDate();
SimpleDateFormat format = new SimpleDateFormat(dateformat);
return format.format(sentdate);
}

/**
* * 获得邮件正文内容
*/

public String getBodyText() {
return bodytext.toString();
}

/**
* * 解析邮件,把得到的邮件内容保存到一个StringBuffer对象中,解析邮件 *
* 主要是根据MimeType类型的不同执行不同的操作,一步一步的解析
*/

public void getMailContent(Part part) throws Exception {
String contenttype = part.getContentType();
int nameindex = contenttype.indexOf("name");
boolean conname = false;
if (nameindex != -1)
conname = true;
System.out.println("CONTENTTYPE: " + contenttype);
if (part.isMimeType("text/plain") && !conname) {
bodytext.append((String) part.getContent());
} else if (part.isMimeType("text/html") && !conname) {
bodytext.append((String) part.getContent());
} else if (part.isMimeType("multipart/*")) {
Multipart multipart = (Multipart) part.getContent();
int counts = multipart.getCount();
for (int i = 0; i < counts; i++) {
getMailContent(multipart.getBodyPart(i));
}
} else if (part.isMimeType("message/rfc822")) {
getMailContent((Part) part.getContent());
} else {
}
}

/**
* * 判断此邮件是否需要回执,如果需要回执返回"true",否则返回"false"
*/
public boolean getReplySign() throws MessagingException {
boolean replysign = false;
String needreply[] = mimeMessage
.getHeader("Disposition-Notification-To");
if (needreply != null) {
replysign = true;
}
return replysign;
}

/**
* * 获得此邮件的Message-ID
*/
public String getMessageId() throws MessagingException {
return mimeMessage.getMessageID();
}

/**
* * 【判断此邮件是否已读,如果未读返回返回false,反之返回true】
*/
public boolean isNew() throws MessagingException {
boolean isnew = false;
Flags flags = ((Message) mimeMessage).getFlags();
Flags.Flag[] flag = flags.getSystemFlags();
System.out.println("flags's length: " + flag.length);
for (int i = 0; i < flag.length; i++) {
if (flag[i] == Flags.Flag.SEEN) {
isnew = true;
System.out.println("seen Message.......");
break;
}
}
return isnew;
}

/**
* * 判断此邮件是否包含附件
*/
public boolean isContainAttach(Part part) throws Exception {
boolean attachflag = false;
String contentType = part.getContentType();
if (part.isMimeType("multipart/*")) {
Multipart mp = (Multipart) part.getContent();
for (int i = 0; i < mp.getCount(); i++) {
BodyPart mpart = mp.getBodyPart(i);
String disposition = mpart.getDisposition();
if ((disposition != null)
&& ((disposition.equals(Part.ATTACHMENT)) || (disposition
.equals(Part.INLINE))))
attachflag = true;
else if (mpart.isMimeType("multipart/*")) {
attachflag = isContainAttach((Part) mpart);
} else {
String contype = mpart.getContentType();
if (contype.toLowerCase().indexOf("application") != -1)
attachflag = true;
if (contype.toLowerCase().indexOf("name") != -1)
attachflag = true;
}
}
} else if (part.isMimeType("message/rfc822")) {
attachflag = isContainAttach((Part) part.getContent());
}
return attachflag;
}

/**
* * 【保存附件】
*/

public void saveAttachMent(Part part) throws Exception {
String fileName = "";
if (part.isMimeType("multipart/*")) {
Multipart mp = (Multipart) part.getContent();
for (int i = 0; i < mp.getCount(); i++) {
BodyPart mpart = mp.getBodyPart(i);
String disposition = mpart.getDisposition();
if ((disposition != null)
&& ((disposition.equals(Part.ATTACHMENT)) || (disposition
.equals(Part.INLINE)))) {
fileName = mpart.getFileName();
if (fileName.toLowerCase().indexOf("gb2312") != -1) {
fileName = MimeUtility.decodeText(fileName);
}
saveFile(fileName, mpart.getInputStream());
} else if (mpart.isMimeType("multipart/*")) {
saveAttachMent(mpart);
} else {
fileName = mpart.getFileName();
if ((fileName != null)
&& (fileName.toLowerCase().indexOf("GB2312") != -1)) {
fileName = MimeUtility.decodeText(fileName);
saveFile(fileName, mpart.getInputStream());
}
}
}
} else if (part.isMimeType("message/rfc822")) {
saveAttachMent((Part) part.getContent());
}
}

/**
* * 【设置附件存放路径】
*/

public void setAttachPath(String attachpath) {
this.saveAttachPath = attachpath;
}

/**
* * 【设置日期显示格式】
*/

public void setDateFormat(String format) throws Exception {
this.dateformat = format;
}

/**
* * 【获得附件存放路径】
*/

public String getAttachPath() {
return saveAttachPath;
}

/**
* * 【真正的保存附件到指定目录里】
*/

private void saveFile(String fileName, InputStream in) throws Exception {
String osName = System.getProperty("os.name");
String storedir = getAttachPath();
String separator = "";
if (osName == null)
osName = "";
if (osName.toLowerCase().indexOf("win") != -1) {
separator = "\\";
if (storedir == null || storedir.equals(""))
storedir = "c:\\tmp";
} else {
separator = "/";
storedir = "/tmp";
}
File storefile = new File(storedir + separator + fileName);
System.out.println("storefile's path: " + storefile.toString());
// for(int i=0;storefile.exists();i++){
// storefile = new File(storedir+separator+fileName+i);
// }
BufferedOutputStream bos = null;
BufferedInputStream bis = null;
try {
bos = new BufferedOutputStream(new FileOutputStream(storefile));
bis = new BufferedInputStream(in);
int c;
while ((c = bis.read()) != -1) {
bos.write(c);
bos.flush();
}
} catch (Exception exception) {
exception.printStackTrace();
throw new Exception("文件保存失败!");
} finally {
bos.close();
bis.close();
}
}

/**
* * ReceiveMail类测试
*/

public static void main(String args[]) throws Exception {
String host = "pop.163.com";
String username = "yr512656630";// 您的邮箱用户名
String password = "******";// 您的邮箱密码
Properties props = new Properties();
Session session = Session.getDefaultInstance(props, null);
Store store = session.getStore("pop3");
store.connect(host, username, password);
Folder folder = store.getFolder("INBOX");
folder.open(Folder.READ_ONLY);
Message message[] = folder.getMessages();
System.out.println("Messages's length: " + message.length);
ReceiveMail pmm = null;
for (int i = 0; i < message.length; i++) {
pmm = new ReceiveMail((MimeMessage) message[i]);
System.out
.println("Message " + i + " subject: " + pmm.getSubject());
System.out.println("Message " + i + " sentdate: "
+ pmm.getSentDate());
System.out.println("Message " + i + " replysign: "
+ pmm.getReplySign());
System.out.println("Message " + i + " hasRead: " + pmm.isNew());
System.out.println("Message " + i + " containAttachment: "
+ pmm.isContainAttach((Part) message[i]));
System.out.println("Message " + i + " form: " + pmm.getFrom());
System.out.println("Message " + i + " to: "
+ pmm.getMailAddress("to"));
System.out.println("Message " + i + " cc: "
+ pmm.getMailAddress("cc"));
System.out.println("Message " + i + " bcc: "
+ pmm.getMailAddress("bcc"));
pmm.setDateFormat("yy年MM月dd日 HH:mm");
System.out.println("Message " + i + " sentdate: "
+ pmm.getSentDate());
System.out.println("Message " + i + " Message-ID: "
+ pmm.getMessageId());
pmm.getMailContent((Part) message[i]);
System.out.println("Message " + i + " bodycontent: \r\n"
+ pmm.getBodyText());
//pmm.setAttachPath("c:\\tmp\\coffeecat1124");
pmm.setAttachPath("c:\\mail\\mail.txt");
pmm.saveAttachMent((Part) message[i]);
}
}
}




=======================================发送
package snowrain.javaMail;

/**
*
*
* @author yaor
* @version 1.0
* @created 2010-7-16 下午05:25:37
* 发送邮件测试
*/

import java.util.Date;
import java.util.Enumeration;
import java.util.Properties;
import java.util.Vector;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;

/**
* Title: 使用javamail发送邮件
* Description: 演示如何使用javamail包发送电子邮件。这个实例可发送多附件
* @version 1.0
*/
public class SendMail {

String to = "";// 收件人
String from = "";// 发件人
String host = "";// smtp主机
String username = "";
String password = "";
String filename = "";// 附件文件名
String subject = "";// 邮件主题
String content = "";// 邮件正文
Vector file = new Vector();// 附件文件集合

/**
* <br>
* 方法说明:默认构造器 <br>
* 输入参数: <br>
* 返回类型:
*/
public SendMail() {
}

/**
* <br>
* 方法说明:构造器,提供直接的参数传入 <br>
* 输入参数: <br>
* 返回类型:
*/
public SendMail(String to, String from, String smtpServer, String username,
String password, String subject, String content) {
this.to = to;
this.from = from;
this.host = smtpServer;
this.username = username;
this.password = password;
this.subject = subject;
this.content = content;
}

/**
* <br>
* 方法说明:设置邮件服务器地址 <br>
* 输入参数:String host 邮件服务器地址名称 <br>
* 返回类型:
*/
public void setHost(String host) {
this.host = host;
}

/**
* <br>
* 方法说明:设置登录服务器校验密码 <br>
* 输入参数: <br>
* 返回类型:
*/
public void setPassWord(String pwd) {
this.password = pwd;
}

/**
* <br>
* 方法说明:设置登录服务器校验用户 <br>
* 输入参数: <br>
* 返回类型:
*/
public void setUserName(String usn) {
this.username = usn;
}

/**
* <br>
* 方法说明:设置邮件发送目的邮箱 <br>
* 输入参数: <br>
* 返回类型:
*/
public void setTo(String to) {
this.to = to;
}

/**
* <br>
* 方法说明:设置邮件发送源邮箱 <br>
* 输入参数: <br>
* 返回类型:
*/
public void setFrom(String from) {
this.from = from;
}

/**
* <br>
* 方法说明:设置邮件主题 <br>
* 输入参数: <br>
* 返回类型:
*/
public void setSubject(String subject) {
this.subject = subject;
}

/**
* <br>
* 方法说明:设置邮件内容 <br>
* 输入参数: <br>
* 返回类型:
*/
public void setContent(String content) {
this.content = content;
}

/**
* <br>
* 方法说明:把主题转换为中文 <br>
* 输入参数:String strText <br>
* 返回类型:
*/
public String transferChinese(String strText) {
try {
strText = MimeUtility.encodeText(new String(strText.getBytes(),
"GB2312"), "GB2312", "B");
} catch (Exception e) {
e.printStackTrace();
}
return strText;
}

/**
* <br>
* 方法说明:往附件组合中添加附件 <br>
* 输入参数: <br>
* 返回类型:
*/
public void attachfile(String fname) {
file.addElement(fname);
}

/**
* <br>
* 方法说明:发送邮件 <br>
* 输入参数: <br>
* 返回类型:boolean 成功为true,反之为false
*/
public boolean sendMail() {

// 构造mail session
Properties props = System.getProperties();
props.put("mail.smtp.host", host);
props.put("mail.smtp.auth", "true");
Session session = Session.getDefaultInstance(props,
new Authenticator() {
public PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
});

try {
// 构造MimeMessage 并设定基本的值
MimeMessage msg = new MimeMessage(session);
msg.setFrom(new InternetAddress(from));
InternetAddress[] address = { new InternetAddress(to) };
msg.setRecipients(Message.RecipientType.TO, address);
subject = transferChinese(subject);
msg.setSubject(subject);

// 构造Multipart
Multipart mp = new MimeMultipart();

// 向Multipart添加正文
MimeBodyPart mbpContent = new MimeBodyPart();
mbpContent.setText(content);
// 向MimeMessage添加(Multipart代表正文)
mp.addBodyPart(mbpContent);

// 向Multipart添加附件
Enumeration efile = file.elements();
while (efile.hasMoreElements()) {

MimeBodyPart mbpFile = new MimeBodyPart();
filename = efile.nextElement().toString();
FileDataSource fds = new FileDataSource(filename);
mbpFile.setDataHandler(new DataHandler(fds));
mbpFile.setFileName(fds.getName());
// 向MimeMessage添加(Multipart代表附件)
mp.addBodyPart(mbpFile);

}

file.removeAllElements();
// 向Multipart添加MimeMessage
msg.setContent(mp);
msg.setSentDate(new Date());
// 发送邮件
Transport.send(msg);

} catch (MessagingException mex) {
mex.printStackTrace();
Exception ex = null;
if ((ex = mex.getNextException()) != null) {
ex.printStackTrace();
}
return false;
}
return true;
}

/**
* <br>
* 方法说明:主方法,用于测试 <br>
* 输入参数: <br>
* 返回类型:
*/
public static void main(String[] args) {
SendMail sendmail = new SendMail();
sendmail.setHost("smtp.163.com");//smtp.mail.yahoo.com.cn
sendmail.setUserName("yr512656630");//您的邮箱用户名
sendmail.setPassWord("******");//您的邮箱密码
sendmail.setTo("512656630@qq.com");//接收者
sendmail.setFrom("yr512656630@163.com");//发送者
sendmail.setSubject("你好,这是测试2!");
sendmail.setContent("你好这是一个带多附件的测试2!");
sendmail.attachfile("c:/send.txt");
sendmail.attachfile("c:/send.txt");
sendmail.sendMail();

}
}



注意,在使用发送的时候会报javax.mail.AuthenticationFailedException异常

解决方法,JAR包冲突,删掉项目中java ee 5包

或者去IDE的目录找到JAVA ee5删除mail文件夹,如我用的是5.1

D:\Program Files\MyEclipse 5.5.1 GA\myeclipse\eclipse\plugins\com.genuitec.eclipse.j2eedt.core_5.5.1\data\libraryset\EE_5

用压缩包打开javaee.jar 删除 mail和activation即可解决jar冲突
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值