webForumDet fria alternativet

Kommunikation med SMTP-server

Webbutveckling

24 svar · 772 visningar · startad av Erik Juhlin

Medlem sedan maj 200010 687 inlägg
Frågan#1

Jag håller på och ska bygga en mailapplikation som ska kunna klara av att skicka mängder med mail.

Jag har fått höra att när man ska göra det så ska man öppna upp en session till SMTP-servern och skicka mailen istället för att öppna upp en session för varje e-mail man skickar.
Därför mailade jag till AspEmail (som är en komponent jag funderar på att använda) och frågade hur den gjorde. Jag fick svaret:

AspEmail opens up one session for each email. There's nothing wrong with that; SMTP servers can handle it.

Stämmer detta? Vem har rätt?

Hoppas någon med lite kunskap om mailskickande kan svara på detta.

Medlem sedan juni 20014 290 inlägg
#2

Visst kan man göra så, att öppna en session per mail, men är lite onödigt om man skickar samma mail till flera användare inom samma domän.

Då är det enklare att öppna en session mot mail servern och sedan bara upprepa "RCPT TO....." kommandot för varje mottagare av mailet till dom adresserna som just den mailservern hanterar.

Det är så dom stora mailinglist programmen fungerar.

Medlem sedan maj 200010 687 inlägg
#3

Jo förresten, varje mail som skickas är unikt utformat för användaren. Vi har alltså saker som "Hej Gunnar!" i mailen.

Därför är det inte samma mail med många mottagare.

Men även om man skickar 10000 unika mail, är det då inte bättre att göra det i en session eller gör det inget om man öppnar upp en session för varje mail man skickar?

Medlem sedan maj 20018 027 inlägg
#4

Erik Juhlin skrev:

Jo förresten, varje mail som skickas är unikt utformat för användaren. Vi har alltså saker som "Hej Gunnar!" i mailen.

Därför är det inte samma mail med många mottagare.

Men det är inget hinder för GunnarD:s lösning. Du måste ju hur som helst hämta fram en unik mail-adress för varje adressat. Då kan du naturligtvis även generera en ny hälsning för adressaten.

Medlem sedan aug. 2000374 inlägg
#5

Erik Juhlin skrev:

[...]Men även om man skickar 10000 unika mail, är det då inte bättre att göra det i en session eller gör det inget om man öppnar upp en session för varje mail man skickar?

En session är bättre!

Exempel:

mundus:~ chansen$ telnet smtp.company.net 25
Trying 0.0.0.0...
Connected to smtp.company.net.
Escape character is '^]'.
220 smtp.company.net ESMTP 
HELO
250 smtp.company.net 
MAIL FROM: [email]userpart@domain.com[/email]
250 ok
RCPT TO: [email]userpart@domain.com[/email]
250 ok
DATA
354 go ahead punk, make my day
Subject: Mail

I'm not a spammer!
.
250 ok 1092732327 qp 25388 by smtp.company.net
MAIL FROM: [email]userpart@domain.com[/email]
250 ok
RCPT TO: [email]userpart@domain.com[/email]
250 ok
DATA
354 go ahead punk, make my day
Subject: Hello2

I'm bored!
.
250 ok 1092732368 qp 25392 by smtp.company.net
QUIT
221 smtp.company.net Goodbye.
Connection closed by foreign host.
Medlem sedan maj 200010 687 inlägg
#6

Okej, någon som vet en bra komponent som fungerar så och går att använda från ASP/VB?

Medlem sedan juni 20014 290 inlägg
#7

En annan sak är om du tänker använda en extern mailserver som relay för alla dina mail eler om du tänker skicka direkt till mottagarens mailserver.

Om du tänker skicka direkt till mottagarens mailserver så måste du läga in logik i programmet som att du bara skickar mail till den/dom domänen som resp. mailserver hanterar, annars kommer du få många "reject" eftersom dom flesta mailservrar idag inte relayar ut mail från okända.

Kan tänka mig att denna logiken finns i dom färdiga komponenter som finns ute och det är därfö ex. aspmail valt ett mail per session då slipper man hålla på och sortera/gruppera mailen innan man skickar ut dom.

Medlem sedan maj 20018 027 inlägg
#8

Erik Juhlin skrev:

Okej, någon som vet en bra komponent som fungerar så och går att använda från ASP/VB?

Jag har använt Microsoft Winsock Control 6.0. Den fungerar, men om den är någon idealisk komponent, vette tusan. En skum sak, som för övrigt gäller en hel del komponenter, är att man måste ha ett formulär som man kan dra och släppa komponenten på. Mycket märkligt, då den inte har något att göra med GUI. Nåja, jag har i vart fall använt den på följande sätt:

  1. Öppna en socket mot SMTP-server:
  MySocket.Protocol = sckTCPProtocol
  MySocket.RemoteHost = mailServer
  MySocket.RemotePort = portNr
  MySocket.Connect
  SendMail = True
  1. Skicka ett mail:

