javamail实例之获取邮件,包括gmail yahoo

 http://www.oracle.com/technetwork/java/javamail/index-138643.html

https://java.net/projects/javamail/pages/Home#Samples

/*
 * Copyright (c) 1997-2012 Oracle and/or its affiliates. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *   - Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 *
 *   - Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in the
 *     documentation and/or other materials provided with the distribution.
 *
 *   - Neither the name of Oracle nor the names of its
 *     contributors may be used to endorse or promote products derived
 *     from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

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

/*
 * Demo app that exercises the Message interfaces.
 * Show information about and contents of messages.
 *
 * @author John Mani
 * @author Bill Shannon
 */

public class msgshow {

	static String protocol;
	static String host = null;
	static String user = null;
	static String password = null;
	static String mbox = null;
	static String url = null;
	static int port = -1;
	static boolean verbose = false;
	static boolean debug = false;
	static boolean showStructure = false;
	static boolean showMessage = false;
	static boolean showAlert = false;
	static boolean saveAttachments = false;
	static int attnum = 1;

	public static void main(String argv[]) {
		int optind;
		InputStream msgStream = System.in;

		if (argv.length < 2) {
			// gmail https -p 465
			//argv = "-T imaps -H imap.gmail.com -U xxx@gmail.com -P xxx ".split(" ");
			 argv="-D -T pop3s -H pop.gmail.com -U xxx@gmail.com -P xxx".split(" ");
			// argv="-D -T pop3s -H pop.mail.yahoo.com -U xxx@yahoo.com -P xxx".split(" ");
			// argv="-T imaps -H imap.mail.yahoo.com -U xxx@yahoo.com -P xxx".split(" ");

		}

		for (optind = 0; optind < argv.length; optind++) {
			if (argv[optind].equals("-T")) {
				protocol = argv[++optind];
			} else if (argv[optind].equals("-H")) {
				host = argv[++optind];
			} else if (argv[optind].equals("-U")) {
				user = argv[++optind];
			} else if (argv[optind].equals("-P")) {
				password = argv[++optind];
			} else if (argv[optind].equals("-v")) {
				verbose = true;
			} else if (argv[optind].equals("-D")) {
				debug = true;
			} else if (argv[optind].equals("-f")) {
				mbox = argv[++optind];
			} else if (argv[optind].equals("-L")) {
				url = argv[++optind];
			} else if (argv[optind].equals("-p")) {
				port = Integer.parseInt(argv[++optind]);
			} else if (argv[optind].equals("-s")) {
				showStructure = true;
			} else if (argv[optind].equals("-S")) {
				saveAttachments = true;
			} else if (argv[optind].equals("-m")) {
				showMessage = true;
			} else if (argv[optind].equals("-a")) {
				showAlert = true;
			} else if (argv[optind].equals("--")) {
				optind++;
				break;
			} else if (argv[optind].startsWith("-")) {
				System.out
						.println("Usage: msgshow [-L url] [-T protocol] [-H host] [-p port] [-U user]");
				System.out
						.println("\t[-P password] [-f mailbox] [msgnum ...] [-v] [-D] [-s] [-S] [-a]");
				System.out
						.println("or     msgshow -m [-v] [-D] [-s] [-S] [-f msg-file]");
				System.exit(1);
			} else {
				break;
			}
		}

		try {
			// Get a Properties object
			Properties props = System.getProperties();
			/**
			if (host.equals("imap.gmail.com")) {
				props.setProperty("mail.smtp.starttls.enable", "true");
				props.setProperty("mail.smtp.socketFactory.port", "465");
				props.setProperty("mail.smtp.socketFactory.class",
						"javax.net.ssl.SSLSocketFactory");
				props.setProperty("mail.smtp.socketFactory.fallback", "false");
				
				props.setProperty("mail.smtp.auth", "true");
				props.setProperty("mail.smtp.port", "465");
				props.setProperty("mail.smtp.host", "smtp.gmail.com");
			}*/
			// Get a Session object
			Session session = Session.getInstance(props, null);
			/**
			if (host.equals("imap.gmail.com"))// gmail需要授权 ssl
			{
				session = Session.getInstance(props, new Authenticator() {
					@Override
					protected PasswordAuthentication getPasswordAuthentication() {

						return new PasswordAuthentication(user, password);
					}
				});
				System.out.println("gmail");
			}*/

			session.setDebug(debug);

			if (showMessage) {
				MimeMessage msg;
				if (mbox != null)
					msg = new MimeMessage(session, new BufferedInputStream(
							new FileInputStream(mbox)));
				else
					msg = new MimeMessage(session, msgStream);
				dumpPart(msg);
				System.exit(0);
			}

			// Get a Store object
			Store store = null;
			if (url != null) {
				URLName urln = new URLName(url);
				store = session.getStore(urln);
				if (showAlert) {
					store.addStoreListener(new StoreListener() {
						public void notification(StoreEvent e) {
							String s;
							if (e.getMessageType() == StoreEvent.ALERT)
								s = "ALERT: ";
							else
								s = "NOTICE: ";
							System.out.println(s + e.getMessage());
						}
					});
				}
				store.connect();
			} else {
				if (protocol != null)
					store = session.getStore(protocol);
				else
					store = session.getStore();

				// Connect
				if (host != null || user != null || password != null)
					store.connect(host, port, user, password);
				else
					store.connect();
			}

			// Open the Folder

			Folder folder = store.getDefaultFolder();
			if (folder == null) {
				System.out.println("No default folder");
				System.exit(1);
			}

			if (mbox == null)
				mbox = "INBOX";
			folder = folder.getFolder(mbox);
			if (folder == null) {
				System.out.println("Invalid folder");
				System.exit(1);
			}

			// try to open read/write and if that fails try read-only
			try {
				folder.open(Folder.READ_WRITE);
			} catch (MessagingException ex) {
				folder.open(Folder.READ_ONLY);
			}
			int totalMessages = folder.getMessageCount();

			if (totalMessages == 0) {
				System.out.println("Empty folder");
				folder.close(false);
				store.close();
				System.exit(1);
			}

			if (verbose) {
				int newMessages = folder.getNewMessageCount();
				System.out.println("Total messages = " + totalMessages);
				System.out.println("New messages = " + newMessages);
				System.out.println("-------------------------------");
			}

			if (optind >= argv.length) {
				// Attributes & Flags for all messages ..
				Message[] msgs = folder.getMessages();

				// Use a suitable FetchProfile
				FetchProfile fp = new FetchProfile();
				fp.add(FetchProfile.Item.ENVELOPE);
				fp.add(FetchProfile.Item.FLAGS);
				fp.add("X-Mailer");
				folder.fetch(msgs, fp);

				for (int i = 0; i < msgs.length; i++) {
					System.out.println("--------------------------");
					System.out.println("MESSAGE #" + (i + 1) + ":");
					dumpEnvelope(msgs[i]);
					// dumpPart(msgs[i]);
				}
			} else {
				while (optind < argv.length) {
					int msgnum = Integer.parseInt(argv[optind++]);
					System.out.println("Getting message number: " + msgnum);
					Message m = null;

					try {
						m = folder.getMessage(msgnum);
						dumpPart(m);
					} catch (IndexOutOfBoundsException iex) {
						System.out.println("Message number out of range");
					}
				}
			}

			folder.close(false);
			store.close();
		} catch (Exception ex) {
			System.out.println("Oops, got exception! " + ex.getMessage());
			ex.printStackTrace();
			System.exit(1);
		}
		System.exit(0);
	}

