我正在尝试使用JavaMail以html格式发送电子邮件,但它似乎只在Outlook中显示为文本电子邮件.
这是我的代码:
try
{
Properties props = System.getProperties();
props.put("mail.smtp.host", mailserver);
props.put("mail.smtp.from", fromEmail);
props.put("mail.smtp.auth", authentication);
props.put("mail.smtp.port", port);
Session session = Session.getDefaultInstance(props, null);
// -- Create a new message --
MimeMessage message = new MimeMessage(session);
// -- Set the FROM and TO fields --
message.setFrom(new InternetAddress(fromEmail, displayName));
message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to, false));
MimeMultipart content = new MimeMultipart();
MimeBodyPart text = new MimeBodyPart();
MimeBodyPart html = new MimeBodyPart();
text.setText(textBody);
text.setHeader("MIME-Version" , "1.0" );
text.setHeader("Content-Type" , text.getContentType() );
html.setContent(htmlBody, "text/html");
html.setHeader("MIME-Version" , "1.0" );
html.setHeader("Content-Type" , …Run Code Online (Sandbox Code Playgroud) 我想发送一封电子邮件到非ASCII电子邮件地址,我不确定使用JDK8的推荐程序是什么.
我该如何处理以下电子邮件地址?
是否有任何安全注意事项需要注意?
这个示例代码是否足够?
import java.net.IDN;
public class IDNMailHelper {
public static String toIdnAddress(String mail) {
if (mail == null) {
return null;
}
int idx = mail.indexOf('@');
if (idx < 0) {
return mail;
}
return localPart(mail, idx) + "@" + IDN.toASCII(domain(mail, idx));
}
private static String localPart(String mail, int idx) {
return mail.substring(0, idx);
}
private static String domain(String mail, int idx) {
return mail.substring(idx + 1);
}
}
Run Code Online (Sandbox Code Playgroud) 如何使用JavaMail将Return-Path设置为发件人地址以外的电子邮件地址?
我在做一个sendMail Servlet用JavaMail.我有javax.mail.AuthenticationFailedException我的输出.有人可以帮帮我吗?谢谢.
sendMailServlet代码:
try {
String host = "smtp.gmail.com";
String from = "my@gmail.com";
String pass = "pass";
Properties props = System.getProperties();
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.host", host);
props.put("mail.smtp.user", from);
props.put("mail.smtp.password", pass);
props.put("mail.smtp.port", "587");
props.put("mail.smtp.auth", "true");
props.put("mail.debug", "true");
Session session = Session.getDefaultInstance(props, null);
MimeMessage message = new MimeMessage(session);
Address fromAddress = new InternetAddress(from);
Address toAddress = new InternetAddress("test1@gmail.com");
message.setFrom(fromAddress);
message.setRecipient(Message.RecipientType.TO, toAddress);
message.setSubject("Testing JavaMail");
message.setText("Welcome to JavaMail");
Transport transport = session.getTransport("smtp");
transport.connect(host, from, pass);
message.saveChanges();
Transport.send(message);
transport.close();
}catch(Exception …Run Code Online (Sandbox Code Playgroud) 我正在尝试发送带有附件的电子邮件,发现java邮件api令人生气.
只有两个实现javax.activation.DataHandler要求我创建一个本地文件来发送附件.可能我必须编写自己的DataHandler实现,但此时我不想这样做.
提前致谢 !
阿迪
编辑:我的意思javax.activation.DataSource不是javax.activation.DataHandler
这是代码:
Session session = Session.getDefaultInstance(props, null);
Store store = session.getStore("imaps");
store.connect("imap.gmail.com", "****@gmail.com", "****");
System.out.println(store);
Folder folder = store.getDefaultFolder();
folder = folder.getFolder("INBOX");
folder.open(Folder.READ_ONLY);
System.out.println("Message Count: "+folder.getMessageCount());
System.out.println("Unread Message Count: "+folder.getUnreadMessageCount());
Message[] messages = folder.getMessages(); --> here the code stops.
FetchProfile fp = new FetchProfile();
fp.add(FetchProfile.Item.ENVELOPE);
folder.fetch(messages, fp);
for (int i = 0; i< messages.length; i++)
{
System.out.println("From:"+ messages[i].getFrom());
}
Run Code Online (Sandbox Code Playgroud)
代码给出了以下的摘要并在显示的位置停止.
线程"main"中的异常java.lang.NoClassDefFoundError:com.google.code.com中的com.google.code.com.sun.mail.imap.MessageCache.getMessage(MessageCache.java:129)中的javax/activation/DataSource openReports.OpenReports.main中的.sun.mail.imap.IMAPFolder.getMessage(IMAPFolder.java:1394)
如何在发送邮件时设置SMTP邮件ID javax.mail.我的邮件服务器报告的内容如下:
1 <= me@domain.com H=mail (host) [192.168.1.4] P=esmtp S=142014
id=2043289758.9.1322829290422.JavaMail.thor@developer.local
2 => sombodey@else R=dnslookup T=remote_smtp H=mx00.t-online.de [194.25.134.8]
3 Completed
Run Code Online (Sandbox Code Playgroud)
我想id=2043289758.9.1322829290422.JavaMail.thor@developer.local在发送之前设置它.这可能吗?它创建的电子邮件如下:
Properties props = System.getProperties();
props.put("mail.smtp.host", "192.168.1.4");
Session session = Session.getDefaultInstance(props, null);
session.setDebug(false);
Message msg = createMsg();
Transport.send(msg);
Run Code Online (Sandbox Code Playgroud) 我可以使用javax.mail API发送邮件.但这里的问题是平均每封邮件需要大约4.3秒才能发送到目的地.
如果我按顺序发送20封邮件,则需要大约86.599秒.根据我的要求,这种方法不起作用.我正在寻找一种可以在更短的时间内发送大量邮件的方法.
当我查看调试日志时,API正在尝试向SMTP服务器验证它发送的每条消息.但我只创建了一次会话,并为我发送的所有邮件使用相同的会话.现在我的问题是,每次向smtp服务器验证自身时,这不是一个开销过程.有没有更好的方法?
以下是您可能会发现有用的日志跟踪.
250-AUTH LOGIN PLAIN XOAUTH XOAUTH2
250 ENHANCEDSTATUSCODES
DEBUG SMTP: Found extension "SIZE", arg "35882577"
DEBUG SMTP: Found extension "8BITMIME", arg ""
DEBUG SMTP: Found extension "AUTH", arg "LOGIN PLAIN XOAUTH XOAUTH2"
DEBUG SMTP: Found extension "ENHANCEDSTATUSCODES", arg ""
DEBUG SMTP: Attempt to authenticate
DEBUG SMTP: check mechanisms: LOGIN PLAIN DIGEST-MD5 NTLM
DEBUG SMTP: AUTH LOGIN command trace suppressed
DEBUG SMTP: AUTH LOGIN succeeded
Run Code Online (Sandbox Code Playgroud)
请让我知道你对此的看法,对此的任何帮助都非常感谢.
-Narendra
在我的应用程序中,我连接到服务器以验证用户.这是代码:
try {
Properties prop = new Properties();
prop.put("mail.smtp.starttls.enable","true");
prop.put("mail.smtp.auth", "true");
prop.put("mail.smtp.connectiontimeout", 1000);
Session session = Session.getInstance(prop, null);
Transport transport = session.getTransport("smtp");
transport.connect("mion.elka.pw.edu.pl", 587, registerLog, registerPass);
transport.close();
return true;
} catch (NoSuchProviderException ex) {
Logger.getLogger(RegisterController.class.getName()).log(Level.SEVERE, null, ex);
return false;
} catch(AuthenticationFailedException ex) {
Logger.getLogger(RegisterController.class.getName()).log(Level.SEVERE, null, ex);
return false;
} catch (MessagingException ex) {
Logger.getLogger(RegisterController.class.getName()).log(Level.SEVERE, null, ex);
return false;
}
Run Code Online (Sandbox Code Playgroud)
我将连接超时设置为1000毫秒= 1秒,但它被忽略.当我调试并设置错误的用户名和密码时,我抓住了
javax.mail.MessagingException: java.net.SocketTimeoutException: Read timed out
Run Code Online (Sandbox Code Playgroud)
不是在1000毫秒之后,而是在5000*60毫秒= 5分钟之后
怎么了 ?我怎样才能减少时间?
我正在运行一个非常基本的Javamail程序来尝试发送电子邮件.这是带main()的独立程序.一旦我开始工作,我计划在一个在tomcat下运行的servlet中使用Javamail.
运行此程序时,我收到AUTH LOGIN失败错误.我尝试了几种不同的属性设置,但都没有解决问题.
然后我在SO上发现了一条帖子,建议降低我的Google帐户所需的安全级别.当我降低安全设置时,身份验证成功.
当然,我立即回到Google帐户的更高安全级别.
我的问题是,如何使我的应用程序更安全,以便gmail不拒绝身份验证?
程序代码如下所示.该程序与SO上的许多其他Javamail问题中的代码非常相似.
TryJavamail.java
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Properties;
import javax.mail.*;
import javax.mail.internet.*;
public class TryJavamail {
public static void main(String args[]) throws MessagingException {
String submitName = "John Doe";
String submitEmail = "from@example.com";
String submitMessage = "This is the message";
Properties props = new Properties();
props.put("mail.transport.protocol", "smtp");
props.setProperty("mail.smtp.host", "smtp.gmail.com");
props.setProperty("mail.smtp.auth", "true");
props.setProperty("mail.smtp.ssl.enable", "true");
props.setProperty("mail.smtp.port", "465");
Session session = Session.getInstance(props, null);
session.setDebug(true);
Message message = new MimeMessage(session); …Run Code Online (Sandbox Code Playgroud)