JavaMail 1.5.0漏洞还是gmail奇怪的问题?
我正在尝试使用包装javax.mail(JavaMail 1.5.0)的类发送电子邮件。 它使用smtp.gmail.com发送邮件,虽然有效,但效果太好了,因为当我向多个收件人发送邮件时,每封邮件都会被发送(到+CC)次,所以如果我向3个收件人发送邮件,我总共会收到9封邮件(每封邮件重复3次) 这不好。。。设置会话调试将显示电子邮件已正确发送1次,收件人正确。我在jre6u45上 有什么问题?有人有什么暗示吗?我是否犯了一个我看不见的愚蠢错误 这是我的密码:JavaMail 1.5.0漏洞还是gmail奇怪的问题?,java,email,Java,Email,我正在尝试使用包装javax.mail(JavaMail 1.5.0)的类发送电子邮件。 它使用smtp.gmail.com发送邮件,虽然有效,但效果太好了,因为当我向多个收件人发送邮件时,每封邮件都会被发送(到+CC)次,所以如果我向3个收件人发送邮件,我总共会收到9封邮件(每封邮件重复3次) 这不好。。。设置会话调试将显示电子邮件已正确发送1次,收件人正确。我在jre6u45上 有什么问题?有人有什么暗示吗?我是否犯了一个我看不见的愚蠢错误 这是我的密码: import java.io.Fi
import java.io.File;
import java.io.IOException;
import java.util.Calendar;
import java.util.Properties;
import javax.mail.Address;
import javax.mail.Message.RecipientType;
import javax.mail.MessagingException;
import javax.mail.Multipart;
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 Mailer
{
public static boolean sendMail(
final String username,
final String password,
final String from,
final String _tos,
final String _ccs,
final String _bccs,
final String subject,
final String text,
final File[] attachments)
{
Properties p = null;
Session s = null;
boolean debug = true;
boolean res = false;
boolean isSecured = false;
boolean isSupported = true;
String host = null;
final String charset = "UTF-8";
String fromProvider = from.split("@")[1];
if(fromProvider.compareTo("gmail.com") == 0)
{
isSecured = true;
host = "smtp.gmail.com";
p = System.getProperties();
p.put("mail.smtp.host", host);
p.put("mail.smtps.auth", "true");
p.put("mail.smtp.port", "465");
p.put("mail.smtp.starttls.enable", "true");
p.put("mail.smtp.socketFactory.port", "465");
p.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
s = Session.getInstance(p, null);
}
else {isSupported = false;}
if(isSupported)
{
s.setDebug(debug);
try
{
// init
MimeMessage email = new MimeMessage(s);
Multipart mp = new MimeMultipart();
InternetAddress[] tos = {};
InternetAddress[] ccs = {};
InternetAddress[] bccs = {};
// common
if(_tos != null) {tos = InternetAddress.parse(_tos);}
if(_ccs != null) {ccs = InternetAddress.parse(_ccs);}
if(_bccs != null) {bccs = InternetAddress.parse(_bccs);}
email.addRecipients(RecipientType.TO, tos);
email.addRecipients(RecipientType.CC, ccs);
email.addRecipients(RecipientType.BCC, bccs);
email.setSubject (subject, charset);
email.setSentDate (Calendar.getInstance().getTime());
// text part
MimeBodyPart mbpText = new MimeBodyPart();
mbpText.setText(text, charset, "html");
mp.addBodyPart(mbpText);
// attachments
if(attachments != null && attachments.length > 0)
{
for(int i=0; i<attachments.length; i++)
{
MimeBodyPart mbpAttachment = new MimeBodyPart();
mbpAttachment.attachFile(attachments[i]);
mp.addBodyPart(mbpAttachment);
}
}
// build elements
email.setContent(mp);
email.saveChanges();
Address[] addresses = email.getAllRecipients();
// send
Transport.send(email, addresses, username, password);
res = true;
}
catch(MessagingException ex) {ex.printStackTrace();}
catch(IOException ex) {ex.printStackTrace();}
}
return res;
}
}
导入java.io.File;
导入java.io.IOException;
导入java.util.Calendar;
导入java.util.Properties;
导入javax.mail.Address;
导入javax.mail.Message.RecipientType;
导入javax.mail.MessaginException;
导入javax.mail.Multipart;
导入javax.mail.Session;
导入javax.mail.Transport;
导入javax.mail.internet.InternetAddress;
导入javax.mail.internet.MimeBodyPart;
导入javax.mail.internet.mimessage;
导入javax.mail.internet.MimeMultipart;
公共类邮递员
{
公共静态布尔发送邮件(
最终字符串用户名,
最终字符串密码,
最后一个字符串来自,
最终字符串_tos,
最终字符串ccs,
最终字符串_bccs,
最后一个字符串主题,
最终字符串文本,
最终文件[]附件)
{
属性p=null;
会话s=null;
布尔调试=真;
布尔res=false;
布尔值isSecured=false;
布尔值isSupported=true;
字符串host=null;
最终字符串charset=“UTF-8”;
字符串fromProvider=from.split(“@”)[1];
if(fromProvider.compareTo(“gmail.com”)==0)
{
isSecured=true;
host=“smtp.gmail.com”;
p=System.getProperties();
p、 put(“mail.smtp.host”,主机);
p、 put(“mail.smtps.auth”、“true”);
p、 put(“mail.smtp.port”、“465”);
p、 put(“mail.smtp.starttls.enable”,“true”);
p、 put(“mail.smtp.socketFactory.port”,“465”);
p、 put(“mail.smtp.socketFactory.class”、“javax.net.ssl.SSLSocketFactory”);
s=Session.getInstance(p,null);
}
else{isSupported=false;}
如果(支持发布)
{
s、 setDebug(调试);
尝试
{
//初始化
MimeMessage email=新的MimeMessage;
Multipart mp=新的MimeMultipart();
InternetAddress[]tos={};
互联网地址[]ccs={};
InternetAddress[]bccs={};
//普通的
如果(_-tos!=null){tos=InternetAddress.parse(_-tos);}
如果(_ccs!=null){ccs=InternetAddress.parse(_ccs);}
如果(_bccs!=null){bccs=InternetAddress.parse(_bccs);}
email.addRecipients(RecipientType.TO,tos);
email.addRecipients(RecipientType.CC,ccs);
email.addRecipients(RecipientType.BCC,bccs);
email.setSubject(主题,字符集);
email.setEntDate(Calendar.getInstance().getTime());
//文本部分
MimeBodyPart mbpText=新的MimeBodyPart();
setText(文本,字符集,“html”);
mp.addBodyPart(mbpText);
//附件
如果(附件!=null&&attachments.length>0)
{
对于(int i=0;i,因为我们不知道您正在执行什么代码,所以只能在这里进行猜测。也许您可以在所有类型中添加邮件
email.addRecipients(RecipientType.TO, tos);
email.addRecipients(RecipientType.CC, ccs);
email.addRecipients(RecipientType.BCC, bccs);
我建议您打印出地址数组。如果该数组多次包含邮件,我将开始查找它们的添加位置。因为我们不知道您正在执行的代码,所以只能在此处进行猜测。也许您可以在所有类型中添加邮件
email.addRecipients(RecipientType.TO, tos);
email.addRecipients(RecipientType.CC, ccs);
email.addRecipients(RecipientType.BCC, bccs);
我建议您打印出地址数组。如果该数组多次包含邮件,我将开始查找它们的添加位置。因为我们不知道您正在执行的代码,所以只能在此处进行猜测。也许您可以在所有类型中添加邮件
email.addRecipients(RecipientType.TO, tos);
email.addRecipients(RecipientType.CC, ccs);
email.addRecipients(RecipientType.BCC, bccs);
我建议您打印出地址数组。如果该数组多次包含邮件,我将开始查找它们的添加位置。因为我们不知道您正在执行的代码,所以只能在此处进行猜测。也许您可以在所有类型中添加邮件
email.addRecipients(RecipientType.TO, tos);
email.addRecipients(RecipientType.CC, ccs);
email.addRecipients(RecipientType.BCC, bccs);
我建议您打印出地址数组。如果该数组多次包含邮件,我将开始查找它们的添加位置。否,我在末尾使用了“Address[]addresses=email.getAllRecipients();”来检查收件人列表,这正是应该的。我正在使用gmail帐户发送给其他人(非gmail)帐户有2个tos、1个cc和1个bcc(对于我的其他电子邮件测试帐户),调试输出正好显示4个RCPT to:但我每个地址收到3封电子邮件,bcc不会成倍增加。我不理解“因为我们不知道你在执行什么代码”,需要哪些信息来排除猜测?我在调试时遇到了麻烦,所以欢迎提供任何建议。我尝试了email.setrecipients,结果相同。我忘记了一个重要细节:重复电子邮件的邮件ID是相同的。是否有人(最近)有工作和测试的邮件ID例如,可以通过gmail发送电子邮件而无需重复?我不知道如何搜索该问题。感谢您,我在接近结尾时使用了“Address[]addresses=email.getAllRecipients();”来检查收件人列表,这正是应该的。我使用gmail帐户以2到1的速度发送到其他(非gmail)帐户