	public static void dumpPart(Part p) throws Exception {
		if (p instanceof Message)
			dumpEnvelope((Message) p);

		/**
		 * Dump input stream ..
		 * 
		 * InputStream is = p.getInputStream(); // If "is" is not already
		 * buffered, wrap a BufferedInputStream // around it. if (!(is
		 * instanceof BufferedInputStream)) is = new BufferedInputStream(is);
		 * int c; while ((c = is.read()) != -1) System.out.write(c);
		 **/

		String ct = p.getContentType();
		try {
			pr("CONTENT-TYPE: " + (new ContentType(ct)).toString());
		} catch (ParseException pex) {
			pr("BAD CONTENT-TYPE: " + ct);
		}
		String filename = p.getFileName();
		if (filename != null)
			pr("FILENAME: " + filename);

		/*
		 * Using isMimeType to determine the content type avoids fetching the
		 * actual content data until we need it.
		 */
		if (p.isMimeType("text/plain")) {
			pr("This is plain text");
			pr("---------------------------");
			if (!showStructure && !saveAttachments)
				System.out.println((String) p.getContent());
		} else if (p.isMimeType("multipart/*")) {
			pr("This is a Multipart");
			pr("---------------------------");
			Multipart mp = (Multipart) p.getContent();
			level++;
			int count = mp.getCount();
			for (int i = 0; i < count; i++)
				dumpPart(mp.getBodyPart(i));
			level--;
		} else if (p.isMimeType("message/rfc822")) {
			pr("This is a Nested Message");
			pr("---------------------------");
			level++;
			dumpPart((Part) p.getContent());
			level--;
		} else {
			if (!showStructure && !saveAttachments) {
				/*
				 * If we actually want to see the data, and it's not a MIME type
				 * we know, fetch it and check its Java type.
				 */
				Object o = p.getContent();
				if (o instanceof String) {
					pr("This is a string");
					pr("---------------------------");
					System.out.println((String) o);
				} else if (o instanceof InputStream) {
					pr("This is just an input stream");
					pr("---------------------------");
					InputStream is = (InputStream) o;
					int c;
					while ((c = is.read()) != -1)
						System.out.write(c);
				} else {
					pr("This is an unknown type");
					pr("---------------------------");
					pr(o.toString());
				}
			} else {
				// just a separator
				pr("---------------------------");
			}
		}

		/*
		 * If we're saving attachments, write out anything that looks like an
		 * attachment into an appropriately named file. Don't overwrite existing
		 * files to prevent mistakes.
		 */
		if (saveAttachments && level != 0 && p instanceof MimeBodyPart
				&& !p.isMimeType("multipart/*")) {
			String disp = p.getDisposition();
			// many mailers don't include a Content-Disposition
			if (disp == null || disp.equalsIgnoreCase(Part.ATTACHMENT)) {
				if (filename == null)
					filename = "Attachment" + attnum++;
				pr("Saving attachment to file " + filename);
				try {
					File f = new File(filename);
					if (f.exists())
						// XXX - could try a series of names
						throw new IOException("file exists");
					((MimeBodyPart) p).saveFile(f);
				} catch (IOException ex) {
					pr("Failed to save attachment: " + ex);
				}
				pr("---------------------------");
			}
		}
	}

