当您需要在同一JVM中的任何位置设置多个SMTP会话时,发布的代码解决方案可能会导致问题。
JavaMail FAQ建议使用
Session.getInstance(properties);
代替
Session.getDefaultInstance(properties);
因为getDefault只会在第一次调用时使用它们。稍后使用默认实例将忽略属性更改。
看到 http://www.oracle.com/technetwork/java/faq-135477.html#getdefaultinstance
其他人在上面有很好的答案,但我想在这里添加一个关于我的经验的说明。我发现当使用Gmail作为我的网络应用程序的出站SMTP服务器时,Gmail只允许我发送大约10条消息,然后才能使用反垃圾邮件响应进行响应,我必须手动单步重新启用SMTP访问。我发送的电子邮件不是垃圾邮件,但是当用户在我的系统注册时,网站是“欢迎”电子邮件。所以,YMMV,我不会依赖Gmail生产webapp。如果您代表用户发送电子邮件,例如已安装的桌面应用(用户输入自己的Gmail凭据),您可能没问题。
此外,如果您使用的是Spring,那么这是一个使用Gmail进行出站SMTP的工作配置:
<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl"> <property name="defaultEncoding" value="UTF-8"/> <property name="host" value="smtp.gmail.com"/> <property name="port" value="465"/> <property name="username" value="${mail.username}"/> <property name="password" value="${mail.password}"/> <property name="javaMailProperties"> <value> mail.debug=true mail.smtp.auth=true mail.smtp.socketFactory.class=java.net.SocketFactory mail.smtp.socketFactory.fallback=false </value> </property> </bean>
一个简单的途径是为POP3访问配置/启用gmail帐户。这将允许您通过正常的SMTP通过gmail服务器发送。
然后你只需通过smtp.gmail.com发送(在587端口)
我的完整代码如下:
package ripon.java.mail; import java.util.*; import javax.mail.*; import javax.mail.internet.*; public class SendEmail { public static void main(String [] args) { // Sender's email ID needs to be mentioned String from = "test@gmail.com"; String pass ="test123"; // Recipient's email ID needs to be mentioned. String to = "ripon420@yahoo.com"; String host = "smtp.gmail.com"; // Get system properties Properties properties = System.getProperties(); // Setup mail server properties.put("mail.smtp.starttls.enable", "true"); properties.put("mail.smtp.host", host); properties.put("mail.smtp.user", from); properties.put("mail.smtp.password", pass); properties.put("mail.smtp.port", "587"); properties.put("mail.smtp.auth", "true"); // Get the default Session object. Session session = Session.getDefaultInstance(properties); try{ // Create a default MimeMessage object. MimeMessage message = new MimeMessage(session); // Set From: header field of the header. message.setFrom(new InternetAddress(from)); // Set To: header field of the header. message.addRecipient(Message.RecipientType.TO, new InternetAddress(to)); // Set Subject: header field message.setSubject("This is the Subject Line!"); // Now set the actual message message.setText("This is actual message"); // Send message Transport transport = session.getTransport("smtp"); transport.connect(host, from, pass); transport.sendMessage(message, message.getAllRecipients()); transport.close(); System.out.println("Sent message successfully...."); }catch (MessagingException mex) { mex.printStackTrace(); } } }
这是一个易于使用的类,用于发送电子邮件 Gmail 。你需要拥有 JavaMail 图书馆 添加到您的构建路径 或者只是使用 Maven 。
Gmail
JavaMail
Maven
import java.util.Properties; import javax.activation.DataHandler; import javax.activation.DataSource; import javax.activation.FileDataSource; import javax.mail.BodyPart; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.Multipart; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.AddressException; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; public class GmailSender { private static String protocol = "smtp"; private String username; private String password; private Session session; private Message message; private Multipart multipart; public GmailSender() { this.multipart = new MimeMultipart(); } public void setSender(String username, String password) { this.username = username; this.password = password; this.session = getSession(); this.message = new MimeMessage(session); } public void addRecipient(String recipient) throws AddressException, MessagingException { message.addRecipient(Message.RecipientType.TO, new InternetAddress(recipient)); } public void setSubject(String subject) throws MessagingException { message.setSubject(subject); } public void setBody(String body) throws MessagingException { BodyPart messageBodyPart = new MimeBodyPart(); messageBodyPart.setText(body); multipart.addBodyPart(messageBodyPart); message.setContent(multipart); } public void send() throws MessagingException { Transport transport = session.getTransport(protocol); transport.connect(username, password); transport.sendMessage(message, message.getAllRecipients()); transport.close(); } public void addAttachment(String filePath) throws MessagingException { BodyPart messageBodyPart = getFileBodyPart(filePath); multipart.addBodyPart(messageBodyPart); message.setContent(multipart); } private BodyPart getFileBodyPart(String filePath) throws MessagingException { BodyPart messageBodyPart = new MimeBodyPart(); DataSource dataSource = new FileDataSource(filePath); messageBodyPart.setDataHandler(new DataHandler(dataSource)); messageBodyPart.setFileName(filePath); return messageBodyPart; } private Session getSession() { Properties properties = getMailServerProperties(); Session session = Session.getDefaultInstance(properties); return session; } private Properties getMailServerProperties() { Properties properties = System.getProperties(); properties.put("mail.smtp.starttls.enable", "true"); properties.put("mail.smtp.host", protocol + ".gmail.com"); properties.put("mail.smtp.user", username); properties.put("mail.smtp.password", password); properties.put("mail.smtp.port", "587"); properties.put("mail.smtp.auth", "true"); return properties; } }
用法示例:
GmailSender sender = new GmailSender(); sender.setSender("myEmailNameWithout@gmail.com", "mypassword"); sender.addRecipient("recipient@somehost.com"); sender.setSubject("The subject"); sender.setBody("The body"); sender.addAttachment("TestFile.txt"); sender.send();
如果你想使用outlook Javamail API 然后用
Javamail API
smtp-mail.outlook.com
作为一个 的 主办 强> 了解更多完整的工作代码 看看这个答案 。
当我想发送带附件的电子邮件时,这就是我的工作,工作正常。 :)
public class NewClass { public static void main(String[] args) { try { Properties props = System.getProperties(); props.put("mail.smtp.starttls.enable", "true"); props.put("mail.smtp.host", "smtp.gmail.com"); props.put("mail.smtp.auth", "true"); props.put("mail.smtp.port", "465"); // smtp port Authenticator auth = new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication("username-gmail", "password-gmail"); } }; Session session = Session.getDefaultInstance(props, auth); MimeMessage msg = new MimeMessage(session); msg.setFrom(new InternetAddress("username-gmail@gmail.com")); msg.setSubject("Try attachment gmail"); msg.setRecipient(RecipientType.TO, new InternetAddress("username-gmail@gmail.com")); //add atleast simple body MimeBodyPart body = new MimeBodyPart(); body.setText("Try attachment"); //do attachment MimeBodyPart attachMent = new MimeBodyPart(); FileDataSource dataSource = new FileDataSource(new File("file-sent.txt")); attachMent.setDataHandler(new DataHandler(dataSource)); attachMent.setFileName("file-sent.txt"); attachMent.setDisposition(MimeBodyPart.ATTACHMENT); Multipart multipart = new MimeMultipart(); multipart.addBodyPart(body); multipart.addBodyPart(attachMent); msg.setContent(multipart); Transport.send(msg); } catch (AddressException ex) { Logger.getLogger(NewClass.class.getName()).log(Level.SEVERE, null, ex); } catch (MessagingException ex) { Logger.getLogger(NewClass.class.getName()).log(Level.SEVERE, null, ex); } } }
//set CLASSPATH=%CLASSPATH%;activation.jar;mail.jar import javax.mail.*; import javax.mail.internet.*; import java.util.*; public class Mail { String d_email = "iamdvr@gmail.com", d_password = "****", d_host = "smtp.gmail.com", d_port = "465", m_to = "iamdvr@yahoo.com", m_subject = "Testing", m_text = "Hey, this is the testing email using smtp.gmail.com."; public static void main(String[] args) { String[] to={"XXX@yahoo.com"}; String[] cc={"XXX@yahoo.com"}; String[] bcc={"XXX@yahoo.com"}; //This is for google Mail.sendMail("venkatesh@dfdf.com", "password", "smtp.gmail.com", "465", "true", "true", true, "javax.net.ssl.SSLSocketFactory", "false", to, cc, bcc, "hi baba don't send virus mails..", "This is my style...of reply..If u send virus mails.."); } public synchronized static boolean sendMail( String userName, String passWord, String host, String port, String starttls, String auth, boolean debug, String socketFactoryClass, String fallback, String[] to, String[] cc, String[] bcc, String subject, String text) { Properties props = new Properties(); //Properties props=System.getProperties(); props.put("mail.smtp.user", userName); props.put("mail.smtp.host", host); if(!"".equals(port)) props.put("mail.smtp.port", port); if(!"".equals(starttls)) props.put("mail.smtp.starttls.enable",starttls); props.put("mail.smtp.auth", auth); if(debug) { props.put("mail.smtp.debug", "true"); } else { props.put("mail.smtp.debug", "false"); } if(!"".equals(port)) props.put("mail.smtp.socketFactory.port", port); if(!"".equals(socketFactoryClass)) props.put("mail.smtp.socketFactory.class",socketFactoryClass); if(!"".equals(fallback)) props.put("mail.smtp.socketFactory.fallback", fallback); try { Session session = Session.getDefaultInstance(props, null); session.setDebug(debug); MimeMessage msg = new MimeMessage(session); msg.setText(text); msg.setSubject(subject); msg.setFrom(new InternetAddress("p_sambasivarao@sutyam.com")); for(int i=0;i<to.length;i++) { msg.addRecipient(Message.RecipientType.TO, new InternetAddress(to[i])); } for(int i=0;i<cc.length;i++) { msg.addRecipient(Message.RecipientType.CC, new InternetAddress(cc[i])); } for(int i=0;i<bcc.length;i++) { msg.addRecipient(Message.RecipientType.BCC, new InternetAddress(bcc[i])); } msg.saveChanges(); Transport transport = session.getTransport("smtp"); transport.connect(host, userName, passWord); transport.sendMessage(msg, msg.getAllRecipients()); transport.close(); return true; } catch (Exception mex) { mex.printStackTrace(); return false; } } }
最低要求:
import java.util.Properties; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.PasswordAuthentication; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.AddressException; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; public class MessageSender { public static void sendHardCoded() throws AddressException, MessagingException { String to = "a@a.info"; final String from = "b@gmail.com"; Properties properties = new Properties(); properties.put("mail.smtp.starttls.enable", "true"); properties.put("mail.smtp.auth", "true"); properties.put("mail.smtp.host", "smtp.gmail.com"); properties.put("mail.smtp.port", "587"); Session session = Session.getInstance(properties, new javax.mail.Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(from, "BeNice"); } }); MimeMessage message = new MimeMessage(session); message.setFrom(new InternetAddress(from)); message.addRecipient(Message.RecipientType.TO, new InternetAddress(to)); message.setSubject("Hello"); message.setText("What's up?"); Transport.send(message); } }
即使这个问题已经结束,我也想发布一个反制解决方案,但现在正在使用 简单的Java邮件 (开源JavaMail smtp包装器):
final Email email = new Email(); String host = "smtp.gmail.com"; Integer port = 587; String from = "username"; String pass = "password"; String[] to = {"to@gmail.com"}; email.setFromAddress("", from); email.setSubject("sending in a group"); for( int i=0; i < to.length; i++ ) { email.addRecipient("", to[i], RecipientType.TO); } email.setText("Welcome to JavaMail"); new Mailer(host, port, from, pass).sendMail(email); // you could also still use your mail session instead new Mailer(session).sendMail(email);
嗨试试这个代码....
package my.test.service; import java.util.Properties; import javax.mail.Authenticator; import javax.mail.MessagingException; import javax.mail.PasswordAuthentication; import javax.mail.Session; import javax.mail.Message; import javax.mail.Transport; import javax.mail.internet.AddressException; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; public class Sample { public static void main(String args[]) { final String SMTP_HOST = "smtp.gmail.com"; final String SMTP_PORT = "587"; final String GMAIL_USERNAME = "xxxxxxxxxx@gmail.com"; final String GMAIL_PASSWORD = "xxxxxxxxxx"; System.out.println("Process Started"); Properties prop = System.getProperties(); prop.setProperty("mail.smtp.starttls.enable", "true"); prop.setProperty("mail.smtp.host", SMTP_HOST); prop.setProperty("mail.smtp.user", GMAIL_USERNAME); prop.setProperty("mail.smtp.password", GMAIL_PASSWORD); prop.setProperty("mail.smtp.port", SMTP_PORT); prop.setProperty("mail.smtp.auth", "true"); System.out.println("Props : " + prop); Session session = Session.getInstance(prop, new Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(GMAIL_USERNAME, GMAIL_PASSWORD); } }); System.out.println("Got Session : " + session); MimeMessage message = new MimeMessage(session); try { System.out.println("before sending"); message.setFrom(new InternetAddress(GMAIL_USERNAME)); message.addRecipients(Message.RecipientType.TO, InternetAddress.parse(GMAIL_USERNAME)); message.setSubject("My First Email Attempt from Java"); message.setText("Hi, This mail came from Java Application."); message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(GMAIL_USERNAME)); Transport transport = session.getTransport("smtp"); System.out.println("Got Transport" + transport); transport.connect(SMTP_HOST, GMAIL_USERNAME, GMAIL_PASSWORD); transport.sendMessage(message, message.getAllRecipients()); System.out.println("message Object : " + message); System.out.println("Email Sent Successfully"); } catch (AddressException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (MessagingException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }