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.
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.
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?
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.
[...]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.
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.
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:
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
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.
[...]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.
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.
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.
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.
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.
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.
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.
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