	public static void dumpEnvelope(Message m) throws Exception {
		pr("This is the message envelope");
		pr("---------------------------");
		Address[] a;
		// FROM
		if ((a = m.getFrom()) != null) {
			for (int j = 0; j < a.length; j++)
				pr("FROM: " + a[j].toString());
		}

		// REPLY TO
		if ((a = m.getReplyTo()) != null) {
			for (int j = 0; j < a.length; j++)
				pr("REPLY TO: " + a[j].toString());
		}

		// TO
		if ((a = m.getRecipients(Message.RecipientType.TO)) != null) {
			for (int j = 0; j < a.length; j++) {
				pr("TO: " + a[j].toString());
				InternetAddress ia = (InternetAddress) a[j];
				if (ia.isGroup()) {
					InternetAddress[] aa = ia.getGroup(false);
					for (int k = 0; k < aa.length; k++)
						pr("  GROUP: " + aa[k].toString());
				}
			}
		}

		// SUBJECT
		pr("SUBJECT: " + m.getSubject());

		// DATE
		Date d = m.getSentDate();
		pr("SendDate: " + (d != null ? d.toString() : "UNKNOWN"));

		// FLAGS
		Flags flags = m.getFlags();
		StringBuffer sb = new StringBuffer();
		Flags.Flag[] sf = flags.getSystemFlags(); // get the system flags

		boolean first = true;
		for (int i = 0; i < sf.length; i++) {
			String s;
			Flags.Flag f = sf[i];
			if (f == Flags.Flag.ANSWERED)
				s = "\\Answered";
			else if (f == Flags.Flag.DELETED)
				s = "\\Deleted";
			else if (f == Flags.Flag.DRAFT)
				s = "\\Draft";
			else if (f == Flags.Flag.FLAGGED)
				s = "\\Flagged";
			else if (f == Flags.Flag.RECENT)
				s = "\\Recent";
			else if (f == Flags.Flag.SEEN)
				s = "\\Seen";
			else
				continue; // skip it
			if (first)
				first = false;
			else
				sb.append(' ');
			sb.append(s);
		}

		String[] uf = flags.getUserFlags(); // get the user flag strings
		for (int i = 0; i < uf.length; i++) {
			if (first)
				first = false;
			else
				sb.append(' ');
			sb.append(uf[i]);
		}
		pr("FLAGS: " + sb.toString());

		// X-MAILER
		String[] hdrs = m.getHeader("X-Mailer");
		if (hdrs != null)
			pr("X-Mailer: " + hdrs[0]);
		else
			pr("X-Mailer NOT available");
	}

