val auth = EmailService.UserPassAuthenticator("yourUser", "yourPass")
val to = listOf(InternetAddress("to@example.com"))
val from = InternetAddress("from@example.com")
val email = EmailService.Email(auth, to, from, "Test Subject", "Hello Body World")
val emailService = EmailService("yourSmtpServer", 587)
GlobalScope.launch {
emailService.send(email)
}
代码:
import java.util.*
import javax.mail.*
import javax.mail.internet.InternetAddress
import javax.mail.internet.MimeBodyPart
import javax.mail.internet.MimeMessage
import javax.mail.internet.MimeMultipart
class EmailService(private var server: String, private var port: Int) {
data class Email(
val auth: Authenticator,
val toList: List<InternetAddress>,
val from: Address,
val subject: String,
val body: String
)
class UserPassAuthenticator(private val username: String, private val password: String) : Authenticator() {
override fun getPasswordAuthentication(): PasswordAuthentication {
return PasswordAuthentication(username, password)
}
}
fun send(email: Email) {
val props = Properties()
props["mail.smtp.auth"] = "true"
props["mail.user"] = email.from
props["mail.smtp.host"] = server
props["mail.smtp.port"] = port
props["mail.smtp.starttls.enable"] = "true"
props["mail.smtp.ssl.trust"] = server
props["mail.mime.charset"] = "UTF-8"
val msg: Message = MimeMessage(Session.getDefaultInstance(props, email.auth))
msg.setFrom(email.from)
msg.sentDate = Calendar.getInstance().time
msg.setRecipients(Message.RecipientType.TO, email.toList.toTypedArray())
// msg.setRecipients(Message.RecipientType.CC, email.ccList.toTypedArray())
// msg.setRecipients(Message.RecipientType.BCC, email.bccList.toTypedArray())
msg.replyTo = arrayOf(email.from)
msg.addHeader("X-Mailer", CLIENT_NAME)
msg.addHeader("Precedence", "bulk")
msg.subject = email.subject
msg.setContent(MimeMultipart().apply {
addBodyPart(MimeBodyPart().apply {
setText(email.body, "iso-8859-1")
//setContent(email.htmlBody, "text/html; charset=UTF-8")
})
})
Transport.send(msg)
}
companion object {
const val CLIENT_NAME = "Android StackOverflow programmatic email"
}
}
try
{
final ReservationNotice notice = new ReservationNotice( mConfig.getEmailTemplateBookingReservationNotice() )
.setHeader( mConfig.getEmailTemplateBookingReservationNoticeHeader() )
.setFooter( mConfig.getEmailTemplateBookingReservationNoticeFooter() );
EmailService.Attachment attachment = new EmailService.Attachment( iCalGenerator.create( mBooking, notice, "CalendarEvent.ics" ) );
mEmailService.reset()
.setFrom( mBooking.getBookingEmailFromAddress() )
.setToList( mBooking.getCustomer().getEmail() )
.setBccList( mBooking.getBookingEmailBCCAddress() )
.setSubject( mBooking.getEmailTemplateBookingReservationNoticeSubject() )
.setHtmlBody( notice.buildHTML() )
.setTxtBody( notice.buildTXT() )
.setAttachments( attachment );
mEmailService.send( true, ( e ) -> {
if ( e != null )
{
ErrorDialog.show( e );
return;
}
Toast.makeText( getContext(), R.string.email_sent, Toast.LENGTH_LONG ).show();
} );
}
catch ( MessagingException | IOException e )
{
ErrorDialog.show( e );
}
ReservationNotice是一个用于构建电子邮件的简单类
/**
* @author Ako
*/
public abstract class BaseEmailBuilder< T extends BaseEmailBuilder >
{
protected final String mTemplate;
protected String mHeader;
protected String mFooter;
public T setHeader( final String header )
{
mHeader = header;
return ( T ) this;
}
public T setFooter( final String footer )
{
mFooter = footer;
return ( T ) this;
}
public BaseEmailBuilder( final String template )
{
mTemplate = template;
}
public abstract String buildHTML();
public abstract String buildTXT();
public abstract String buildICal();
}
javax.mail.MessagingException: Could not connect to SMTP host: smtp.gmail.com, port: 465;
nested exception is:
java.net.SocketTimeoutException: failed to connect to smtp.gmail.com/64.233.184.108 (port 465) after 90000ms
6条答案
按热度按时间4ioopgfo1#
第一种方式.如果您不想通过Intent链接到原生邮件程序或gmail程序来发送邮件,而是在后台发送邮件,请参阅下面的代码。
首先,您需要在Gradle文件中导入以下库:
然后,您可以使用这个helper类并根据需要对其进行调整。
并使用以下类:
第二种方式.另一种选择,如果你不介意使用原生电子邮件客户端或Android上的gmail来发送邮件(但用户实际上必须在电子邮件客户端中点击发送按钮),你可以这样做:
qrjkbowd2#
在提交按钮中添加这行代码
Android将自动选择客户端avilable在您的设备和用户将自由选择任何电子邮件客户端,他想要的
假设用户选择gmail作为邮件客户端,它看起来像这样:-
这种方法的优点是你不需要在应用程序中添加任何额外的jar &给用户选择操作的自由。
yftpprvb3#
从这个线程中提取代码并整理到Kotlin中。
我也只想做简单的电子邮件发送,而不是所有的其他功能(如附件)。2020 TLS总是打开的,所以也做了一些整理。只需要1个Gradle依赖项。
我还发现以下电子邮件POP服务列表非常有用:
https://support.office.com/en-gb/article/pop-and-imap-email-settings-for-outlook-8361e398-8af4-4e97-b147-6c6c4ac95353
使用方法:
代码:
等级:
polhcujo4#
在你的libs文件夹中添加三个jar文件,试试这个mail.jar!
启动,贾尔!
额外的.jar!
直接写入主题或正文并删除edittext,您将直接从应用发送电子邮件。
别忘了在你的载货单上给予互联网许可
deyfvvtc5#
改进的Mathias Conradt码
包含
build.gradle
Android项目的依赖项显示EmailService的示例
发送电子邮件
ReservationNotice是一个用于构建电子邮件的简单类
iCalGenerator是iCal4j上的一个 Package 器。目前Android只支持2.0版本,或者需要Java 1.9+。
ErrorDialog
是一个类,包含用于构建AlertDialog.Builder
消息的静态方法。fiei3ece6#
还有一件事,我用了这个网站上各种答案中给出的方法,但它根本不起作用。第一个问题是防火墙:
Transport.send(message)
正在引发以下异常:如果发生这种情况,则说明防火墙正在阻止您。请尝试其他网络。
在我切换网络后,我收到了一封来自谷歌的电子邮件,说一个不太安全的应用程序试图使用我的帐户。
解决方案是为安全性较低的应用程序启用GMail访问。可以通过以下链接完成此操作:
https://support.google.com/accounts/answer/6010255?hl=en