public void sendMail(String subject, String from, List<String> to, List<String> cc, List<String> bcc, String bodyText, List<File> files, boolean draft) { Message message = new MimeMessage(session); try { // 设置发件人地址 message.setFrom(new InternetAddress(from)); // 设置主题 message.setSubject(subject); // 设置收件人 if(to!=null){ for (String item : to) { message.addRecipient(Message.RecipientType.TO, new InternetAddress(item)); } } // 设置抄送人 if(cc!=null){ for (String item : cc) { message.addRecipient(Message.RecipientType.CC, new InternetAddress(item)); } } // 设置密送人 if(bcc!=null){ for (String item : bcc) { message.addRecipient(Message.RecipientType.BCC, new InternetAddress(item)); } } if(draft){ message.setFlag(Flags.Flag.DRAFT, true); } // 设置邮件内容 Multipart multipart = new MimeMultipart(); MimeBodyPart txtPart = new MimeBodyPart(); txtPart.setContent(bodyText, "text/html;charset=utf-8"); multipart.addBodyPart(txtPart); // 添加附件 if (files != null && files.size() > 0) { for (File f : files) { MimeBodyPart part = new MimeBodyPart(); FileDataSource fds = new FileDataSource(f); // 得到数据源 part.setDataHandler(new DataHandler(fds)); // 得到附件本身并至入BodyPart String filename=encodeFileName(fds.getName()); part.setFileName(filename); // 得到文件名同样至入BodyPart multipart.addBodyPart(part); } } message.setContent(multipart); message.setFlag(Flags.Flag.RECENT, true); message.saveChanges(); if(!draft){ Transport transport = session.getTransport("smtp"); transport.connect(host, userName, passWord); transport.sendMessage(message, message.getAllRecipients()); transport.close(); } } catch (AddressException e) { e.printStackTrace(); } catch (MessagingException e) { e.printStackTrace(); } } 代码如上,邮件能发给接收人,但是无法存入本人的已发送目录。 |
|
#1 |
你可以给draft设三个标示 一个是发送 一个是保存 一个是发送并保存 根据选择的按钮进行判断所走的方法 就可以了
|
#2 |
回复1楼: 问题是我无论怎么设flag,信发出去了,在我本地的已发送里就是没有,能不能详细说说 |
#3 |
|
#4 |
回复2楼: 这个要看你数据库的表设计了 有没有这个字段或者是你们数据库设计师分表的 |
#5 |
比如你点击的是发送并保存 你就要走发送和保存这两个方法 不是一直走发送哪一个方法 你需要进行判断 然后看应该调用哪个方法 触发的函数不同 所谓标示 只是区分方便而已 具体要看你数据库怎么设计的 然后根据标示存进去就行
|
#6 |
自己搭建的邮件服务器?
如果使用pop3 SMTP的别人的邮件服务器,都会有记录的 |
#7 |
回复4楼: 兄弟,邮件是走服务器协议,根本没数据库的 |
#8 |
回复6楼: 用的magic winmail邮件服务器,它自带的web程序发完就有历史记录,我用SMTP发完就出去了且成功了,但本地没有已发送记录 |
#9 |
回复7楼: 那 历史记录可以取到吗? |
40分
#10 |
邮件协议里没有“保存已发送”这个东西吧。
这个已发送这个功能明显是客户端的功能,协议里只是规范服务器怎么转发。你既然是直接走协议不走客户端,没有进已发送应该很正常吧 |
#11 |
回复10楼: 如果我要人工存进去要怎么做呢? Folder,Message包括子类都看遍了 |
100分
#13 |
回复11楼: 我对邮件协议只有个大概的映像了,我大概分析一下: 2. 邮件协议里有保存已发送这个规范,这个你得去看下协议了,我映像里好像是没有的。如果有,那应该是你要在报文里设置某个标识给服务器看,这里又有区别: 综上,你还是先把协议研究清楚了再说吧。 |
50分
#14 |
应该是没有这个方法的,发邮件的时候,点击发送时候客户端自动调用方法,把你发送的邮件显示到发件箱里,读取的应该是邮件自己的数据库,你怎么通过自己的程序存到它的库呢?如果这样的话你只有自己写一个客户端了
|
#15 |
学习一下~~~
|
#17 |
你在代码最顶端加一个身份验证试试,也就是先验证身份再发送,
//判断是否需要身份验证 MyAuthenticator authenticator=null; Properties pro = mailInfo.getProperties(); if (mailInfo.isValidate()) { //如果需要身份认证,则创建一个密码验证器 authenticator = new MyAuthenticator(“邮箱名”, “邮箱密码”); } //根据邮件会话属性和密码验证构造一个发送邮件的Session Session sendMailSession = Session.getDefaultInstance(pro,authenticator); |
10分
#18 |
/**
* 身份认证 * @author Administrator * */ public class MyAuthenticator extends Authenticator { String userName = null; String password = null; public MyAuthenticator() { public MyAuthenticator(String username, String password) { protected PasswordAuthentication getPasswordAuthentication() { |
#19 |
问题解决了
解决方式也很奇葩,在服务端有个设置,勾上之后发送时就能自动保存了 不选那个勾怎么都解决不了 应该是邮箱服务设置的问题 |