	static String indentStr = "                                               ";
	static int level = 0;

	/**
	 * Print a, possibly indented, string.
	 */
	public static void pr(String s) {
		if (showStructure)
			System.out.print(indentStr.substring(0, level * 2));
		System.out.println(s);
	}
}

https://java.net/projects/javamail/pages/Home#Samples

/*
 * Copyright (c) 1996-2010 Oracle and/or its affiliates. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *   - Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 *
 *   - Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in the
 *     documentation and/or other materials provided with the distribution.
 *
 *   - Neither the name of Oracle nor the names of its
 *     contributors may be used to endorse or promote products derived
 *     from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

import java.util.Properties;
import javax.mail.*;

import com.sun.mail.imap.*;

/**
 * Demo app that exercises the Message interfaces. List information about
 * folders.
 * 
 * @author John Mani
 * @author Bill Shannon
 */

public class folderlist {
	static String protocol = null;
	static String host = null;
	static String user = null;
	static String password = null;
	static String url = null;
	static String root = null;
	static String pattern = "%";
	static boolean recursive = false;
	static boolean verbose = false;
	static boolean debug = false;

	public static void main(String argv[]) throws Exception {
		int optind;
		
		if(argv.length<2)
		{
			
			//argv = "-T imaps -H imap.gmail.com -U xxx@gmail.com -P xxx ".split(" ");
			 //argv="-r -T pop3s -H pop.gmail.com -U xxx@gmail.com -P xxx".split(" ");
			 //argv="-T pop3s -H pop.mail.yahoo.com -U xxx@yahoo.com -P xxx".split(" ");
			 argv="-T imaps -H imap.mail.yahoo.com -U xxx@yahoo.com -P xxx".split(" ");
			
		}
		
		for (optind = 0; optind < argv.length; optind++) {
			if (argv[optind].equals("-T")) {
				protocol = argv[++optind];
			} else if (argv[optind].equals("-H")) {
				host = argv[++optind];
			} else if (argv[optind].equals("-U")) {
				user = argv[++optind];
			} else if (argv[optind].equals("-P")) {
				password = argv[++optind];
			} else if (argv[optind].equals("-L")) {
				url = argv[++optind];
			} else if (argv[optind].equals("-R")) {
				root = argv[++optind];
			} else if (argv[optind].equals("-r")) {
				recursive = true;
			} else if (argv[optind].equals("-v")) {
				verbose = true;
			} else if (argv[optind].equals("-D")) {
				debug = true;
			} else if (argv[optind].equals("--")) {
				optind++;
				break;
			} else if (argv[optind].startsWith("-")) {
				System.out
						.println("Usage: folderlist [-T protocol] [-H host] [-U user] [-P password] [-L url]");
				System.out.println("\t[-R root] [-r] [-v] [-D] [pattern]");
				System.exit(1);
			} else {
				break;
			}
		}
		if (optind < argv.length)
			pattern = argv[optind];

		// Get a Properties object
		Properties props = System.getProperties();

		// Get a Session object
		Session session = Session.getInstance(props, null);
		session.setDebug(debug);

		// Get a Store object
		Store store = null;
		Folder rf = null;
		if (url != null) {
			URLName urln = new URLName(url);
			store = session.getStore(urln);
			store.connect();
		} else {
			if (protocol != null)
				store = session.getStore(protocol);
			else
				store = session.getStore();

			// Connect
			if (host != null || user != null || password != null)
				store.connect(host, user, password);
			else
				store.connect();
		}

		// List namespace
		if (root != null)
			rf = store.getFolder(root);
		else
			rf = store.getDefaultFolder();

		dumpFolder(rf, false, "");
		if ((rf.getType() & Folder.HOLDS_FOLDERS) != 0) {
			Folder[] f = rf.list(pattern);
			for (int i = 0; i < f.length; i++)
				dumpFolder(f[i], recursive, "    ");
		}

		store.close();
	}

