`

javamail简单使用

    博客分类:
  • JAVA
阅读更多

MailInfo类:

//发送邮件的信息类
public class MailInfo {
	private String personal;// 姓名
	private String subject;// 主题
	private Date sentDate = new Date();// 发送时间
	private List<String> toList = new ArrayList<String>();// 主送人集合
	private List<String> ccList = new ArrayList<String>();// 抄送人集合
	private List<String> bccList = new ArrayList<String>();// 密送人集合
	private List<String> fileList = new ArrayList<String>();// 附件集合
	private List<HtmlImage> imgList = new ArrayList<HtmlImage>();// 发送html所要用到的img图片集合
}

 

MailClient类:

package org.forever.javamail;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.Address;
import javax.mail.BodyPart;
import javax.mail.Flags;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.Transport;
import javax.mail.URLName;
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;
import javax.mail.util.ByteArrayDataSource;

public class MailClient {

	private static final String CONTENT_ID = "Content-ID";
	private static final String TEXT_PLAIN = "text/plain";
	private static final String APPLICATION_OCTET_STREAM = "application/octet-stream";
	private static final String DEBUG = "debug";
	private static final String FALSE = "false";
	private static final String TRUE = "true";
	private static final String POINT = ".";
	private static final String INBOX = "INBOX";
	private static final String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
	private static final String POP3 = "pop3";
	private static final String MAIL = "mail";
	private static final String SMTP = "smtp";
	private static final String AUTH = "auth";
	private static final String HOST = "host";

	private int pop3Port = 110;
	private String pop3Host;
	private String from;// 发件人邮件地址
	private String userName;// 用户名
	private String password;// 密码
	private Session session;// 会话接口
	private String savePath = "C:\\temp\\";// 附件保持路径
	public static final int TEXT = 1;// 文本内容
	public static final int HTML = 2;// html内容

	private String smtpHost;// 域名

	public MailClient(String userName, String password, String smtpHost,
			String pop3Host) {
		this.smtpHost = smtpHost;
		this.userName = userName;
		this.password = password;
		this.pop3Host = pop3Host;
		from = userName + "@" + smtpHost;
		Properties props = System.getProperties();
		props.put(MAIL + POINT + SMTP + POINT + HOST, smtpHost);
		props.put(MAIL + POINT + SMTP + POINT + AUTH, TRUE);
		props.put(MAIL + POINT + DEBUG, FALSE);
		session = Session.getDefaultInstance(props, new EmailAuthenticator(
				userName, password));
	}

	// 发送消息
	public void sendMail(MailInfo mailInfo, int sendType) throws Exception {
		Message message = new MimeMessage(session);
		Address fromAddress = new InternetAddress(from, mailInfo.getPersonal());
		message.setSubject(mailInfo.getSubject());
		message.setSentDate(mailInfo.getSentDate());
		message.setFrom(fromAddress);
		Multipart multipart = new MimeMultipart();
		switch (sendType) {
		case TEXT:
			BodyPart textPart = new MimeBodyPart();
			textPart.setContent(mailInfo.getContent(),
					"text/plain;charset=utf-8");
			multipart.addBodyPart(textPart);
			break;
		case HTML:
			BodyPart htmlPart = new MimeBodyPart();
			htmlPart.setContent(mailInfo.getContent(),
					"text/html;charset=utf-8");
			multipart.addBodyPart(htmlPart);
			break;
		default:
			break;
		}
		for (String filePath : mailInfo.getFileList()) {
			File file = new File(filePath);
			if (!file.exists())continue;
			BodyPart attchPart = new MimeBodyPart();
			DataSource source = new FileDataSource(file);
			attchPart.setDataHandler(new DataHandler(source));
			attchPart.setFileName(MimeUtility.encodeText(file.getName()));
			multipart.addBodyPart(attchPart);
		}
		
		for (HtmlImage htmlImage : mailInfo.getImgList()) {
			String filePath = htmlImage.getFilePath();
			File file = new File(filePath);
			if (!file.exists())continue;
			BodyPart imgPart = new MimeBodyPart();
			imgPart.setDataHandler(new DataHandler(
					new ByteArrayDataSource(ImageUtil.imageToByteArray(filePath),APPLICATION_OCTET_STREAM)
					));
			imgPart.setFileName(MimeUtility.encodeText(file.getName()));
		    imgPart.setHeader(CONTENT_ID, "<"+htmlImage.getCid()+">");
			multipart.addBodyPart(imgPart);
		}
		
		message.setContent(multipart);

		for (String bcc : mailInfo.getBccList()) {
			message.setRecipient(Message.RecipientType.BCC,
					new InternetAddress(bcc));
			Transport.send(message);
		}
		System.out.println("send success.....");
	}

	public boolean isRead(Message message) throws Exception {
		boolean isRead = false;
		for (Flags.Flag flag : message.getFlags().getSystemFlags()) {
			if (flag == Flags.Flag.SEEN) {
				isRead = true;
				System.out.println("isRead=true......");
			}
		}
		return isRead;
	}

	// 获取消息
	public Message[] getMail() throws Exception {
		URLName urln = new URLName(POP3, pop3Host, pop3Port, null, userName,
				password);
		Store store = session.getStore(urln);
		store.connect();
		Folder folder = store.getFolder(INBOX);
		folder.open(Folder.READ_ONLY);
		Message message[] = folder.getMessages();
		return message;
	}

	// 清除所有邮件
	public void clearAllMail() throws Exception {
		URLName urln = new URLName(POP3, pop3Host, pop3Port, null, userName,
				password);
		Store store = session.getStore(urln);
		store.connect();
		Folder folder = store.getFolder(INBOX);
		folder.open(Folder.READ_WRITE);
		Message message[] = folder.getMessages();
		for (Message item : message) {
			System.out.println("MegID: " + item.getMessageNumber()
					+ "   Title: " + item.getSubject() + "Flags: "
					+ item.getFlags());
			item.setFlag(Flags.Flag.DELETED, true);
		}
		folder.close(true);
		store.close();
	}

	// 打印消息内容
	public void printMessage(Message[] message) throws MessagingException,
			Exception, IOException {

		SimpleDateFormat sdf = new SimpleDateFormat(YYYY_MM_DD_HH_MM_SS);
		for (Message msg : message) {
			InternetAddress address = (InternetAddress) msg.getFrom()[0];
			System.out.println("messageNumber:" + msg.getMessageNumber());
			System.out.println("personal:" + address.getPersonal());
			System.out.println("address:" + address.getAddress());
			System.out.println("sentDate:" + sdf.format(msg.getSentDate()));
			System.out.println("status:" + isRead(msg));
			System.out.println("subject:" + msg.getSubject());
			Object content = msg.getContent();
			if (content instanceof Multipart) {
				Multipart multipart = (Multipart) content;
				int count = multipart.getCount();
				for (int i = 0; i < count; i++) {
					BodyPart bodyPart = multipart.getBodyPart(i);
					Object bodyContent = bodyPart.getContent();
					String[] mimeType = bodyPart.getContentType().split(";");
					System.out.println("type:" + bodyPart.getContentType());
					if (APPLICATION_OCTET_STREAM.equals(mimeType[0])) {
						MimeBodyPart attchPart = (MimeBodyPart) bodyPart;
						String fileName = MimeUtility.decodeText(attchPart.getFileName());   
						System.out.println("fileName:" + fileName);
						InputStream in = attchPart.getInputStream();
						FileUtil.saveFile(in, savePath,fileName);
					} else if (TEXT_PLAIN.equals(mimeType[0])) {
						System.out.println("content:" + bodyContent);
					}
					System.out.println("--------------------------------");
				}
			} else {
				System.out.println(content);
			}
			System.out
					.println("*************************************************");
		}
	}

	public String getSavePath() {
		return savePath;
	}

	public void setSavePath(String savePath) {
		this.savePath = savePath;
	}

	public int getPop3Port() {
		return pop3Port;
	}

	public void setPop3Port(int pop3Port) {
		this.pop3Port = pop3Port;
	}

	public String getPop3Host() {
		return pop3Host;
	}

	public void setPop3Host(String pop3Host) {
		this.pop3Host = pop3Host;
	}

	public String getFrom() {
		return from;
	}

	public void setFrom(String from) {
		this.from = from;
	}

	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String getSmtpHost() {
		return smtpHost;
	}

	public void setSmtpHost(String smtpHost) {
		this.smtpHost = smtpHost;
	}

	
	
}

 

MailTest测试类:

package org.forever.javamail;

import java.io.BufferedReader;
import java.io.InputStreamReader;

import org.junit.Test;

public class MailTest {

	// 测试用户如下:chenjun,mqq,hds,yw

	// 测试局域网的发送情况
	@Test
	public void testSendEmail_localhost() {
		// 假设发送人chenjun,主送人:mqq,抄送人:hds,密送人:yw
		MailClient cjClient = new MailClient("chenjun", "cj", "localhost",
				"localhost");
		MailInfo cjMail = new MailInfo();
		cjMail.setPersonal("陈均");
		cjMail.setSubject("吃饭了");
		cjMail.setContent("晚上9点,准时开饭");

		cjMail.getToList().add("mqq@localhost");
		cjMail.getCcList().add("hds@localhost");
		cjMail.getBccList().add("yw@localhost");
		try {
			cjClient.sendMail(cjMail, MailClient.TEXT);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	// 测试局域网所发邮件的信息是否已经收到
	@Test
	public void testGetEmail_localhost() {
		MailClient mqqClient = new MailClient("mqq", "mqq", "localhost",
				"localhost");
		MailClient hdsClient = new MailClient("hds", "hds", "localhost",
				"localhost");
		MailClient ywClient = new MailClient("yw", "yw", "localhost",
				"localhost");
		try {
			mqqClient.printMessage(mqqClient.getMail());
			hdsClient.printMessage(hdsClient.getMail());
			ywClient.printMessage(ywClient.getMail());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	// 测试向abstractforever外网发送邮件
	@Test
	public void testSendEmail_abstractforever() {
		// 假设发送人chenjun,主送人:mqq,抄送人:hds,//密送人:yw
		MailClient cjClient = new MailClient("chenjun", "cj",
				"abstractforever.gicp.net", "abstractforever.gicp.net");
		MailInfo cjMail = new MailInfo();
		cjMail.setPersonal("陈均");
		cjMail.setSubject("吃饭了");
		cjMail.setContent("晚上9点,准时开饭");
		cjMail.getToList().add("mqq@abstractforever.gicp.net");
		cjMail.getCcList().add("hds@abstractforever.gicp.net");
		cjMail.getBccList().add("yw@abstractforever.gicp.net");

		try {
			cjClient.sendMail(cjMail, MailClient.TEXT);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	// 测试所发邮件的信息是否已经收到
	@Test
	public void testGetEmail_abstractforever() {
		MailClient mqqClient = new MailClient("mqq", "mqq",
				"abstractforever.gicp.net", "abstractforever.gicp.net");
		MailClient hdsClient = new MailClient("hds", "hds",
				"abstractforever.gicp.net", "abstractforever.gicp.net");
		MailClient ywClient = new MailClient("yw", "yw",
				"abstractforever.gicp.net", "abstractforever.gicp.net");
		MailClient cjClient = new MailClient("chenjun", "cj",
				"abstractforever.gicp.net", "abstractforever.gicp.net");
		try {
			mqqClient.printMessage(mqqClient.getMail());
			hdsClient.printMessage(hdsClient.getMail());
			ywClient.printMessage(ywClient.getMail());
			cjClient.printMessage(cjClient.getMail());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	// 测试清除邮件服务器的邮件
	@Test
	public void testClearAllEmail_abstractforever() {
		MailClient mqqClient = new MailClient("mqq", "mqq",
				"abstractforever.gicp.net", "abstractforever.gicp.net");
		MailClient hdsClient = new MailClient("hds", "hds",
				"abstractforever.gicp.net", "abstractforever.gicp.net");
		MailClient ywClient = new MailClient("yw", "yw",
				"abstractforever.gicp.net", "abstractforever.gicp.net");
		MailClient cjClient = new MailClient("chenjun", "cj",
				"abstractforever.gicp.net", "abstractforever.gicp.net");
		try {
			mqqClient.clearAllMail();
			hdsClient.clearAllMail();
			ywClient.clearAllMail();
			cjClient.clearAllMail();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	// 测试向163外网发送邮件
	@Test
	public void testSendEmail_163() {
		// 假设发送人chenjun,主送人:abstractforever,抄送人:abstractforever,密送人:abstractforever
		MailClient cjClient = new MailClient("chenjun", "cj",
				"abstractforever.gicp.net", "abstractforever.gicp.net");
		MailInfo cjMail = new MailInfo();
		cjMail.setPersonal("陈均");
		cjMail.setSubject("吃饭了");
		cjMail.setContent("晚上9点,准时开饭");
		cjMail.getToList().add("abstractforever@163.com");
		cjMail.getCcList().add("abstractforever@163.com");
		cjMail.getBccList().add("abstractforever@163.com");
		cjMail.getFileList().add("e:\\a.doc");
		cjMail.getFileList().add("e:\\中文附件.doc");
		try {
			cjClient.sendMail(cjMail, MailClient.TEXT);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	// 测试获取163邮件信息
	@Test
	public void testGetEmail_163() {
		MailClient afClient = new MailClient("abstractforever", "*****",
				"smtp.163.com", "pop3.163.com");
		try {
			afClient.printMessage(afClient.getMail());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	// 测试清除163邮件信息
	@Test
	public void testClearAllEmail_163() {
		MailClient cjClient = new MailClient("abstractforever", "*****",
				"smtp.163.com", "pop3.163.com");
		try {
			cjClient.clearAllMail();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	// 测试向qq外网发送邮件
	@Test
	public void testSendEmail_qq() {
		// 假设发送人chenjun,主送人:396481925,抄送人:396481925,密送人:396481925
		MailClient cjClient = new MailClient("chenjun", "cj",
				"abstractforever.gicp.net", "abstractforever.gicp.net");
		MailInfo cjMail = new MailInfo();
		cjMail.setPersonal("陈均");
		cjMail.setSubject("吃饭了");
		cjMail.setContent("晚上9点,准时开饭");
		cjMail.getToList().add("396481925@qq.com");
		cjMail.getCcList().add("396481925@qq.com");
		cjMail.getBccList().add("396481925@qq.com");
		try {
			cjClient.sendMail(cjMail, MailClient.TEXT);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	// 测试获取qq邮件信息
	@Test
	public void testGetEmail_qq() {
		MailClient qqClient = new MailClient("396481925", "*****",
				"smtp.qq.com", "pop.qq.com");
		try {
			qqClient.printMessage(qqClient.getMail());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	// 测试清除qq邮件信息
	@Test
	public void testClearAllEmail_qq() {
		MailClient cjClient = new MailClient("396481925", "*****",
				"smtp.qq.com", "pop.qq.com");
		try {
			cjClient.clearAllMail();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	// 测试向abstractforever外网发送邮件,带附件的
	@Test
	public void testSendEmailAtt_abstractforever() {
		// 假设发送人chenjun,主送人:mqq,抄送人:hds,//密送人:yw
		MailClient cjClient = new MailClient("chenjun", "cj",
				"abstractforever.gicp.net", "abstractforever.gicp.net");
		MailInfo cjMail = new MailInfo();
		cjMail.setPersonal("陈均");
		cjMail.setSubject("吃饭了");
		cjMail.setContent("晚上9点,准时开饭");
		cjMail.getToList().add("mqq@abstractforever.gicp.net");
		cjMail.getFileList().add("e:\\a.doc");
		cjMail.getFileList().add("e:\\中文附件.doc");
		try {
			cjClient.sendMail(cjMail, MailClient.TEXT);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	// 测试向abstractforever外网获取邮件,带附件的
	@Test
	public void testGetEmailAtt_abstractforever() {
		MailClient mqqClient = new MailClient("mqq", "mqq",
				"abstractforever.gicp.net", "abstractforever.gicp.net");
		try {
			mqqClient.printMessage(mqqClient.getMail());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	// 测试发送html内容,带图片
	@Test
	public void testSendEmailHtml_163() {
		// 假设发送人chenjun,主送人:abstractforever,抄送人:abstractforever,密送人:abstractforever
		MailClient cjClient = new MailClient("chenjun", "cj",
				"abstractforever.gicp.net", "abstractforever.gicp.net");
		MailInfo cjMail = new MailInfo();
		cjMail.setPersonal("陈均");
		cjMail.setSubject("吃饭了");

		StringBuffer html = new StringBuffer();
		String line = "";
		try {
			BufferedReader in = new BufferedReader(new InputStreamReader(
					MailTest.class.getClassLoader().getResourceAsStream(
							"table.html"), "UTF-8"));
			while ((line = in.readLine()) != null) {
				html.append(line);
			}
		} catch (Exception e1) {
			e1.printStackTrace();
		}
		System.out.println(html);
		cjMail.setContent(html.toString());
		cjMail.getImgList().add(new HtmlImage("img_1", "e:\\a.jpg"));
		cjMail.getToList().add("abstractforever@163.com");
		cjMail.getFileList().add("e:\\a.doc");
		cjMail.getFileList().add("e:\\中文附件.doc");
		try {
			cjClient.sendMail(cjMail, MailClient.HTML);
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

}

 

 

  • 大小: 10.6 KB
0
0
分享到:
评论
1 楼 命中注定1314 2012-07-25  
请问下, 删除邮件的时候真的可以吗 ,我也是像你那样也写的,也设置了 folder.open(Folder.READ_WRITE);
删除的时候总报异常
javax.mail.IllegalWriteException: POP3 messages are read-only
请问知道是怎么回事吗?  qq:576240289

相关推荐

    JavaMail简易教程

    ### JavaMail简易教程知识点详解 #### 一、JavaMail API简介 JavaMail API是一个用于读取、编写和发送电子邮件的标准扩展包。通过这个API,开发者能够构建类似Eudora、Pine或Microsoft Outlook这样的邮件用户代理...

    javamail使用的jar包

    通过这些步骤,就可以利用 JavaMail 实现强大的邮件功能,无论是发送简单的文本邮件,还是构建复杂的多附件、HTML 内容的邮件,都能轻松应对。同时,JavaMail 也提供了对不同邮件服务器和协议的良好兼容性,使其成为...

    邮箱验证--javamail的简单使用

    本篇文章将详细探讨JavaMail的简单使用,包括如何设置、配置以及实际发送邮件。 一、JavaMail的环境配置 在使用JavaMail之前,首先需要将其添加到项目的类路径中。这通常通过Maven或Gradle的依赖管理来实现。如果...

    javamail使用demo示例

    这个"javamail使用demo示例"是JavaMail官方提供的一个实例集合,旨在帮助开发者更好地理解和应用JavaMail库。下面我们将深入探讨JavaMail的核心概念、主要功能以及如何使用这些示例代码。 一、JavaMail核心概念 1....

    JavaMail组件简单应用

    本文将深入探讨JavaMail的核心概念、主要组件以及如何在实际项目中进行简单应用。 1. **JavaMail API概述** JavaMail API是Java平台上的一个开源库,由JavaMail项目维护,用于处理邮件服务。它包括了SMTP(Simple ...

    JavaMail邮件发送源码 非常简单

    JavaMail是一种在Java应用程序中发送和接收电子邮件的标准API,它为开发者提供了强大的功能,使得处理邮件变得简单而高效。在JavaMail中,我们主要利用 javax.mail 和 javax.mail.internet 这两个包中的类来实现邮件...

    linux服务器报警—使用javamail

    "Linux服务器报警—使用javamail"这个主题就涉及到了如何利用JavaMail API在Linux环境中实现自动发送邮件报警的功能。JavaMail是一个开源库,它允许开发者在Java应用中添加电子邮件功能,包括发送和接收邮件。 首先...

    javamail的jar包:javamail-1.6

    2. **SMTP协议**:JavaMail 使用简单邮件传输协议(SMTP)来发送邮件。通过SMTP服务器,程序能够将邮件路由到正确的收件人。 3. **POP3和IMAP协议**:对于邮件接收,JavaMail 提供了对邮局协议第三版(POP3)和...

    JavaMail-1.5 API

    根据提供的文件描述部分,JavaMail API不仅仅能够执行一些简单的邮件传输任务,它还能被用来构建功能丰富的邮件客户端应用,类似于Microsoft Outlook。这意味着,JavaMail API可以用来实现从创建邮件、添加附件、...

    javamail例子——简单好用

    javamail例子——简单好用 可以直接发电子邮件 1.当工程是java EE 5的时候 在工程里面应该删除java EE 5里面相对应的 jar 路径在 第一个问题就是删除Java EE 5 Libraries/javaee.jar/mail。 第二个问题就是删除Java...

    javaMail简易封装实例

    简易封装的javaMail 支持同时发送信息与附件,发件人,发件时间,主题,内容,附件等等 内涵详细的说明与测试使用方法

    javaMail的使用

    在提供的压缩包文件中,可能包含了一个简单的JavaMail使用示例。通过分析和学习这个例子,你可以更好地理解如何在实际项目中集成和使用JavaMail发送邮件。记得检查代码中的异常处理和错误日志,这对于调试和解决问题...

    Javamail所使用的jar包

    在JavaMail中,开发者可以利用SMTP(简单邮件传输协议)、POP3(邮局协议)和IMAP(因特网消息访问协议)等标准来与邮件服务器进行交互。为了使用JavaMail的功能,你需要在项目中包含相应的jar包。这些jar包通常包含...

    javaMail API 跟 javaMail.jar包

    JavaMail API是Java平台上用于处理电子邮件的一套标准API,它为...总之,JavaMail API和`javaMail.jar`是Java开发者处理电子邮件不可或缺的工具,它们提供了强大的功能,使得在程序中发送和接收邮件变得简单易行。

    JavaMail相关jar包

    以下是一个简单的示例,展示了如何使用JavaMail发送邮件: ```java Properties props = new Properties(); props.put("mail.smtp.auth", "true"); props.put("mail.smtp.starttls.enable", "true"); props.put(...

    javamail 所有jar包

    在使用JavaMail API时,开发者需要先创建一个`Session`实例,配置好邮件服务器的相关参数,然后可以创建`Message`对象,填充邮件内容,最后通过`Transport`发送邮件。对于接收邮件,JavaMail也提供了相应的API,可以...

    JavaMail 1.6.0 Final Release

    在“javax.mail.jar”这个压缩包文件中,包含了 JavaMail API 的所有核心类和接口,开发者可以直接导入这个 JAR 文件到他们的项目中,以使用 JavaMail 提供的各种邮件服务功能。例如,`...

    简单javamail的实现(HelloWorld)

    这个“简单javamail的实现(HelloWorld)”的教程将引导我们通过创建一个基础的JavaMail应用,这通常被称为“HelloWorld”示例,因为它标志着我们对JavaMail API的初步理解和使用。 JavaMail API 提供了广泛的类和...

    JavaMail_简易教程

    ### JavaMail简易教程知识点概述 #### 一、JavaMail API简介 JavaMail API是一个用于读取、编写和发送电子邮件的标准扩展包。它主要用于创建邮件用户代理(MUA)类型的程序,例如Eudora、Pine及Microsoft Outlook等。...

Global site tag (gtag.js) - Google Analytics