Allt görs i eventet "DataArrival" eftersom det ständigt kommer svar från servern på varje kommando som skickas. Själv bryr jag mig inte om vad servern svarar, utan utgår från att det är de gamla standardsvaren som en SMTP-server brukar ge. Annars skulle man kunna tänka sig att man analyserar svaren för att spåra upp eventuella fel. Men nu har jag full kontroll över den SMTP-server det rör sig om, så jag behöver inte göra så. Vad jag istället gör, är att jag håller räkningen på vilken gång i ordningen som "DataArrival" anropas. Alltså vet jag utifrån detta var jag är i processen att skicka ett mail:

Private Sub MySocket_DataArrival(ByVal bytesTotal As Long)
  Dim m_mottaget As String
  Dim m_message As String

  MySocket.GetData m_mottaget, "String"
  
  Select Case m_pResponseCounter
    Case 0
      MySocket.SendData ("MAIL FROM: ProVy" & vbCrLf)
    Case 1
      MySocket.SendData ("RCPT TO: " & m_pMottagare & vbCrLf)
    Case 2
      MySocket.SendData ("DATA" & vbCrLf)
    Case 3
      m_message = "From: ProVy" & vbCrLf
      m_message = m_message & "To: " & m_pMottagare & vbCrLf
      m_message = m_message & "Subject: " & "JobbId " & m_pJobbId & vbCrLf & vbCrLf
      'OBS! Avsluta med & "." & vbCrLf
      m_message = m_message & "Ditt jobb med id " & m_pJobbId & " är nu klart." & vbCrLf & "." & vbCrLf
      MySocket.SendData (m_message)
    Case 4
      MySocket.SendData ("QUIT" & vbCrLf)
    Case 5
      MySocket.Close
  End Select
  
  m_pResponseCounter = m_pResponseCounter + 1
End Sub
Medlem sedan maj 200010 687 inlägg
#9

GunnarD: Vi kör ju med en extern mail-server som sedan skickar vidare allt dit det ska.

UlfT: Drag&Drop grejen verkar mysko. Då skulle det väl inte funka från en ActiveX DLL eller en ASP sida..?
Sen så vill jag ha en komponent med ett trevligt gränssnitt och inte behöva specificera varje header. Säkert inte så krångligt, men det kan nog bli lite för mycket rotande när man sen ska ha attachments och annat.

Medlem sedan aug. 2000374 inlägg
#10

GunnarD skrev:

[...]Om du tänker skicka direkt till mottagarens mailserver så måste du läga in logik i programmet som att du bara skickar mail till den/dom domänen som resp. mailserver hanterar, annars kommer du få många "reject" eftersom dom flesta mailservrar idag inte relayar ut mail från okända. [...]

Ett tips är att gruppera efter MX pekaren.

Det är viktigt att maskinen som agerar MTA har en PTR och en MX annars kommer du bli "rejectad" på många servrar.

Medlem sedan jan. 2003573 inlägg
#11

Hansen skrev:

En session är bättre!

Oomkullrunkeligen.

Hansen skrev:

Exempel:

mundus:~ chansen$ telnet smtp.company.net 25
Trying 0.0.0.0...
Connected to smtp.company.net.
Escape character is '^]'.
220 smtp.company.net ESMTP 
HELO
250 smtp.company.net 
MAIL FROM: [email]userpart@domain.com[/email]
250 ok
RCPT TO: [email]userpart@domain.com[/email]
250 ok
DATA
354 go ahead punk, make my day
Subject: Mail

I'm not a spammer!
.
250 ok 1092732327 qp 25388 by smtp.company.net

RSET

Hansen skrev:

MAIL FROM: [email]userpart@domain.com[/email]
250 ok
RCPT TO: [email]userpart@domain.com[/email]
250 ok
DATA
354 go ahead punk, make my day
Subject: Hello2

I'm bored!
.
250 ok 1092732368 qp 25392 by smtp.company.net
QUIT
221 smtp.company.net Goodbye.
Connection closed by foreign host.

Inte glömma RSET mellan mailen....

/M

Medlem sedan aug. 2000374 inlägg
#12

mlundbom skrev:

Inte glömma RSET mellan mailen....

Säker?

RFC821 skrev:

RESET (RSET)

        This command specifies that the current mail transaction is
        to be aborted.  Any stored sender, recipients, and mail data
        must be discarded, and all buffers and state tables cleared.
        The receiver must send an OK reply.