	static void dumpFolder(Folder folder, boolean recurse, String tab)
			throws Exception {
		System.out.println(tab + "Name:      " + folder.getName());
		System.out.println(tab + "Full Name: " + folder.getFullName());
		System.out.println(tab + "URL:       " + folder.getURLName());

		if (verbose) {
			if (!folder.isSubscribed())
				System.out.println(tab + "Not Subscribed");

			if ((folder.getType() & Folder.HOLDS_MESSAGES) != 0) {
				if (folder.hasNewMessages())
					System.out.println(tab + "Has New Messages");
				System.out.println(tab + "Total Messages:  "
						+ folder.getMessageCount());
				System.out.println(tab + "New Messages:    "
						+ folder.getNewMessageCount());
				System.out.println(tab + "Unread Messages: "
						+ folder.getUnreadMessageCount());
			}
			if ((folder.getType() & Folder.HOLDS_FOLDERS) != 0)
				System.out.println(tab + "Is Directory");

			/*
			 * Demonstrate use of IMAP folder attributes returned by the IMAP
			 * LIST response.
			 */
			if (folder instanceof IMAPFolder) {
				IMAPFolder f = (IMAPFolder) folder;
				String[] attrs = f.getAttributes();
				if (attrs != null && attrs.length > 0) {
					System.out.println(tab + "IMAP Attributes:");
					for (int i = 0; i < attrs.length; i++)
						System.out.println(tab + "    " + attrs[i]);
				}
			}
		}

		System.out.println();

		if ((folder.getType() & Folder.HOLDS_FOLDERS) != 0) {
			if (recurse) {
				Folder[] f = folder.list();
				for (int i = 0; i < f.length; i++)
					dumpFolder(f[i], recurse, tab + "    ");
			}
		}
	}
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
JavaMailJava平台上用于发送和接收电子邮件的API。要获取邮件的ID,可以使用JavaMail提供的IMAP协议。 以下是使用JavaMail获取邮件ID的步骤: 1. 创建一个Session对象,用于与邮件服务器进行通信。可以使用Session.getDefaultInstance()方法来获取默认的会话实例。 2. 创建一个Store对象,用于连接到邮件服务器。可以使用Session.getStore()方法来获取Store对象,并指定协议(如IMAP)和邮件服务器的主机名和端口号。 3. 连接到邮件服务器。可以使用Store.connect()方法来连接到邮件服务器,并提供用户名和密码进行身份验证。 4. 打开邮件文件夹。可以使用Store.getFolder()方法来获取邮件文件夹对象,并指定文件夹的名称(如"Inbox")。 5. 打开邮件文件夹。可以使用Folder.open()方法来打开邮件文件夹。 6. 获取邮件列表。可以使用Folder.getMessages()方法来获取邮件列表,返回一个Message数组。 7. 遍历邮件列表,获取每封邮件的ID。可以使用Message.getMessageNumber()方法来获取邮件的序号,使用Message.getHeader()方法来获取邮件的头信息,其中包含了邮件的ID。 8. 关闭邮件文件夹和连接。可以使用Folder.close()方法来关闭邮件文件夹,使用Store.close()方法来关闭连接。 下面是一个简单的示例代码: ```java import javax.mail.*; import javax.mail.internet.*; import java.util.Properties; public class MailIDExample { public static void main(String[] args) { String host = "your-mail-server"; String username = "your-username"; String password = "your-password"; Properties props = new Properties(); props.setProperty("mail.store.protocol", "imaps"); try { Session session = Session.getDefaultInstance(props, null); Store store = session.getStore(); store.connect(host, username, password); Folder folder = store.getFolder("INBOX"); folder.open(Folder.READ_ONLY); Message[] messages = folder.getMessages(); for (int i = 0; i < messages.length; i++) { Message message = messages[i]; int messageNumber = message.getMessageNumber(); String messageId = message.getHeader("Message-ID")[0]; System.out.println("Message " + messageNumber + " ID: " + messageId); } folder.close(false); store.close(); } catch (Exception e) { e.printStackTrace(); } } } ``` 请注意,上述示例代码中的"your-mail-server"、"your-username"和"your-password"需要替换为实际的邮件服务器、用户名和密码。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值