使用javaEmail发送邮件

发布于:2023-01-24 ⋅ 阅读:(16) ⋅ 点赞:(0) ⋅ 评论:(0)

1.android studio版本

最近从官网下载的最近版本android studio,和官网文档中提示的配置文档有点差别,记录一下,以后会用到

2.jar下载

从网上找的javaEmail所需的jar包,同时还需要其他关联两个jar包,但需要翻墙下载,需要可从百度网盘下载

3.功能开发

具体开发过程可以自行百度相关代码,这里不是重点,主要是记录jar包

4.邮箱开启登录权限

值得注意的是,需要开启对应邮箱的POP3/SMTP/IMAP服务,qq以及163邮箱都有对应的教程

5.账号信息设置核心代码

//关键导入
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Address;
import javax.mail.Message;
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;

public class EmailSender{
	private static final TAG = "EmailSender";

	// 发送邮件
	public static void SendEmail(String subject, String content, String[] files)
	{
		// 邮件换成真实的邮箱地址即可
		SendEmail(new String[]{"1234@qq.com", "2345@163.com"}, new String[]{"3456@qq.com", "4567@163.com"}, subject, content, files)
	}
	
	// 发送邮件,通过线程进行发送
	public static void SendEmail(String[] to, String[] copyto, String subject, String content, String[] files)
	{
		new Thread(){
			public void run(){
				SendEmailByJavaEmail(to,copyto,subject,content,files);
			}
		}.start();
	}
	
	/**
	 * 发送邮件
	 * 
	 * 邮件接收地址,可多个
	 * 抄送地址,可多个
	 * 主题/标题
	 * 附件,可多个
	*/
	private static void SendEmailByJavaEmail(String[] to, String[] copyto, String subject, String content, String[] files)
	{
		if(to == null || to.length == 0)
		{
			Log.e(TAG,"SendEmailByJavaEmail: 发送地址为null");
			return;
		}
		for(String url : to){
			if(!checkEmailURL(url)){
				Log.e(TAG,"SendEmailByJavaEmail: 发送地址格式错误! \nUrl:" + url);
				return;
			}
		}

		if(copyto != null && copyto.length > 0)
		{
			for(String url : copyto){
				if(!checkEmailURL(url)){
					Log.e(TAG,"SendEmailByJavaEmail: 抄送地址格式错误! \nUrl:" + url);
					return;
				}
			}
		}
		
		Properties prop = new Properties();
        // 发送邮件的服务器的IP
        prop.put("mail.smtp.host", "smtp.163.com");
        // 发送邮件的服务器的端口
        prop.put("mail.smtp.port", "25");
        // 发送邮件的服务器的协议
        prop.put("mail.transport.protocol", "smtp");
        // 发送邮件的服务器的协议
        prop.put("mail.smtp.auth", "true");
		
		// 根据邮件会话属性和密码验证器构造一个发送邮件的session
		Session sendMailSession  = Session.getInstance(prop);
        // 开启Session的debug模式, 这样就可以查看到程序发送Email的运行状态
        sendMailSession.setDebug(true);
        
		MimeMultipart multipart = new MimeMultipart();
		try{
			// 通过session得到transport对象,以便连接邮箱并发送
			Transport transport = sendMailSession.getTransport();
            // 使用邮箱的用户名和密码连上邮件服务器
            // yourself@163.com: 可以使用邮箱,如果连接失败的话换成与邮箱绑定的手机号码
            // code: 开启POP3/SMTP/IMAP服务时自动生成的验证码(也可以使用密码试试,建议不要使用密码,不安全)
            transport.connect("smtp.163.com", "yourself@163.com", "code");
			
			// 根据session创建一条邮件信息
			Message mailMessage = new MimeMessage(sendMailSession);
			// 创建邮件发送者地址
			// yourself@163.com: 163邮箱默认有俩个邮箱地址,一个是:数字 + @163.com,另一个是:m+数字+_1@163.com,两个都试试
            Address fromAddress = new InternetAddress("yourself@163.com");
            // 设置邮件消息的发送者
            mailMessage.setFrom(fromAddress);

			// 设置邮件接收地址
            Address[] toList = new Address[to.length];
            for (int i = 0; i < to.length; i++) {
                toList[i] = new InternetAddress(to[i]);
            }
            mailMessage.setRecipients(Message.RecipientType.TO,toList);
            
            // 抄送地址设置
            if(copyto != null && copyto.length > 0){
                Address[] copytoList = new Address[copyto.length];
                for (int i = 0; i < copyto.length; i++) {
                    copytoList[i] = new InternetAddress(copyto[i]);
                }
                mailMessage.setRecipients(Message.RecipientType.CC,copytoList);
            }
			
			// 设置主题/标题
			mailMessage.setSubject(subject);
            // 设置邮件内容
            MimeBodyPart bodyPart = new MimeBodyPart();
            bodyPart.setContent(content, "text/html;charset=gbk");
            multipart.addBodyPart(bodyPart);

			// 附件设置, 需要获取到存储的相对路径,未测试
			if(files != null && files.length > 0){
                for(String file : files){
                    bodyPart = new MimeBodyPart();
                    DataHandler dh = new DataHandler(new FileDataSource(Environment.getExternalStorageDirectory().getPath() + "/" + file));
                    bodyPart.setDataHandler(dh);
                    bodyPart.setFileName((new Date()).toString());
                    multipart.addBodyPart(bodyPart);
                }
                multipart.setSubType("mixed");
            }
            mailMessage.setContent(multipart);
            mailMessage.saveChanges();

//            // add handlers for main MIME types
//            MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap();
//            mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html");
//            mc.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml");
//            mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain");
//            mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed");
//            mc.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822");
//            CommandMap.setDefaultCommandMap(mc);

			// 发送邮件
            transport.sendMessage(mailMessage, mailMessage.getAllRecipients());
            // 关闭连接
            transport.close();
		}
		catch (Exception e) {
            e.printStackTrace();
        }
	}
	
	// 检查邮件地址是否合法
	public static boolean checkEmailURL(String url)
	{
		String contact = url.trim();
        if(contact == "")
            return false;
        String matchStr = "\\b^['_a-z0-9-\\+]"
                + "+(\\.['_a-z0-9-\\+]+)*@[a-z0-9-]+"
                + "(\\.[a-z0-9-]+)*\\.([a-z]{2}|aero|arpa|asia"
                + "|biz|com|coop|edu|gov|info|int|jobs|mil|mobi|museum|"
                + "name|nato|net|org|pro|tel|travel|xxx)$\\b";
        return  contact.matches(matchStr);
	}
} 

AndroidManifest添加权限

<!-- 网络访问 -->
<uses-permission android:name="android.permission.INTERNET" />

后记

  1. 需要注意的是, transport.connect这个方法账号和密码的设置
  2. 第二参数为自己邮箱账号,163邮箱使用手机号注册的,邮箱地址为: 手机号@qq.com,但日志提示不是绑定的账号连接不上,各种调整都连不上,后来改用用注册手机号,居然连接成功了
  3. 三个参数为验证码,需要开启POP3/SMTP/IMAP服务,可以百度如何开启
  4. 发送地址也有点绕, 163邮箱的默认有两个邮箱,主邮箱为: m手机号_1@163.com,另一个邮箱: 手机号@qq.com,不知道那个是主邮箱,可以测试一下就知道,至于qq可能就没这么麻烦吧
  5. 结束

网站公告

欢迎关注微信公众号

今日签到

点亮在社区的每一天
签到