http://www.faqs.org/rfcs/rfc821.html

Medlem sedan jan. 2003573 inlägg
#13

Hansen skrev:

Säker?

Eh, ja?

hostname:~> telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 Mail ESMTP service ready.
helo blaha
250 hostname Hello localhost [127.0.0.1], pleased to meet you
mail from:<user@domain>
250 2.1.0 <user@domain>... Sender ok
rcpt to:<user@domain>
250 2.1.5 <user@domain>... Recipient ok
data
354 Enter mail, end with "." on a line by itself
testar
.
250 2.0.0 i7HA7svK016442 Message accepted for delivery
rset
250 2.0.0 Reset state
helo blaha
250 hostname Hello localhost [127.0.0.1], pleased to meet you
mail from:<user@domain>
250 2.1.0 <user@domain>... Sender ok
rcpt to:<user@domain>
250 2.1.5 <user@domain>... Recipient ok
data
354 Enter mail, end with "." on a line by itself
testar 2
.
250 2.0.0 i7HA7svN016442 Message accepted for delivery
rset
250 2.0.0 Reset state
quit
221 2.0.0 hostname closing connection
Connection closed by foreign host.

Gav mig två nya mail i inbox .......

/M

Medlem sedan juni 20014 290 inlägg
#14

Iom att man sätter punkt för DATA blocket så är det mailet klart och skickas iväg, då avbryter inte RSET det mailet.

Medlem sedan maj 20018 027 inlägg
#15

Erik Juhlin skrev:

UlfT: Drag&Drop grejen verkar mysko. Då skulle det väl inte funka från en ActiveX DLL eller en ASP sida..?

Hur det är med asp-sidor vet jag inte. När det gäller activex-dll:er, skulle du kunna lägga in ett formulär som du aldrig visar. Poängen med formuläret är endast att ha något som man kan dra och släppa komponenter på under utvecklingsarbetet. När dll:en verkligen körs, ser inte användaren någonting av formuläret.

Erik Juhlin skrev:

Sen så vill jag ha en komponent med ett trevligt gränssnitt och inte behöva specificera varje header. Säkert inte så krångligt, men det kan nog bli lite för mycket rotande när man sen ska ha attachments och annat.

Jo, det är riktigt. Det blir krångligt om man ska gå så långt som att använda attachments. Så länge man håller sig till ren text, är det rätt enkelt. Den här komponenten är ju egentligen inte specialiserad på något vis, utan kan användas till all tcp/ip-kommunikation. Men då får man hålla reda på hur de olika protokollen fungerar. Jag känner tyvärr inte till någon komponent som är specialiserad på just SMTP.

Medlem sedan aug. 2000374 inlägg
#16

mlundbom skrev:

Hansen skrev:

Säker?

Eh, ja?[...]

Nej!

RFC821 4.1.1 DATA skrev:

The end of mail data indication requires that the receiver
must now process the stored mail transaction information.
This processing consumes the information in the reverse-path
buffer, the forward-path buffer, and the mail data buffer,
and on the completion of this command these buffers are
cleared.

Medlem sedan maj 200010 687 inlägg
#17

Hansen: Jag skrev ju att vi använder en extern mailserver som sköter det.

UlfT: Hursomhelst så är jag inte intresserad av det.

DevMailer verkar lite intressant.
http://www.geocel.com/devmailer/

DevMailer Spec skrev:

Connect()

Manually force Connection to SMTP Server. Send() can be called several times on one connection. By default, this is called automatically by Send(), however Send() will use an existing connection if available. Returns TRUE upon success and FALSE upon failure.

Medlem sedan maj 200010 687 inlägg
#18

Men så verkar den sakna multipart/alternative och Embedded attachments. :l

Medlem sedan jan. 2003573 inlägg
#19

GunnarD skrev:

Iom att man sätter punkt för DATA blocket så är det mailet klart och skickas iväg, då avbryter inte RSET det mailet.

Medlem sedan aug. 2000374 inlägg
#20

mlundbom skrev:

GunnarD skrev:

Iom att man sätter punkt för DATA blocket så är det mailet klart och skickas iväg, då avbryter inte RSET det mailet.

Det står klart och tydligt att en transaktion påbörjas med kommandot MAIL FROM och avslutas med kommandot DATA. Att kalla kommandot RSET utanför en transaktion ger inget.

285 ms totalt · 4 externa anrop · v20260731065814-full.868a69e5
129 ms — deklarationer (db)
0 ms — hämta statistik (cache)
151 ms — hämta tråd, inlägg och bilagor (db)
132 ms — ändringar (db)